我有一个传奇,我需要颜色协调,并且有几乎无限的颜色范围(在50-100个标识符方面无限。我想使用彩色光谱像彩虹一样均匀分布颜色图例中的项目数。例如。
我有游泳池A,B和C,并希望它们能够通过颜色区分。 A是红色,B是橙色,C是绿色等。我想动态地使用从000000到FFFFFF的十六进制颜色代码计算出来。所以我的泳池会在该范围内均匀地挑选三种颜色。如果我有10个泳池,它会均匀地挑选10种颜色,依此类推。这样做的最佳算法是什么?
这将在javascript中完成,但我很乐意在SASS中完成。
答案 0 :(得分:6)
我强烈建议让算法成为一个人:让某人知道交易,为你选择100种颜色(首先是最令人愉悦的),使用它作为静态数组并使用索引0 ...... N-1。
说:常见的算法是使用PAL / NTSC颜色模型:
R=Y+V/0.88
G=Y-0.38*U-0.58*V
B=Y+U/0.49
U / V是颜色的坐标,Y是亮度。
所以你创建了一个半径为1
的圆,其中心位于U / V平面的0/0
并在其上标记了N个点 - 这可以通过U = cos(phi)轻松完成, V = sin(phi)和phi以N步进入0..360度。这给你一个N(U / V)元组的数组。
使用引人注目的Y(ca。0.5
),你可以像上面一样计算RGB值,从而产生一个N(R / G / B)元组数组。
答案 1 :(得分:2)
不确定您要问的是什么,但这可能会有所帮助。它从w = 0(红色)到w = 1.0(紫色)吐出彩虹色。如果你想在N种颜色之间平均分配,我会这样做:
for(int i = 0; i<N; i++){
colors[i] = spectrum(i/((double)(N-1)));
}
使用此方法:
public Color spectrum(double w) {
if (w>1)w=1;
if (w<0)w=0;
w=w*(645-380)+380;
double R,B,G;
if (w >= 380 && w < 440){
R = -(w - 440.) /(440. - 350.);
G = 0.0;
B = 1.0;
}
else if (w >= 440 && w < 490){
R = 0.0;
G = (w - 440.) /(490. - 440.);
B = 1.0;
}
else if (w >= 490 && w < 510){
R = 0.0;
G = 1.0;
B = (510-w) /(510. - 490.);
}
else if (w >= 510 && w < 580){
R = (w - 510.) /(580. - 510.);
G = 1.0;
B = 0.0;
}
else if (w >= 580 && w < 645){
R = 1.0;
G = -(w - 645.) /(645. - 580.);
B = 0.0;
}
else if (w >= 645 && w <= 780){
R = 1.0;
G = 0.0;
B = 0.0;
}
else{
R = 0.0;
G = 0.0;
B = 0.0;
}
return new Color(R,G,B);
}
抱歉,它不是在javascript中。我对Java更加流利。那里的数字映射到纳米波长,所以它对各种东西都很有用。 R,G,B值当然可以通过乘以255并截断小数来转换为整数。