PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Farbverläufe in Array zeichnen


mekakic
2008-10-17, 06:52:05
Hi,

vielleicht ist die Frage überflüssig, aber ich habe einen Array, der als Farbbuffer für 8bit-RGB Werte dient (unsigned char rgb[1024*768*3]). Ich möchte dort sich diverse periodisch ändernde Farbverläufe reinmalen, was ist mir eigentlich fast egal, da muß nur Action drin sein und über alle Farben gehen.

Aktuell laufe ich mir einer for schleife durch den Arraym, bestimme für jeden Pixel seine drei hintereinanderliegenen Komponenten und nach diversen Vergleichen und relativen Operationen landet dann da was drin, was vergleichsweise langweilig aussieht, aber okay ist und funktioniert.

Gibt es vielleicht irgendwelche Operationen oder Algorithmen, wo man so was relativ einfach erzeugen kann - also vielleicht etwas, daß mit wenigen aber geschickten memset/memcpy Operationen auskommt und Action in den Bildpuffer bringt?

danke

pest
2008-10-17, 10:32:08
du kannst den Farbwert abhängig von einer Funktion (z.B. Sin/Cos tabelliert) machen, das schaut nett aus

Gast
2008-10-17, 14:06:03
ein Inteferenzmuster:

// erste Quelle
int source1_x = 200;
int source1_y = 300;
// zweite Quelle
int source2_x = 700;
int source2_y = 500;
// Wellenzahl (2pi / Wellenlänge)
double waveCount = 0.2;
for (int x = 0; x < 1024; x++)
{
for (int y = 0; y < 768; y++)
{
// Entfernung zu den Quellen
double dist_source1 = sqr(x - source1_x) + sqr(y - source1_y);
double dist_source2 = sqr(x - source2_x) + sqr(y - source2_y);
// aktueller Helligkeitswert (zwischen 0 und 1)
double value = 0.5 * ( sin( waveCount * dist_source1 ) + sin( waveCount * dist_source2 ) );
// in Rot-Anteil stecken
array[ (x*768 + y) * 3 ] = (int) ( 128 * value );
}
}

Soll das Muster nicht nur rot sein, die letzte Anweisung entsprechend modifizieren. Und nicht vergessen, eine Quadrierungsroutine sqr(x) zu implementieren.