2013-08-28 58 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