我想在纹理中绘制一些数据:连续多个项目。它们不是按顺序创建的,它们可能都是不同的大小(想想内存堆)。每个数据项都是一个小矩形,我希望能够区分它们,所以我希望每个数据项都有独特的颜色。
现在我可以使用rand()生成RGB值并希望它们都不同,但我怀疑我不会在RGB空间中获得良好的分布。有比这更好的方法吗?例如。什么是在它们(几乎)重复之前循环通过不同颜色的好方法?
颜色不必与项目中的任何数据匹配。我只是希望能够看到许多值,并且看到它们是不同的,因为它们是相邻的。
我可以解决一些问题,但我认为这是一个有趣的问题。 :)
答案 0 :(得分:13)
使用RGB颜色模型不是获得良好色彩混合的好方法。最好使用另一种颜色模型来生成颜色,然后从该颜色模型转换为RGB。
我建议使用HSV or HSL颜色模型,特别是要改变Hue。
如果您想要X不同的颜色值,请将它们从0改为360,步长为360除以X.
答案 1 :(得分:4)
一般来说,RGB不是用于做这些事情的很好的色彩空间,因为对于初学者来说,它在感知上是非线性的。这意味着RGB三联体之间移动的等距离与我们的眼睛看起来并不相同。
我可能在L*c*h*空间(see also)空间或HSL空间工作,只是在色调中生成一个均匀的间距。这些空间的设计大致是感性线性的。
答案 2 :(得分:3)
你的样品空间是什么......我们说的是多少物品。
你可以从
建立一个RGB三元组数组for(int r = 0; r < 255; r = r+16)
for(int g = 0; g < 255; g = g+16)
for(int b = 0; b < 255; b = b+16)
// take r, g, b and add it to a list
然后随机化你的列表并迭代它。 在重复的颜色之前,它会给你16 ^ 3(4096)种不同的颜色。
答案 3 :(得分:2)
Google“delta e cie 2000”;色差公式可用于确定2种颜色之间的明显(视觉)距离。 (在显示器上;有一个不同的颜料配方。)它在Lab空间中运行颜色(支持simon),但应用感知计算差异。
我们发现大约1.5的数字足以确保视觉上不同的颜色(即,如果它们彼此靠近,你可以区分它们),但是如果你想要可识别的颜色(您可以在图例中找到任何颜色),您需要将其加大。
关于创建一组颜色...我可能从Lab空间的某个角落开始,然后使用步长大小来走动它,这会产生足够大的视觉差异(注意:它不是线性的,所以步长会可能必须是自适应的)然后随机化列表。
答案 4 :(得分:0)
这与有关着色地图的四色问题非常相似,这可能会为您提供一些有趣的解决方案:
答案 5 :(得分:0)
如果您只需要一组感知上不同的颜色(而不是生成它们的算法),我在我的网站上创建了一个免费工具: http://phrogz.net/css/distinct-colors.html
该工具不是仅仅使用RGB或HSV空间中的均匀间距(相对于人类感知不均匀分布),而是允许您在HSV空间中生成值网格,然后使用CMC(I:c)标准因为颜色距离会丢弃感觉上彼此太接近的颜色。 (第二个选项卡上的“阈值”滑块允许您控制颜色的视觉区别,实时显示结果。)
最后,您可以按照各种标准对生成的颜色列表进行排序,然后均匀地“混洗”该列表,以确保您在列表中具有彼此相邻的视觉上不同的值。 (我建议'交错'值大约为5。)
在撰写本文时,该工具适用于Chrome,Safari和(通过垫片)Firefox; IE9不支持HTML5范围输入滑块,UI广泛用于交互式探索。