我想将一些数据绘制到纹理中:连续许多项目。它们不是按顺序创建的,而且它们的大小可能都不同(想象一下内存堆)。每个数据项都是一个小矩形,我希望能够区分它们,所以我希望它们每个都有独特的颜色。

现在我可以使用 rand() 生成 RGB 值并希望它们都不同,但我怀疑我不会在 RGB 空间中获得良好的分布。还有比这更好的方法吗?例如。在不同颜色(几乎)重复之前循环使用不同颜色的好方法是什么?

颜色不必与项目中的任何数据匹配。我只是希望能够查看许多值并发现它们是不同的,因为它们是相邻的。

我可以弄清楚一些事情,但我认为这是一个有趣的问题。:)

有帮助吗?

解决方案

使用RGB颜色模式是不是获得良好的彩色搭配的好办法。这是更好地用另一种颜色模型来生成你的颜色,然后从颜色模式为RGB转换。

我建议你 HSV或HSL 颜色模型代替,特别是要改变色相

如果你想X不同的颜色值,变化它们从0到360以360的步长除以X

其他提示

一般来说,RGB 并不是执行此类操作的理想色彩空间,因为对于初学者来说,它在感知上是非线性的。这意味着 RGB 三元组之间移动的相等距离​​对于我们的眼睛来说看起来并不相同。

我可能会在 长*c*高* 空间 (也可以看看) 空间,或 HSL 空间,并且只是在色调中生成均匀的间距。这些空间被设计成近似感知线性的。

不知您对样本空间......有多少项目,我们谈论。

您可以从

建立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 广泛使用该滑块进行交互式探索。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top