CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Miksowanie kolorów

Miksowanie kolorów

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Miksowanie kolorów

Nowy postprzez Pioter » sobota, 14 maja 2011, 09:28

CZESC!
Moze mi ktos pomoc/podpowiedziec jak zrobic program
program prezentujacy to.7z
? Chce zrobic cos podobnego, jednak nie mam zrodla. to chyba ma cos wspolnego z algorytmatmi genetycznymi, kolejne kolory są 'potomkami' tych nadrzednych

w programie mozna wybrac dwa kolory, kliknac na nie(jaki uzyc tu komponent by przypisac kolor do buttona?) a pozniej po wcisnieciu GENERUJ to dzieli kolor zapisany binarnie na dwie czesci i łączy na krzyz ze sobą (tu koloruje czcionke by pokazac to lepiej)
KOLOR 1 = [1234 | 5678]
KOLOR 2 = [4578 | 1743]

po wcisnieciu przycisku GENERUJ mialo by wykonac taką operacja
[1234 | 1743 ]
[4578 |5678]

moge prosic jakies rady?
pozdrawiam, p
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Pioter
Bladawiec
Bladawiec
 
Posty: 1
Dołączył(a): sobota, 14 maja 2011, 09:12
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: borland
Gadu Gadu: 0
    Windows 7Firefox

Re: Miksowanie kolorów

Nowy postprzez Cyfrowy Baron » sobota, 14 maja 2011, 18:07

Zadajesz pytania tak, że nie wiadomo o co Tobie chodzi. Jeżeli jednak chodzi o to co jest w załączniku, to mamy tam losowanie kolorów i wyświetlanie wyników nie na Button'ach lecz na Panel'ach. Jak wiadomo każdy kolor to składowa RGB, czyli Red, Green, Blue. Wartość każdej składowej zawiera się w przedziale od 0 do 255. Żeby wylosować kolor, wystarczy wylosować wartość każdej składowej z przedziału 0-255, i podstawić pod kolor, potem ustawić na ten kolor Panel.
Losowanie dla jednego obiektu typy TPanel może wyglądać tak:

KOD cpp:     UKRYJ  
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 Randomize(); /* uruchomienie generatora liczb losowych */
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 COLORREF cPanelColor = RGB( Random(255), Random(255), Random(255) );

 Panel1->ParentBackground = false;

 Panel1->Color = (TColor)cPanelColor;
}


To było dla jednego Panel-u, ale w programie mamy ich aż 64. Można by umieścić na formularzu tyle Panel-i, ale to mało oryginalne, dlatego ja posłużę się Panel-ami tworzonymi dynamicznie. Na etapie programowania ich nie będzie, ale zostaną rozmieszczone w chwili tworzenia aplikacji. W kodzie znajdzie się również zdarzenie OnClick, dla tych Panel-i. Teraz nie będzie do niczego potrzebne, ale przyda się w dalszych pracach nad programem:
Plik nagłówkowy np. Unit1.h
KOD cpp:     UKRYJ  
private:
        TPanel *Panel[64];

        void __fastcall PanelsClick(TObject *Sender);

        void CreatePanels(void);

        void RandomColors(void);
Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 Randomize();

 CreatePanels();
}
//---------------------------------------------------------------------------
void TForm1::CreatePanels(void)
{
 int col = 0, row = 0;

 for(int p = 0; p < 64; p++)
 {
   if( (p % 8) == 0 && p > 0) row++;

   Panel[p] = new TPanel(this);
   Panel[p]->Parent = this;
   Panel[p]->Name = "Panel" + (String)p;
   Panel[p]->Caption = "";
   Panel[p]->Tag = p;
   Panel[p]->OnClick = PanelsClick;
   Panel[p]->ParentBackground = false;
   Panel[p]->Width = 48;
   Panel[p]->Height = 48;
   Panel[p]->Top = (row * 52) + 8;
   Panel[p]->Left = (col * 52) + 8;


   col++;
   if( (col % 8) == 0 ) col = 0;
 }
}
//---------------------------------------------------------------------------
void TForm1::RandomColors(void)
{
 for(int p = 0; p < 64; p++)
 {
  COLORREF cPanelColor = RGB( Random(255), Random(255), Random(255) );

  if(Panel[p] != NULL) Panel[p]->Color = (TColor)cPanelColor;
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PanelsClick(TObject *Sender)
{
  ;/* do wykorzystania później */
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 RandomColors();
}
//---------------------------------------------------------------------------


Losowanie kolorów odbywa się w zdarzeniu OnClick przycisku Button1.



Teraz generowanie kolorów pośrednich, czyli miksowanie.

Pioter napisał(a):w programie mozna wybrac dwa kolory, kliknac na nie(jaki uzyc tu komponent by przypisac kolor do buttona?) a pozniej po wcisnieciu GENERUJ to dzieli kolor zapisany binarnie na dwie czesci i łączy na krzyz ze sobą (tu koloruje czcionke by pokazac to lepiej)
KOLOR 1 = [1234 | 5678]
KOLOR 2 = [4578 | 1743]

po wcisnieciu przycisku GENERUJ mialo by wykonac taką operacja
[1234 | 1743 ]
[4578 |5678]


Ten opis niestety nic nie mówi o sposobie miaszania. Nic z niego nie wynika. Po wybraniu dwóch kolorów (dwóch Panel-i) otrzymasz dwa kolory do mieszania. Każdy z tych kolorów będzie zbudowany z trzech składowych RGB, czyli np:

KOD text:     UKRYJ  
 Kolor 1:

 R1 = 125
 G1 = 26
 B1 = 78

 Kolor 2:

 R2 = 236
 G2 = 12
 B2 = 94

Trzeba mieszać, te składowe, ale według jakiego klucza chcesz to zrobić?

Ja w przykładzie wyciągnąłem średnią, ale to raczej nie to, czyli skorzystałem z takiego wzorca:

KOD text:     UKRYJ  
 Kolor 1:
 R1 = 125
 G1 = 26
 B1 = 78

 Kolor 2:
 R2 = 236
 G2 = 12
 B2 = 94

 Zakres losowanych kolorów:
 R3 = (R1 + R2) : 2
 G3 = (G1 + G2) : 2
 B3 = (B1 + B2) : 2

 Losowanie:
 R = Random(R3)
 G = Random(G3)
 B = Random(B3)


Co odpowiada Twojemu opisowi:

to dzieli kolor zapisany binarnie na dwie czesci i łączy


Z tym binarnie to już przegiąłeś... :D

Przy mieszaniu kolory muszą być ponownie losowane, ale tylko w pewnym zakresie, więc nie można ustalić jednego koloru na sztywno, tak jak Ty to podałeś, gdyż wtedy wszystkie Panel-e miałyby jeden kolor.

Plik nagłówkowy np. Unit1.h
KOD cpp:     UKRYJ  
private:
        TPanel *Panel[64];
        void __fastcall PanelsClick(TObject *Sender);

        void CreatePanels(void);
        void RandomColors(void);
        void GenerateColors(void);

        int iMemGen[2];
Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 Randomize();

 CreatePanels();
 RandomColors();
}
//---------------------------------------------------------------------------
void TForm1::CreatePanels(void)
{
 iMemGen[0] = -1;
 iMemGen[1] = -1;

 int col = 0, row = 0;

 for(int p = 0; p < 64; p++)
 {
   if( (p % 8) == 0 && p > 0) row++;

   Panel[p] = new TPanel(this);
   Panel[p]->Parent = this;
   Panel[p]->Name = "Panel" + (String)p;
   Panel[p]->Caption = "";
   Panel[p]->Tag = p;
   Panel[p]->OnClick = PanelsClick;
   Panel[p]->ParentBackground = false;
   Panel[p]->Width = 48;
   Panel[p]->Height = 48;
   Panel[p]->Top = (row * 52) + 8;
   Panel[p]->Left = (col * 52) + 8;


   col++;
   if( (col % 8) == 0 ) col = 0;
 }
}
//---------------------------------------------------------------------------
void TForm1::RandomColors(void)
{
 for(int p = 0; p < 64; p++)
 {
  COLORREF cPanelColor = RGB( Random(255), Random(255), Random(255) );

  if(Panel[p] != NULL) Panel[p]->Color = (TColor)cPanelColor;
 }
}
//---------------------------------------------------------------------------
void TForm1::GenerateColors(void)
{
 TColor cColor1 = Panel[iMemGen[0]]->Color;
 TColor cColor2 = Panel[iMemGen[1]]->Color;

 int R1, R2, G1, G2, B1, B2;

 R1 = GetRValue(cColor1);
 R2 = GetRValue(cColor2);

 G1 = GetGValue(cColor1);
 G2 = GetGValue(cColor2);

 B1 = GetBValue(cColor1);
 B2 = GetBValue(cColor2);

 int R = (R1 + R2) / 2;
 int G = (G1 + G2) / 2;
 int B = (B1 + B2) / 2;

 for(int p = 0; p < 64; p++)
 {
  COLORREF cPanelColor = RGB( Random(R), Random(G), Random(B) );

  if(Panel[p] != NULL) Panel[p]->Color = (TColor)cPanelColor;
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PanelsClick(TObject *Sender)
{
 int iPGen = dynamic_cast<TPanel *>(Sender)->Tag;

 if(iMemGen[0] == iPGen)
 {
  Panel[iPGen]->BevelWidth = 1;
  iMemGen[0] = -1;
  Button2->Enabled = false;
  return;
 }

 if(iMemGen[1] == iPGen)
 {
  Panel[iPGen]->BevelWidth = 1;
  iMemGen[1] = -1;
  Button2->Enabled = false;
  return;
 }

   if( iMemGen[0] < 0 )
   {
         Panel[iPGen]->BevelWidth = 10;
         iMemGen[0] = iPGen;
   }
   else
   {
        if( iMemGen[1] < 0 )
        {
          Panel[iPGen]->BevelWidth = 10;
          iMemGen[1] = iPGen;
        }
   }

 if(iMemGen[0] >= 0 && iMemGen[1] >= 0) Button2->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 RandomColors();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 GenerateColors();
}



Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 9 gości

cron