【问题标题】:Evenly Distributed Color Range Depending On A Count根据计数均匀分布的颜色范围
【发布时间】:2012-05-24 04:26:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: algorithm colors distribution


    【解决方案1】:

    我强烈建议让算法成为一个人:让懂行的人为你选择 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(ca.0.5),您可以像上面一样计算 RGB 值,从而生成一个包含 N (R/G/B) 元组的数组。

    【讨论】:

    • 不幸的是,该链接现已失效。
    • 我恢复了链接
    • 如果 y = .5,V = 1,然后 R > 1.0,这有什么意义?
    • @sw_buddy 电视的颜色模型确实允许不可能的颜色(并且不代表其他颜色)。不幸的是,这是旧时代的遗产,至今仍困扰着我们,因为出于显而易见的原因,计算机显示器通常遵循电视色彩模型。如果任何 RGB 值大于 1 或小于 0,您当然需要裁剪它们。
    【解决方案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 并截断小数来转换为整数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      • 2011-07-16
      • 2021-05-16
      • 1970-01-01
      • 2014-01-22
      • 2014-01-01
      • 2022-08-19
      相关资源
      最近更新 更多