题
让我们考虑以下场景:一个可以生成从白色到红色、从白色到蓝色、从白色到粉色、从白色到橙色等代码颜色的函数。
颜色代码采用 RGB 格式,值从 0 到 255。
有任何想法吗?您能给我伪代码或此类算法的链接吗?
解决方案
这听起来像你线性插值之后 - 在你的情况下,从白色到插值指定的颜色。例如,在C#:
public IEnumerable<Color> Interpolate(Color from, Color to, int steps)
{
int range = steps-1; // Makes things a bit easier
for (int i=0; i < steps; i++)
{
// i is the proportion of the "to" colour to use.
// j is the proportion of the "from" colour to use.
int j = range - i;
int r = ((from.R * j) + (to.R * i)) / range;
int g = ((from.G * j) + (to.G * i)) / range;
int b = ((from.B * j) + (to.B * i)) / range;
yield return new Color(r, g, b);
}
}
当然也有做它除了线性插值的其他方式,但是这可能是最简单的。请注意,这得到棘手,如果你有很多的步骤或更大的值,因为你需要考虑溢出的可能性。在这种情况下,你应该没问题,虽然 - 你不可能要超过256个步骤,最大值为255,这样你就不会得到接近int
s的限制
编辑:由于在注释中指出的那样,RGB可能不是在其中使用线性内插的最佳域。你可能是最好关闭从/转换为RGB值到 HSL或HSV ,做插值上那些。这可能是简单的或棘手根据您的平台。如果你不提供他们在前面的句子维基百科的链接给出了相应的计算公式。
其他提示
算法:
- 查找白色的 RGB 值
- 找到其他颜色的 RGB 值(例如您提到红色、蓝色、粉色、橙色)
- 计算 RGB 分量在算术上介于两个极值的 RGB 分量之间的 RGB 值
例如,如果一个极值是 (0,0,0),另一个极值是 (0,255,255),则这两种颜色之间的中间值为 (0,128,128) ...这两个值之间四分之一的值是 (0,64,64)。
与要之间梯度两种颜色开始,和在R,G和B份他们分开。
决定你要多少“步”褪色通过。
除以与步数的R,G和B部分之间的差。您现在有一个“阶梯差”为每个颜色。
通过每个步骤环路和对于每次迭代添加一次的台阶差的颜色值。回合整数的你做的最后一个的事情。
你想要什么颜色更改为?白色到红将只是用255 255 255开始和递减后两个直到你有的情况下255 0 0蓝色。将保持最后的值和递减与0 0 255到结束,等
不隶属于 StackOverflow