Colors 生成n色彩虹调色板

Colors 生成n色彩虹调色板,colors,processing,rgb,color-palette,hsb,Colors,Processing,Rgb,Color Palette,Hsb,我正试图用()生成一个具有15种不同颜色的彩虹: 大小(360100); 彩色模式(HSB,360100100);//[0,360]中的色调(度), //饱和度/亮度(单位:0,100) //就像在Photoshop中一样 仰泳(); 对于(int i=0;i

我正试图用()生成一个具有15种不同颜色的彩虹:

大小(360100);
彩色模式(HSB,360100100);//[0,360]中的色调(度),
//饱和度/亮度(单位:0,100)
//就像在Photoshop中一样
仰泳();
对于(int i=0;i<15;i++)
{
填充(i*24100100);/24*15=360
rect(i*24,0,25,100);
}
但它并没有产生丰富的15彩虹调色板,而是缺少了一些颜色(例如鲜艳的黄色)


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

要了解发生了什么,请尝试创建一个程序,为每个值0-360显示一行:

大小(360100);
彩色模式(HSB,360,100,100);
仰泳();
对于(int i=0;i<360;i++)
{
填充(i、100、100);
rect(i,0,1100);
}
您将看到:

请注意,“鲜艳的黄色”条带比绿色或蓝色条带窄得多。这就是为什么简单地对每个X值进行采样不会生成黄色

黄色大约为值
60
,因此您可以修改增量,使其落在60上。绘制12个宽度为30的矩形可以让您在黄色区域着陆:

大小(360100);
彩色模式(HSB,360,100,100);
仰泳();
对于(int i=0;i<360;i++)
{
填充(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};
规模(360100);
彩色模式(HSB,360,100,100);
仰泳();
for(int index=0;index

我创建了一个函数,可以生成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;
    }


   
列表生成器InbowPalette(int numColor)
{
var toRet=新列表();
var n=(浮点)numColors;
对于(var i=0;i