5

在这里,我们有一个有趣的现实世界算法要求,涉及颜色。

  1. N 漂亮的颜色:为了绘制漂亮的图表(即:饼图),我们需要随机选择一组N“足够不同”并且看起来很好的颜色。这可以通过固定亮度和饱和度并以360/N.
  2. 稳定的颜色分配:给定 Pie_1 的扇区标记为 ('A','B','C') 和 Pie_2 的扇区标记为 ('B','C','D'),如果扇区的颜色会很好Pie_1 和 Pie_2 上的 B 和 C 相同。如果随着时间的推移将扇区删除或添加到图表中,这将有助于防止混淆。标签是唯一稳定的东西。
  3. 允许硬编码颜色:该算法应允许硬编码标签->颜色关系作为输入,但将计算其余标签的颜色(根据规则 1 和 2)。

我认为这个算法,即使它看起来很临时,也将在不止一种情况下有用。

有任何想法吗?

更新: Eric 是对的,因为新标签的出现和消失,不可能保证每个标签的颜色稳定性。但如果它“足够稳定”我很高兴,即颜色变化最小化。

我在想类似的东西:

  1. 每个标签使用 hash(label)%360 获得一个随机色调值
  2. 为了保证生成的色调足够不同,我们将色调圈划分为固定数量的步长(即:)2*N,并尝试将先前的色调值“四舍五入”为新的差异化值。
  3. 在不同标签的圆形色调值相同的情况下,我们以某种方式打破平局并将点移动到其他地方。

但这撇开了硬编码颜色的问题。

4

1 回答 1

4

您可以使用色轮算法选择一组看起来不错的随机颜色。这是一个与实施指南相关的 SO 问题,或谷歌的许多其他问题。

您可以使用诸如标签哈希之类的东西作为色轮上的起点,以确保稳定性。这也满足 3. 如果你有一个覆盖机制来声明一个特定的标签哈希值应该对应于色轮上的一个特定的起点。

编辑:

色轮可让您选择一个主起点(例如(hash(A) % 360)并确保其他两种颜色(B、C)与 A 一起使用时“不错”。B 和 C 由 A 确定。如果您稍后可以有一个饼图 (B, Y, Z),B 将设置为 (hash(B) % 360),并且与 (A, B, C) 的情况不同。

如果您可以在饼图上任意混合标签,那么没有算法可以确保它们始终在一起看起来很好。这是一个简单的证明:

让 A、B、C 被选中,使它们看起来很好。

现在让 A 以任意颜色 Z 出现

你当然可以为 Z 选择一些颜色,这样 A 和 Z 就会发生冲突。

你只能保证某组颜色搭配起来会很好看,并且选择同一套颜色会重现相同的颜色。

您可以使用例如第一个标签的哈希作为轮子上的起点 (hash(A)) 或者您可以组合哈希 (hash(A) + 31*hash(B) + 31*31*hash(C) )。乘以 31(质数)是 Java 世界中的一种方法,有助于确保在组合多个哈希时获得更好的数学分布。

于 2010-06-02T01:37:26.420 回答