2012-08-01 45 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