题
我想将一些数据绘制到纹理中:连续许多项目。它们不是按顺序创建的,而且它们的大小可能都不同(想象一下内存堆)。每个数据项都是一个小矩形,我希望能够区分它们,所以我希望它们每个都有独特的颜色。
现在我可以使用 rand() 生成 RGB 值并希望它们都不同,但我怀疑我不会在 RGB 空间中获得良好的分布。还有比这更好的方法吗?例如。在不同颜色(几乎)重复之前循环使用不同颜色的好方法是什么?
颜色不必与项目中的任何数据匹配。我只是希望能够查看许多值并发现它们是不同的,因为它们是相邻的。
我可以弄清楚一些事情,但我认为这是一个有趣的问题。:)
其他提示
不知您对样本空间......有多少项目,我们谈论。
您可以从
建立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)不同颜色的重复颜色之前。
谷歌 “的ΔECIE 2000”;色差公式是用于确定2个色之间表观(目测)的距离是有用的。 (在监视器;有颜料不同的公式)它运行在在Lab空间的颜色(道具西蒙),但适用于差的感知计算
我们发现,一些约1.5足以保证视觉上的不同的的颜色(即你可以分辨出来,如果他们彼此靠近),但是如果你想的身份颜色(你可以找到一个传奇任何颜色),你需要碰这件事。
作为创建一组颜色......我可能会开始在Lab空间某个角落,并用步长,让足够大的视觉差异(周围散步注:它不是线性的,因此步长会大概必须是自适应的),然后随机化列表。
这是非常相似的关于颜色的地图四色问题,这可能会产生一些有趣的解决方案为您提供:
如果您只需要一组感知上不同的颜色(而不是生成它们的算法),我在我的网站上创建了一个免费工具,它可以做到这一点:
http://phrogz.net/css/distinct-colors.html
该工具不是仅在 RGB 或 HSV 空间中使用均匀间距(相对于人类感知而言,这些间距不是均匀分布的),而是允许您在 HSV 空间中生成值网格,然后使用 CMC(I:c) 颜色距离的标准,以剔除感觉上彼此太接近的颜色。(第二个选项卡上的“阈值”滑块允许您控制颜色的视觉差异程度,并实时显示结果。)
最后,您可以按各种标准对生成的颜色列表进行排序,然后均匀地“洗牌”该列表,以便保证列表中具有视觉上不同的彼此相邻的值。(我建议“Interleave”值约为 5。)
截至撰写本文时,该工具可以很好地与 Chrome、Safari 和 Firefox(通过填充程序)配合使用;IE9 不支持 HTML5 范围输入滑块,UI 广泛使用该滑块进行交互式探索。