Jas*_*son 6 language-agnostic algorithm colors
我正在尝试为图表控件生成颜色.我希望颜色在视觉上与众不同.我不仅希望颜色与相邻颜色区别开来,而且到目前为止所有颜色都是如此.
我也不想拥有已知的颜色集合大小.我已经看到的一些算法需要知道要着色的事物的数量.我想为我的颜色生成器实现GetNextColor(),所以我不知道在选择最终会有多少颜色时,选择前面的数字会感觉不对.
我不只是试图用不同颜色绘制一堆东西,我对这个问题感兴趣并想要一些反馈.
这不是一个非常有效的方法,它可以正常工作,但它可能更加科学.它开始时有很多想法,然后变成了这个烂摊子.
关于如何优雅地做到这一点的任何想法?
(这应该没关系,但我正在使用C#,当我回到计算机上时,我会发布代码,我已经掌握了所有这些内容.)
我相信你的问题应该分为两个问题:
现在答案是:
使用CIEDE2000色差公式计算色差.所述CIEDE2000公式是基于LCH颜色空间(光度,色度和色调).LCH颜色空间表示为圆柱体(请参见此处的图像).
但是,差分公式是高度非线性的.因此,将颜色映射到正方形网格中是不可能的,这样欧几里得距离就会给出CIEDE2000的色差.
在不太精确的模型上,我们可以使用CIE76色差公式,该公式基于Lab色彩空间(L*a*b*).我们可以直接在这个颜色空间上使用欧几里德距离来测量差异.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个附加点.
应对每个步骤中的点集进行排序,使得两个连续点之间的最小距离最大化.我不知道怎么做 - 我刚发布了一个问题.
编辑:
我已经在https://cstheory.stackexchange.com/上进行了交叉,并得到了一个很好的答案.请参阅https://cstheory.stackexchange.com/questions/8609/sorting-points-such-that-the-minimal-euclidean-distance-between-consecutive-poin.