【问题标题】:Stable random color algorithm稳定的随机颜色算法
【发布时间】:2011-02-26 14:54:27
【问题描述】:

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

  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. 如果不同的标签具有相同的圆形色调值,我们会以某种方式打破平局并将点移动到其他位置。

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

【问题讨论】:

    标签: algorithm colors gdi rgb hsv


    【解决方案1】:

    您可以使用color wheel 算法选择一组看起来不错的随机颜色。这是一个带有实施指南的related SO question,或者谷歌对于许多其他人。

    您可以使用标签的哈希值作为色轮上的起点,以确保稳定性。这也满足 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 世界中的一种方法,有助于确保在组合多个哈希时获得更好的数学分布。

    【讨论】:

    • 如果我们定义 color(label):= hsb(hash(label)%360, S, B) 将起作用,但你如何保证色调不同。另一方面,如果您使用色轮,则散列什么标签并启动色轮,而哪个标签只是追随者?感谢您的回答
    • 非常感谢埃里克。我已将问题更改为社区 wiki,因此我可以用更多的空间来回答
    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 2012-03-10
    • 2014-10-01
    • 2018-11-29
    • 2014-11-17
    相关资源
    最近更新 更多