我要做的是用彩虹渐变填充数组。该数组应该包含256个填充了十六进制颜色值的条目。
像:
array[0] = 0xFF0000 //red
...
array[85] = 0xFFA200 //orange
...
array[170] = 0x00AF0F //green
...
array[255] = 0xAE00FF //purple
因为我不想“手动”将所有256种颜色分配给数组我正在寻找动态方法。它不一定需要是上面显示的ranbow。图片仅供演示之用。
有什么建议如何在(最好)短代码片段中做这样的事情,避免一些嵌套的for循环?
答案 0 :(得分:1)
执行所需操作的一种方法是从开始到结束值插入每种组件颜色(RGB)。这意味着使用尽可能相同大小的步骤。
要获得RGB组件,必须进行一些位操作。此代码为您提供了完整声明的颜色fullColour
的三种成分颜色:
std::array<float, 3> colourRGB;
for(unsigned i = 0; i<3; ++i) {
colourRGB[i] = (fullColour & (0xFF << (i*8))) >> (i*8);
您可以使用它来获取开始和结束颜色的RGB数组(例如,对于示例中的红橙色范围,这将是0xFF0000
和0xFFA200
的RGB细分。然后,对于每个组件,您可以计算出“淡出”中每个步骤所需的步长。这是由该组件的总变化除以步骤总数得出的。对于红橙示例,红色分量的步长因此为1.91(因为您有86步并且总变化为(0xA2
- 0x00
,或者是十进制的162,产生162/86 = 1.91)。其他组件的步长为零,因为它们不会改变。
然后,您可以迭代这些步骤,在每个步骤中添加另一个步长并进行舍入以获得每个组件的新值。例如,在步骤s
:
red[s] = startingRed + ((float)s * stepSizeRed)
要将rgb值重新组合成一个完整的颜色,只需再次应用一些位操作:
fullColour[s] = 0;
for(unsigned i=0; i<3; ++i)
fullColour[s] += rgbComponent[s][i] << (i*8);
这种方法可以产生所需的“淡化”效果。从任何开始到任何结束颜色的任何数量的步骤。
答案 1 :(得分:1)
你想从红色变为黄色
接下来,黄色到绿色
接下来,绿色到浅蓝色
接下来,浅蓝色到深蓝色
接下来,深蓝色到紫色
然后回到红色。
在每次传递中,其中一种颜色为零,另一种颜色为255,而最后一种颜色增加或减少。换句话说:
255,0,0 -> 255,255,0 -> 0,255,0 -> 0,255,255 -> 0,0,255 -> 255,0,255 -> 255,0,0
可以使用以下代码完成此操作,其中色调的范围介于0.0f
到1.0f
unsigned int rgb(double hue)
{
int h = int(hue * 256 * 6);
int x = h % 0x100;
int r = 0, g = 0, b = 0;
switch (h / 256)
{
case 0: r = 255; g = x; break;
case 1: g = 255; r = 255 - x; break;
case 2: g = 255; b = x; break;
case 3: b = 255; g = 255 - x; break;
case 4: b = 255; r = x; break;
case 5: r = 255; b = 255 - x; break;
}
return r + (g << 8) + (b << 16);
}
用法:
double range = 500;
for (double i = 0; i < range; i++)
{
unsigned int color = rgb(i / range);
...
}
输出: