我正在尝试为图表控件动态生成颜色。我希望颜色在视觉上具有特色。我不仅希望这些颜色与相邻的颜色有区别,而且到目前为止还生成了所有颜色。
我也不想具有已知的颜色收集大小。我见过的一些算法需要知道一些要着色的东西。我想为我的颜色生成器实现GetNextColor(),所以在选择最终将要拥有的颜色并预先选择一个数字时我不知道。
我不仅在尝试用不同的颜色绘制一堆东西,我对这个问题感兴趣并且需要一些反馈。
这不是一个非常有效的方法,它可以正常工作,但是可能更加科学。它开始时经过很多思考,然后演变为混乱。
有关如何优雅地进行此操作的任何想法?
(没关系,但是我正在使用C#,当我回到计算机时,我会把所有这些东西都贴在上面。)
我认为您的问题应分为两个问题:
现在的答案:
但是,差异公式是高度非线性的。因此,不可能将颜色映射到正方形网格中,以至于欧几里得距离将产生CIEDE2000色差。
基于不太准确的模型,我们可以使用基于Lab颜色空间(L * a * b *)的CIE76色差公式。我们可以直接在此色彩空间上使用欧几里得距离来测量差异。在RGB或CMYK值与L * a * b 之间没有转换的简单公式,因为RGB和CMYK颜色模型取决于设备。首先需要将RGB或CMYK值转换为特定的绝对颜色空间,例如sRGB或Adobe RGB。该调整将取决于设备,但是来自转换的结果数据将与设备无关,从而允许将数据转换为CIE 1931颜色空间,然后转换为L * a * b 。此文章解释程序和公式。
我相信您最好的策略是将多维数据集分为8个多维数据集,这将产生27个点。使用这些要点。现在将8个多维数据集中的每一个划分为另外8个多维数据集。对于每个多维数据集,已经使用了27个点中的12个,因此剩下15 * 8个新点。在每个附加步骤n中,您可以生成15 * 8 ^ n个附加点。
每个步骤中设置的点应进行排序,以使两个连续点之间的最小距离最大化。