均匀分布的颜色范围取决于计数

时间:2012-05-24 04:26:41

标签: algorithm colors distribution

我有一个传奇,我需要颜色协调,并且有几乎无限的颜色范围(在50-100个标识符方面无限。我想使用彩色光谱像彩虹一样均匀分布颜色图例中的项目数。例如。

我有游泳池A,B和C,并希望它们能够通过颜色区分。 A是红色,B是橙色,C是绿色等。我想动态地使用从000000到FFFFFF的十六进制颜色代码计算出来。所以我的泳池会在该范围内均匀地挑选三种颜色。如果我有10个泳池,它会均匀地挑选10种颜色,依此类推。这样做的最佳算法是什么?

这将在javascript中完成,但我很乐意在SASS中完成。

2 个答案:

答案 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并截断小数来转换为整数。