Farbverlauf



  • Hallo zusammen!
    Ich benötige für ein Programm einen "flüssigen" Farbverlauf als testprogramm hab ich folgendes geschrieben

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    for (int a = 0; a < 960; a++)
    {
    for (int b = 0; b < 105; b++)
    PaintBox1->Canvas->Pixels[b][a] = a;
    }
    }
    

    leider gibt es so gleich mehrere Verläufe und jedesmal von ganz schwarz bis rot (also FF0000) und dann gibt es einen "Bruch" doch gerade soetwas will ich vermeiden!!
    Wist ihr wie ich des besser machen könnte???
    MfG Straightflush



  • Hallo

    wie soll denn dein Farbverlauf aussehen? Von welcher Farbe zu welcher?

    bis bald
    akari



  • hauptsache flüssig! Am besten natürlich wie nen Regenbogen also wie des gesamte Spektrum



  • Hallo

    Das ist nur eine Frage des richtigen Iterierens im richtigen Bereich.
    Eine Farbe besteht aus einen Rot-,einem Grün- und einem Blauanteil im Bereich von 0-256. Diese Grundfarben werden dann gemischt.
    Zum Mischen kannst du das WinAPI-Makro RGB nehmen

    for (int a = 0; a < 256; a++)
      {
        for (int b = 0; b < 105; b++)
          PaintBox1->Canvas->Pixels[a][b] = RGB(a,0,0);
        }
    

    Um einen Regenbogenverlauf hinzubekommen, must du jede einzelne enthalte Farbe nacheinander hintereinander übergehen lassen.

    bis bald
    akari



  • Also ich hab des ganze jetzt folgendermaßen gelöst, das programm beginnt bei schwarz und und wechselt dann auf "ewig" im bunten durch...

    while (farbencount > 1785) farbencount = farbencount - 1530;
             if (farbencount <=255)
             PaintBox1->Canvas->Pixels
             [(Xpixels - Xstart) * (1/g)][(Ypixels - Ystart) * (1/g)]
             = RGB(farbencount,0,0);
             if ((farbencount > 255) && (farbencount <= 510))
              PaintBox1->Canvas->Pixels
             [(Xpixels - Xstart) * (1/g)][(Ypixels - Ystart) * (1/g)]
             = RGB(255,0,farbencount-255);
               if ((farbencount > 510) && (farbencount <= 765))
              PaintBox1->Canvas->Pixels
             [(Xpixels - Xstart) * (1/g)][(Ypixels - Ystart) * (1/g)]
             = RGB(765-farbencount,0,255);
              if ((farbencount > 765) && (farbencount <= 1020))
              PaintBox1->Canvas->Pixels
             [(Xpixels - Xstart) * (1/g)][(Ypixels - Ystart) * (1/g)]
             = RGB(0,farbencount-765,255);
              if ((farbencount > 1020) && (farbencount <= 1275))
              PaintBox1->Canvas->Pixels
             [(Xpixels - Xstart) * (1/g)][(Ypixels - Ystart) * (1/g)]
             = RGB(0,255,1275-farbencount);
              if ((farbencount > 1275) && (farbencount <= 1530))
              PaintBox1->Canvas->Pixels
             [(Xpixels - Xstart) * (1/g)][(Ypixels - Ystart) * (1/g)]
             = RGB(farbencount-1275,255,0);
             if ((farbencount > 1530) && (farbencount <= 1785))
              PaintBox1->Canvas->Pixels
             [(Xpixels - Xstart) * (1/g)][(Ypixels - Ystart) * (1/g)]
             = RGB(255,1785-farbencount,0);
    

    wie könnte ich diesen Teil einfacher/schneller machen??



  • Der Zugriff auf Canvas->Pixels[][] ist grundsätzlich langsam.
    Du kannst es über die Eigenschaft Scanline versuchen. Und zusätzlich erst zeichnen und dann ausgeben. Also erst in ein Bitmap schreiben und dann das gesamte Bitmap an die Paintbox zuweisen.

    Grüße Joe_M.


Anmelden zum Antworten