Algorithm 以未知颜色集合大小生成视觉上不同的颜色

Algorithm 以未知颜色集合大小生成视觉上不同的颜色,algorithm,language-agnostic,colors,Algorithm,Language Agnostic,Colors,我正在尝试为图表控件动态生成颜色。我希望颜色在视觉上与众不同。我不仅希望颜色与相邻的颜色不同,而且希望到目前为止生成的所有颜色都不同 我也不想有一个已知的颜色集合大小。我看到的一些算法需要知道颜色的数量。我想为我的颜色生成器实现一个GetNextColor(),这样在选择最终拥有多少颜色时我就不知道了,而且在前面选择一个数字感觉是错误的 我不只是试图用不同的颜色来描绘一堆东西,我对这个问题很感兴趣,希望得到一些反馈 这就是我所处的位置: 使用HSV颜色空间 色调是[0-360]中的值,其中0

我正在尝试为图表控件动态生成颜色。我希望颜色在视觉上与众不同。我不仅希望颜色与相邻的颜色不同,而且希望到目前为止生成的所有颜色都不同

我也不想有一个已知的颜色集合大小。我看到的一些算法需要知道颜色的数量。我想为我的颜色生成器实现一个GetNextColor(),这样在选择最终拥有多少颜色时我就不知道了,而且在前面选择一个数字感觉是错误的

我不只是试图用不同的颜色来描绘一堆东西,我对这个问题很感兴趣,希望得到一些反馈

这就是我所处的位置:
  • 使用HSV颜色空间
  • 色调是[0-360]中的值,其中0 和360是一样的(略带红色)
  • 色相从0开始,I ad 27(因此 当它循环时,它不会降落在它开始时的同一颜色上 上),采取国防部360
  • 对于S和V(都在0和1之间),我从一个很低的数字开始,比如 .25
  • 穿过大约20种色调
  • 然后取一个高的数字,比如.85
  • 穿20种颜色
  • 然后开始平分以获得最远的距离 尚未使用的值
这不是一个非常有效的方法,它可以正常工作,但它可能非常有用 更科学。一开始是经过深思熟虑,然后 变成了这样的混乱

关于如何优雅地完成这项工作有什么想法吗?


(这没关系,但我用的是C#,当我回到我的电脑时,我会发布代码,我已经打开了所有这些东西。)

如果你线性映射整个颜色空间,那么你的下一个颜色将使用2的幂映射到它。你的第一个选择是中锋,第二个选择是在起跑和中锋之间。你的第三个选择是在中间和末端之间

下面是一些JavaScript示例

// initialize start and end of our linear transform
var START = 0;
var END = 100;

// next function
var _level = 1;
var _index = 1;
function next() {
    var pow2 = 2 << (_level - 1);
    var result = (END-START) / pow2;
    result = result * _index
    _index = (_index + 2) % pow2;
    if(_index == 1) {
        _level++;
    }
    return result;
}

// testing
for(var i=0; i<32; i++) 
    console.log(next());
//初始化线性变换的开始和结束
var START=0;
var-END=100;
//下一个函数
var_级别=1;
var_指数=1;
函数next(){

var pow2=2我认为你的问题应该分为两个问题:

  • 如何将颜色映射到n维笛卡尔空间,并定义颜色之间的欧几里德距离函数,以使距离反映人类观察者的差异
  • 给定一个n维长方体,生成一系列点,使迄今为止生成的任意两个点之间的最小欧几里德距离最大化
  • 现在答案是:

  • 使用计算色差。基于LCH颜色空间(亮度、色度和色调)。LCH颜色空间表示为圆柱体(见图)

    然而,差分公式是高度非线性的。因此,不可能将颜色映射到方形网格中,这样欧几里德距离将给出CIEDE2000色差

    在精度较低的模型上,我们可以使用基于的色差公式。我们可以直接在该颜色空间上使用欧几里德距离来测量差异。RGB或CMYK值与L*a*b*之间没有简单的转换公式,因为RGB和CMYK颜色模型依赖于设备。RGB或CMYK值首先需要转换到特定的绝对颜色空间,如sRGB或Adobe RGB。此调整将取决于设备,但转换产生的数据将独立于设备,允许数据转换到CIE 1931颜色空间,然后转换为L*a*b*。文章解释了此过程和形式乌拉斯

  • 对于L*a*b*颜色空间和CIE76色差公式,我们需要解决3D立方体的问题

    我相信你最好的策略是将立方体分割成8个立方体,这将生成27个点。使用这些点。现在将8个立方体中的每个立方体分割成另外8个立方体。对于每个立方体,27个点中的12个已经被使用,因此你剩下15*8个新点。在每一个附加步骤n中,你可以生成15*8^n个附加点最后一点

    在每一步中设置的点应该被排序,这样两个连续点之间的最小距离将被最大化。我不知道怎么做-

  • 编辑:


    我在网上发布了一个很好的答案。请看。

    至少应该对颜色有一个限制。例如,期望人们分辨一千种或更多颜色是不合理的,尤其是在图表上。为什么你不能一开始就简单地数一数所需的颜色数呢?那会让一切变得更简单。彼得·奥:我只是个傻瓜对于一个通用算法来说,如果我是实际的,我只需要手工挑选50种颜色就可以了。尼克·约翰逊:我不知道数字。有人会添加一种东西,我需要一种颜色,然后他们添加10种东西,我还需要10种,而不改变第一种东西的颜色。如果你有可访问性(例如色盲)在脑海中,你的颜色选择不能跨越整个色调光谱。考虑使用不同的亮度+模式作为替代。亮度是伟大的,我这样做与我的方法(HSL,其中L是亮度)。.对于我所做的事情,模式是不可能的。我有一个想法,今晚我将实施,看看它如何公平。我听说使用YUV颜色空间更好,因为它考虑了人们对颜色的感知。如何将一个立方体分为四个立方体?这种“图表控件”的复杂程度…这很愚蠢,但同时也很棒!