【问题标题】:Algorithms to produce unique colour depending based on index根据索引产生独特颜色的算法
【发布时间】:2012-08-01 15:05:56
【问题描述】:

全部,

有没有什么好的算法可以根据数组中的索引生成唯一的颜色?

这当然会在 UI 中使用,用于设置多个动态按钮的背景颜色。

现在有了 .Net(我不禁想到 Java),支持以下方法:

Color.FromArgb
Color.FromName

FromArgb 可以采用包含 argb 颜色的 32 位整数。

但是,算法方法可能会导致某些颜色的顺序过于相似,具体取决于数组中有多少项。还有,前景色和背景色相似的地方。

我能想到的唯一方法是创建某种颜色数组,其中包含一组预定义的颜色。当然,这是手动代码工作,但这样你可以在一个小范围内获得一组不同的颜色在向末尾重复序列之前,可以在视觉上彼此不同的范围。

另一种方法是使用以下方法生成颜色数组:

Enum.GetValues(typeof(KnownColor)

有什么建议吗?

干杯

【问题讨论】:

标签: algorithm colors


【解决方案1】:

散列索引,并将散列的低 32 位作为您的颜色。这看起来是随机的,但应该会产生均匀的颜色分布。不保证所选颜色在视觉上会与彼此或背景不同,但可以提供。

您还可以获取整个色谱,将其切割成n 均匀间隔的颜色,并将它们分配给数组的每个元素,假设您知道数组的大小。

https://stackoverflow.com/a/43235/684934 也可能提供好主意。

【讨论】:

  • 我已经在我从事的几个项目中使用了散列的想法。当你有很多东西时,这很棒,所以你知道无论你做什么都会有很多视觉上相似的颜色。
【解决方案2】:

RGB 颜色形成一个 3D 立方体的颜色空间。首先选择这个立方体的角(0 或 255 个值)。然后将立方体细分为8个立方体的网格,取新形成的顶点。再次细分,分成 64 个立方体,并取新形成的顶点。这将为您提供越来越接近更高指数的颜色。

IEnumerable<Color> GeneratePalette()
{
    for (int scale = 1; scale < 256; scale *= 2)
    {
        for (int r = 0; r <= scale; r++)
        for (int g = 0; g <= scale; g++)
        for (int b = 0; b <= scale; b++)
        {
            if (scale == 1 || (r & 1) == 1 || (g & 1) == 1 || (b & 1) == 1)
            {
                yield return new Color
                {
                    A = 255,
                    R = (byte) (255 * r / scale),
                    G = (byte) (255 * g / scale),
                    B = (byte) (255 * b / scale),
                };
            }
        }
    }
}

前几种颜色:

#FF000000 
#FF0000FF 
#FF00FF00 
#FF00FFFF 
#FFFF0000 
#FFFF00FF 
#FFFFFF00 
#FFFFFFFF 
#FF00007F 
#FF007F00 
#FF007F7F 
#FF007FFF 
...
#FFFF7FFF 
#FFFFFF7F 
#FF00003F 

【讨论】:

    猜你喜欢
    • 2010-11-13
    • 2010-10-20
    • 2015-05-28
    • 2011-03-09
    • 1970-01-01
    • 2022-01-02
    • 2014-09-07
    • 2020-04-04
    • 2023-04-05
    相关资源
    最近更新 更多