Algorithm 根据计数均匀分布的颜色范围

Algorithm 根据计数均匀分布的颜色范围,algorithm,colors,distribution,Algorithm,Colors,Distribution,我有一个图例,我需要进行颜色协调,并且几乎有无限的颜色范围(50-100个标识符的范围是无限的)。我希望像彩虹一样使用颜色光谱,并根据图例中的项目数均匀分布颜色。例如 我有池A、池B和池C,希望它们能通过颜色区分开来。A是红色的,B是橙色的,C是绿色的,等等。我想用从000000到FFFFFF的十六进制颜色代码动态地计算出来。所以我的池会在这个范围内均匀地选择三种颜色。如果我有10个池,它会均匀地选择10种颜色,依此类推。w这是最好的算法吗 这将在javascript中完成,但希望在SASS中完

我有一个图例,我需要进行颜色协调,并且几乎有无限的颜色范围(50-100个标识符的范围是无限的)。我希望像彩虹一样使用颜色光谱,并根据图例中的项目数均匀分布颜色。例如

我有池A、池B和池C,希望它们能通过颜色区分开来。A是红色的,B是橙色的,C是绿色的,等等。我想用从000000到FFFFFF的十六进制颜色代码动态地计算出来。所以我的池会在这个范围内均匀地选择三种颜色。如果我有10个池,它会均匀地选择10种颜色,依此类推。w这是最好的算法吗


这将在javascript中完成,但希望在SASS中完成。

我强烈建议让算法成为一个人:让熟悉该行业的人为您选择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是亮度

因此,您可以在U/V平面中创建一个半径为
1
的圆,圆心位于
0/0
,并在其上标记N个点-这可以很容易地完成,U=cos(phi)、V=sin(phi)和phi以N步为0..360度。这将为您提供一个N(U/V)元组数组


使用一个令人眼花缭乱的Y(约为0.5),你可以像上面那样计算RGB值,得到一个N(R/G/B)元组数组。

不确定你到底在问什么,但这可能会有所帮助。它会将彩虹的颜色从w=0(红色)到w=1.0(紫色)。如果你想在N种颜色之间均匀地划分,我会这样做:

for(int i = 0; i<N; i++){
  colors[i] = spectrum(i/((double)(N-1)));
}
(inti=0;i1)w=1; 如果(w=380&&w<440){ R=-(w-440.)/(440-350.); G=0.0; B=1.0; } 否则如果(w>=440&&w<490){ R=0.0; G=(w-440.)/(490-440.); B=1.0; } 否则,如果(w>=490&&w<510){ R=0.0; G=1.0; B=(510-w)/(510-490.); } 否则,如果(w>=510&&w<580){ R=(w-510.)/(580-510.); G=1.0; B=0.0; } 否则,如果(w>=580&&w<645){ R=1.0; G=-(w-645.)/(645-580.); B=0.0; }
否则如果(w>=645&&w不幸的是,该链接现在已失效。我恢复了链接如果y=.5,V=1,那么R>1.0,这有什么意义?@sw\u buddy电视的颜色模型允许不可能的颜色(并且不代表其他颜色)。不幸的是,这是一个古老的遗产,至今仍困扰着我们,因为计算机显示器通常采用电视颜色模型,原因显而易见。如果任何RGB值高于1或低于0,您当然需要对其进行剪裁。
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);

}