Jeg kunne ikke slippe det helt ...
For at finde r, g og b's inbyrdes forhold ud fra en Hue værdi, tror jeg det er nemmest at lave en tabel.
Ikke helt Delphi, men det kan nok nemt laves om:
byte hueTable = new byte[361][3];
denne tabel fyldes ud for hver af de 3 dimensioner .. rød [0], gul [1] og blå [2].
Hver position vil så ud for hue index og farve index give styrken på den farve man kikker efter. Fra 0 til 120 i dette eksempel, simpelthen fordi vi bruger grunddefinitionen pås Hue's 360 grader til at dele ind med.
Lav følgende initiering for hver farve:
Rød [0]
index: 0 - 120 - 240 -360
styrke: 120 - 0 - 0 - 120
Gul [1]
index: 0 - 120 - 240 -360
styrke: 0 - 120 - 0 - 0
Blå [2]
index: 0 - 120 - - 240 - 360
styrke: 0 - 0 - 120 - 0
Dette er angivet med forløb, både i index og styrke.
Dvs . f.eks skal index 0 til 120, med subindex 0 (rød) have værdierne fra 120 til 0 (120,119,118,117 ...)
Så har du en Hue på 240, finder du r, g og b sådan her:
r = hueTable[240][0];
g = hueTable[240][1];
b = hueTable[240][2];
De 240 er naturligvis din aktuelle hue værdi, og ikke 240 hardcoded.
Så har de hver fra 0 til 120, og du kan smide Saturation på ved at gange med 255 (hvis det er din max Saturation værdi) og dividere med Saturation værdien ... hvis den så er max vil de være uændrede og hvis ikke vil de blive mindre i takt med Saturation.
Den sidste, Value, skal du få den højeste af din r,g og b til at blive lig med.
Det gør du ved at finde ud af hvor meget du skal gange den største af r,g eller b med for at det bliver det samme som Value.
Når det tal er fundet gange du hvert enelt med dette.
Så hvis Value er lille bliver r,g og b små .. er den står bliver de større, men ikek over 255 (eller hvad din max for Value skal være).
Håber det hjælper lidt med arbejdet hvis du ville implementere det selv, og ikke blot ledte efter et library