2010-06-02 116 views
5

这里我们有一个涉及颜色的有趣的真实世界算法要求。稳定的随机颜色算法

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

我觉得这个算法,即使它看起来很临时,在多种情况下都会很有用。

任何想法?

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

我想的是一样的东西:

  1. 每个标签使用哈希得到一个随机色彩值(标签)%360
  2. 为了保证生成的色调有足够的不同,我们把色相以固定数量的步骤循环(即:2*N),并尝试将之前的色调值“四舍五入”为新的差异化值。
  3. 在不同标签达到相同圆角色调值的情况下,我们会以某种方式破坏领带并将点移动到其他位置。

但是这留下了硬编码颜色的问题。

回答

4

您可以使用color wheel算法选择一组随机颜色,看起来很好。这里有一个related SO question与实施指南,或谷歌许多其他人。

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

编辑:

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

如果你可以任意混合饼图上的标签,NO算法可以确保它们总是看起来很好。这里有一个简单的证明:

让A,B,C被选中,以便它们在一起看起来不错。

现在,让我们一出现与任意颜色ž

你当然可以选择一些颜色对于z使得A和Z的比赛。

您只能保证某一套颜色在一起看起来不错,而选择相同的颜色将会重现相同的颜色。

您可以使用例如第一个标签作为轮子上的起点(散列(A)),或者您可以组合散列(散列(A)+ 31 *散列(B)+ 31 * 31 *散列(C))。乘以31(一个素数)是来自Java世界的东西,它有助于在组合多个哈希时确保更好的数学分布。

+0

如果我们定义颜色(标签):= hsb(散列(标签)%360,S,B)将起作用,但如何保证色相不同enougt。 另一方面,如果你使用色轮,什么标签是散列的,启动色轮,标签只是追随者? 感谢您的回答 – Olmo 2010-06-02 06:44:19

+0

@Olmo:看我的编辑。 – 2010-06-02 15:51:05

+0

很多埃里克。我已经将问题更改为社区wiki,因此我可以用更多的空间来回答 – Olmo 2010-06-02 19:03:20