一开始,我们在 RGB 中有两种颜色,还有一个数字,用于它们之间的中间颜色。方法必须返回具有所需颜色的数组。非常需要算法方面的帮助。
问问题
1730 次
2 回答
7
假设我们有 2 种颜色 (R1,G1,B1) (R2,G2,B2) 和 N 种中间颜色:
for i from 1 to N:
Ri = R1 + (R2-R1) * i / N
Bi = B1 + (B2-B1) * i / N
Gi = G1 + (G2-G1) * i / N
AddToArray(Ri,Gi,Bi)
那是你要找的吗?
PS:如果你想要更自然的颜色渐变,我建议使用 HSL 颜色空间而不是 RGB。
于 2012-06-23T22:09:16.507 回答
2
让您当前的 cR、cG 和 cB 值为 0%,并让 R、G 和 B 值为 100%,然后您只需迭代 i = 1 到 100,每次迭代添加 cRGB + i * (RGB - cRGB )。您不必使用 100 种中间色,您可以使用其中的 N 种。
function(currentColor, desiredColor, N) {
var colors = [],
cR = currentColor.R,
cG = currentColor.G,
cB = currentColor.B,
dR = desiredColor.R - cR,
dG = desiredColor.G - cG,
dB = desiredColor.B - cB;
for(var i = 1; i <= N; i++) {
colors.push(new Color(cR + i * dR / N, cG + i * dG / N, cB + i * dB / N));
}
return colors;
}
然而,这不会给你很好的中间颜色。您应该做的第一件事是将颜色转换为 HSV 或类似的色彩空间,其中强度与色调和饱和度是分开的。这将为您提供更好的中间颜色。http://en.wikipedia.org/wiki/HSL_and_HSV
为此,首先将颜色转换为 HSV,然后运行与上述相同的算法,但使用 HS 和 V 而不是 RGB,但请记住 S 和 V 的最小值为 0,最大值为 1,而 H 表示在 0 到 360 之间的度数。如果您希望 H 尽快从当前颜色变为目标颜色,则可能必须对 H 执行某些操作,例如如果 cH = 10 和 dH = 50,则从 10 -> 50 是最短,但如果 cH = 10 且 dH = 350,则从 10 -> -10(与 350 度相同)变短。
于 2012-06-23T22:24:50.577 回答