RGB -> Position in Farbverlauf
-
hallo,
in meinem Programm zeichne ich in einen Farbverlauf ein Kreuz an die Stelle die man mit der Maus ausgewählt hat. Dort lese ich die RGB Werte aus und benutze sie weiter. Jetzt möchte ich, dass wenn sich die RGB Werte außerhalb des Farbverlaufs ändern, dass das Kreuz an die richtige Stelle versetzt wird und nicht an der alten Stelle verharrt. Ich dachte mir, dass ich von RGB auf xy zurückrechnen könnte, aber das ist nicht möglich, da es beim Berechnen von RGB am Ende 6 unterschiedliche Rechnungen sind ( if(...) else if(...) ... ). Hat jemand eine Idee, wie ich das umsetzen könnte? Hier noch ein Bild vom (HSV) Farbverlauf.
http://www.abload.de/img/farbverlauflg0w.jpg
greetz KN4CK3R
-
Wie wärs damit:
http://de.wikipedia.org/wiki/HSV-Farbraum#Umrechnung_RGB_in_HSVDen Sättigungswert (S) kannste wegwerfen, weil er in deinem Diagramm nur aufgehellte und abgedunkelte Reinfarben vorkommen.
geloescht
-
naja, ich möchte ja nicht den RGB Wert in HSV umrechnen, sondern die Position des RGB Wertes berechnen und zwar ohne die ganzen Schleifen durchgehen zu müssen und auf den RGB Wert zu vergleichen.
greetz KN4CK3R
-
Da dein Farbverlauf den HSV-Farbraum abbildet, ist eine Umrechnung der RGB-Eingabe in HSV eine gute Idee, weil du dann von H und V der Farbe auf x und y im Farbverlauf schließen kannst:
H = 0 ist ganz links, H = 100 ist ganz rechts; V = 0 ist ganz unten, V = 100 ganz oben.Dreimal editiert und immer noch falsch... deshalb: Ohne Gewähr.
-
ah, ok, stimmt auch wieder. Werd mich mal dransetzen.
greetz KN4CK3R
-
also ich hab das mal probiert, aber irgendwie stimmt die Y Koordinate nicht ganz, X passt so wie es ist. Ich nehme an, dass der Faktor durch den ich bei der Y Rechnung dividiere zu niedrig ist. Hier mal meine Rechnung:
int r = ...; int g = ...; int b = ...; double max = b; if(max < g) max = g; if(max < r) max = r; double min = b; if(min > g) min = g; if(min > r) min = r; double delta = max - min; double H = 0, S = 0, V = max; if(delta == 0) S = H = 0; else { S = delta / max; double dR = 60*(max - r)/delta + 180; double dG = 60*(max - g)/delta + 180; double dB = 60*(max - b)/delta + 180; if(r == max) H = dB - dG; else if(g == max) H = 120 + dR - dB; else H = 240 + dG - dR; } if(H < 0) H += 360; else if(H >= 360) H -= 360; int x = H*(width/360.0f); int y = height-(V*(height/360.0f));
Hier ein Bild von meinem Beispielprogramm:
http://www.abload.de/img/verlaufpos3b3v.jpgDas Kreuz müsste eigentlich 1-2cm weiter unten sein. An der Stelle wo es ist, ist B zwar 255, aber R und G nicht 0.
greetz KN4CK3R