3

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

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

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

4

2 回答 2

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 轻松完成 0..360 N 步中的度数。这为您提供了一个包含 N (U/V) 元组的数组。

使用令人眼花缭乱的 Y (ca. 0.5),您可以像上面一样计算 RGB 值,从而得到 N (R/G/B) 元组的数组。

于 2012-05-24T04:51:05.900 回答
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 并截断小数来转换为整数。

于 2012-05-24T04:52:48.297 回答