18

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

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

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

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

4

6 回答 6

13

使用 RGB 颜色模型不是获得良好颜色混合的好方法。最好使用另一种颜色模型来生成颜色,然后从该颜色模型转换为 RGB。

我建议你改用HSV 或 HSL颜色模型,特别是你想改变Hue

如果您想要 X 个不同的颜色值,请将它们从 0 更改为 360,步长为 360 除以 X。

于 2009-04-21T15:40:21.227 回答
4

你的样品空间是什么......我们在谈论多少项目。

你可以建立一个 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) 种不同的颜色。

于 2009-04-21T15:43:37.007 回答
4

一般来说,RGB 并不是一个很好的色彩空间来做这些事情,因为它在感知上是非线性的,对于初学者来说。这意味着在 RGB 三元组之间移动的相等距离​​在我们眼中看起来并不相同。

我可能会在L*c*h*空间(另请参阅)空间或HSL空间中工作,并在色调中生成均匀的间距。这些空间被设计成近似感知线性的。

于 2009-04-21T15:46:08.687 回答
2

谷歌“delta e cie 2000”;色差公式可用于确定两种颜色之间的表观(视觉)距离。(在显示器上;颜料有不同的公式。)它对实验室空间中的颜色进行操作(西蒙的道具),但对差异进行感知计算。

我们发现 1.5 左右的数字足以确保视觉上不同的颜色(即,如果它们彼此靠近,您可以分辨出区别),但如果您想要可识别的颜色(您可以在图例中找到任何颜色),您需要顶一下。

至于创建一组颜色......我可能会从 Lab 空间的某个角落开始,并使用一个可以提供足够大视觉差异的步长绕它走(注意:它不是线性的,所以步长可能必须是自适应的),然后随机化列表。

于 2010-02-24T19:04:53.053 回答
0

这与着色地图相关的四色问题非常相似,这可能会为您提供一些有趣的解决方案:

四色定理

于 2009-04-21T15:50:50.390 回答
0

如果您只需要一组感知上不同的颜色(而不是生成它们的算法),我在我的网站上创建了一个免费工具,可以做到这一点: http:
//phrogz.net/css/distinct-colors.html

该工具不仅可以在 RGB 或 HSV 空间中使用均匀间距(相对于人类感知而言分布不均匀),还允许您在 HSV 空间中生成值网格,然后使用CMC(I:c)标准进行颜色距离以丢弃在感知上彼此太近的颜色。(第二个选项卡上的“阈值”滑块允许您控制颜色在视觉上的明显差异,实时显示结果。)

最后,您可以按各种标准对生成的颜色列表进行排序,然后均匀地“洗牌”该列表,以保证列表中的视觉上不同的值彼此相邻。(我建议“交错”值约为 5。)

在撰写本文时,该工具在 Chrome、Safari 和(通过 shim)Firefox 上运行良好;IE9 不支持 HTML5 范围输入滑块,UI 广泛用于交互式探索。

于 2012-02-22T23:48:08.703 回答