2012-08-01 27 views
1

全部,根据索引产生独特颜色的算法

是否有任何漂亮的算法可以根据数组中的索引生成唯一的颜色?

这当然是要在用户界面中使用,以设置一些动态按钮的背景颜色。

现在与.net(和Java了我的头顶部),下面的方法被支持:

Color.FromArgb 
Color.FromName 

FromArgb可以将含有该ARGB颜色的32位整数。

但是,算法的方法可能会导致一些颜色的顺序太相似,这取决于数组中有多少项。而且,前景色与背景相似。

我能想到的唯一方法是创建某种颜色的数组,并使用一组预定义的颜色。当然,这是手动代码的工作量,但这样您可以通过这种方式获得一组不同的颜色在重复序列结束之前,可以在视觉上彼此不同的小范围。

另一种方法可能是使用下面的方法产生的颜色数组:

Enum.GetValues(typeof(KnownColor) 

有什么建议?

干杯

+0

本帖](http://stackoverflow.com/questions/3632843/how-to-generate-a-set-of-random-colors - 没有两种颜色 - 几乎相似)可以给你想法。 – assylias 2012-08-01 15:09:55

+0

另请参阅[这篇文章](http://stackoverflow.com/questions/7656179/generate-visually-different-colors-with-an-unknown-color-collection-size/7731511) – 2012-08-01 18:28:01

回答

1

散列索引,取散列的低32位为您的颜色。这将随机出现,但应产生均匀的颜色分布。不能保证所选颜色的视觉效果与对方或背景不同,但可以提供。

您还可以将整个色谱图切成均匀交错的颜色,并将它们分配给阵列的每个元素,假定您知道数组的大小。

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

+0

我用哈希想法在我工作过的几个项目中。当你有很多事情的时候,这很棒,所以无论你做什么,你都会知道会有很多视觉上相似的颜色。 – 2012-08-01 19:41:26

0

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