2013-08-28 142 views
0

假設我有一個隨機的RGB值,如240 23 123.好嗎? 所以我想要轉換HSV中的RGB值,並且我需要RGB顏色正好處於漸變的中間。所有其他的漸變值都應該有更多的飽和度或更少。 理想情況下,漸變應該始終趨向於白色,而與初始RGB值無關。 有沒有一個公式或算法來實現這一目標? 結果應該是1個梯度的HSV值數組。獲取給定顏色的漸變,其中顏色位於漸變的中間

+0

大多數語言有一個可用的色彩空間映射算法已經,有時在他們的STDLIB。我建議使用那些/那些。 –

+0

色彩空間映射。不知道你在說什麼。這對我來說是一個新詞,色彩空間映射。我正在使用2D遊戲引擎。我的問題基本上是隨機的RGB值有一個不同的S,它可能在0到100之間變化,而90的S不完全在範圍的中間,所以我可以得到不超過20個值的結果數組,傾向於白色但有時變爲灰色。 –

+0

理想情況下,也應該涉及V,但如何用S插入它我不知道。 –

回答

1

如果您希望漸變以白色開始,轉到您的顏色,然後轉到黑色,可以採用多種方法。這裏有一種方法:

const int numEntries = 20; 
const int halfNumEntries = numEntries/2; 
RGBColor gradient[numEntries]; 
HSVColor hsv = RGBToHSV (rgb); // Where rgb is the RGB color you start with 

// Gradient from white to your color 
for (int i = 0; i < halfNumEntries; i++) 
{ 
    float newHue = hsv.hue; 
    float newSat = (i/halfNumEntries) * hsv.sat; 
    float newVal = 1.0 + (i/halfNumEntries) * (hsv.val - 1.0); 
    gradient [ i ] = HSVToRGB (newHue, newSat, newVal); 
} 

gradient [ halfNumEntries ] = rgb; 

// Gradient from your color to black 
for (int i = (halfNumEntries + 1); i < numEntries; i++) 
{ 
    float newHue = hsv.hue; 
    float newSat = hsv.sat + ((i - halfNumEntries)/(halfNumEntries - 1)) * (0.0 - hsv.sat); 
    float newVal = hsv.val + ((i - halfNumEntries)/(halfNumEntries - 1)) * (0.0 - hsv.val); 
    gradient [ i ] = HSVToRGB (newHue, newSat, newVal); 
} 
+0

i/10.0代表什麼?什麼是10.0。如果我想增加每個漸變的顏色數量? –

+0

10是條目數量的一半。 I/10是你在梯度的前半部分(或後半部分)有多遠。我已經更新了代碼,以便更清楚。 – user1118321