这里我们有一个涉及颜色的有趣的现实世界算法要求。
N
Pretty Colors:为了绘制漂亮的图表(即:饼图),我们需要随机选择一组N
“足够不同”并且在一起看起来不错的颜色。这可以通过固定亮度和饱和度并以360/N
步进色调来实现。- 稳定的颜色分配:给定扇区标记为 ('A','B','C') 的 Pie_1 和扇区标记为 ('B','C','D') 的 Pie_2 , 如果扇区 B 和扇区 C 的颜色在 Pie_1 和 Pie_2 上都相同就好了。如果扇区随着时间的推移被删除或添加到图表中,这将有助于防止混淆。标签是唯一稳定的东西。
- 允许硬编码颜色:算法应允许硬编码标签->颜色关系作为输入,但将为其余标签计算颜色(根据规则 1 和 2)。
我认为这个算法,即使它看起来很特别,也会在不止一种情况下有用。
有什么想法吗?
更新: Eric 是对的,随着新标签的出现和消失,不可能保证每个标签颜色的稳定性。但如果它“足够稳定”,即颜色变化最小化,我会很高兴。
我在想这样的事情:
- 每个标签使用 hash(label)%360 获得一个随机色调值
- 为了保证生成的色调足够不同,我们将色调圆划分为固定数量的步长(即:
2*N
)并尝试“舍入”之前的色调值到新的差异化的。 - 如果不同的标签具有相同的舍入色调值,我们会以某种方式打破平局并将点移到其他地方。
但这忽略了硬编码颜色的问题。
最佳答案
您可以使用 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 世界的东西,它有助于确保在组合多个哈希值时实现更好的数学分布。
关于algorithm - 稳定的随机颜色算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2954443/