生成一个n种颜色的彩虹调色板。

6
我正在尝试使用以下可运行代码生成15种不同颜色的彩虹:( 运行代码 )。
size(360,100);
colorMode(HSB, 360, 100, 100); // Hue in degrees in [0, 360],
                               // saturation/brightness in [0, 100]
                               // like in Photoshop
noStroke();

for (int i = 0; i < 15; i++)   
{
    fill(i*24, 100, 100);      // 24*15 = 360
    rect(i*24, 0, 25, 100);
}

但是它不能产生一个丰富的15种彩虹色调色板,某些颜色缺失(例如鲜艳的黄色)。

enter image description here

是否有一个众所周知的算法来生成鲜艳的彩虹色调色板?

2个回答

7
要了解发生了什么,请创建一个程序,每个值0-360显示一条线:
size(360,100);
colorMode(HSB, 360, 100, 100);                                         
noStroke();
for (int i = 0; i < 360; i++)   
{
    fill(i, 100, 100);
    rect(i, 0, 1, 100);
}

您将看到这个界面:

color gradient

请注意,“生动的黄色”带比绿色或蓝色带要窄得多。这就是为什么仅仅采样每X个值并不能生成黄色的原因。
黄色在数值约为60左右,因此您可以修改增量以使其落在60上。使用宽度为30的12个矩形绘制,可以使您落在黄色区域:
size(360,100);
colorMode(HSB, 360, 100, 100);                                         
noStroke();
for (int i = 0; i < 360; i++)   
{
    fill(i*30, 100, 100);
    rect(i*30, 0, 30, 100);
}

黄色渐变色

或者您可以提前确定所需的值,并将它们放入数组中,而不是使用均匀分布:

int[] hueValues = {0, 15, 30, 60, 90, 120, 150, 180, 210, 225, 240, 270, 300, 330, 360};

size(360,100);
colorMode(HSB, 360, 100, 100);                                         
noStroke();
for (int index = 0; index < hueValues.length; index++)   
{
    float rectWidth = width/hueValues.length;
    fill(hueValues[index], 100, 100);
    rect(index*rectWidth, 0, rectWidth, height);
}

array color gradient


1
我创建了一个生成N种颜色(彩虹)并输出字符串列表(十六进制值)的函数。这是用C#编写的,但逻辑可以转换。为了理解正在发生的事情,我绘制了红、蓝和绿值与n的图形。通过这样做,您将看到三个图形都是分段函数,并在n=0、n=1/4、n=1/2和n=3/4处具有感兴趣的点。
    List<string> GenerateRainbowPalette(int numColors)
    {
        var toRet = new List<SKColor>();
        var n = (float)numColors;
        for(var i = 0; i< numColors; i++)
        {
            int red = 255;
            int green = 0;
            int blue = 0;
            //red: (first quarter)
            if (i <= n / 4)
            {
                red = 255;
                green = (int)(255 / (n / 4) * i);
                blue = 0;
            }
            else if (i <= n / 2)  //2nd quarter
            {
                red = (int)((-255)/(n/4)*i + 255 * 2);
                green = 255;
                blue = 0;
            }
            else if (i <= (.75)*n)
            { // 3rd quarter
                red = 0;
                green = 255;
                blue = (int)(255 / (n / 4) * i + (-255 * 2));
            }
            else if(i > (.75)*n)
            {
                red = 0;
                green = (int)(-255 * i / (n / 4) + (255 * 4));
                blue = 255;
            }

            //generate hex string:
            var redHex = red.ToString("X2");
            var greenHex = green.ToString("X2");
            var blueHex = blue.ToString("X2");

            var color = $"#{redHex}{greenHex}{blueHex}";
        
         
            toRet.Add(color);
        }
        return toRet;
    }


   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接