axeljaeger
10-11-2002, 11:28
Ich hab eine Funktion zum Umrechnen von HSV in RGB-Farben aus einer Internetquelle abgeschrieben.
Leider funktioniert die Funktion nicht wie sie sollte, es kommt, egal was man an Werten übergibt,
immer ein Schneeweis und nicht etwa Himmelblau bei glHSVColor4f(180.0f, 1.0f, 1.0f, 1.0f) raus.
Der Computer scheint den Inhalt von s im Laufe der Methode zu vergessen, siehe dazu Kommentare im Quelltext
void Visual::glHSVColor4f(float h, float s, float v, float a)
{
// Hier ist s noch 1.0
float r, g, b;
float f,p,q,t;
int k;
if(s = 0.0)
{
r = g = b = v; // Achromatic case (Schwarz-Weiß)
}
else
{
if (h == 360.0)
h = 0.0;
h = h / 60.0;
k = (int)h;
f = h - (float)k;
// Hier ist s 0 und nicht 0.0, wie es sich für einen float gehört,
// wenn man über iostream ausgibt
p = v * (1.0 - s); // s = 0, also ist p = 1.0
q = v * (1.0 - (s * f)); // s * f = 0, also ist q = 1.0f;
t = v * (1.0 - (s * (1.0 - f))); // t ist auch 1
switch(k) {
case 0: r = v; g = t, b = p; break;
case 1: r = q; g = v; b = p; break;
case 2: r = p; g = v; b = t; break;
case 3: r = p; g = q; b = v; break;
case 4: r = t; g = p; b = v; break;
case 5: r = v; g = p; b = q; break;
}
}
glColor4f(r,g,b,a);
}
Leider funktioniert die Funktion nicht wie sie sollte, es kommt, egal was man an Werten übergibt,
immer ein Schneeweis und nicht etwa Himmelblau bei glHSVColor4f(180.0f, 1.0f, 1.0f, 1.0f) raus.
Der Computer scheint den Inhalt von s im Laufe der Methode zu vergessen, siehe dazu Kommentare im Quelltext
void Visual::glHSVColor4f(float h, float s, float v, float a)
{
// Hier ist s noch 1.0
float r, g, b;
float f,p,q,t;
int k;
if(s = 0.0)
{
r = g = b = v; // Achromatic case (Schwarz-Weiß)
}
else
{
if (h == 360.0)
h = 0.0;
h = h / 60.0;
k = (int)h;
f = h - (float)k;
// Hier ist s 0 und nicht 0.0, wie es sich für einen float gehört,
// wenn man über iostream ausgibt
p = v * (1.0 - s); // s = 0, also ist p = 1.0
q = v * (1.0 - (s * f)); // s * f = 0, also ist q = 1.0f;
t = v * (1.0 - (s * (1.0 - f))); // t ist auch 1
switch(k) {
case 0: r = v; g = t, b = p; break;
case 1: r = q; g = v; b = p; break;
case 2: r = p; g = v; b = t; break;
case 3: r = p; g = q; b = v; break;
case 4: r = t; g = p; b = v; break;
case 5: r = v; g = p; b = q; break;
}
}
glColor4f(r,g,b,a);
}