2016-05-15 82 views
2

我想爲圖形圖表生成隨機顏色,但我所嘗試的不可識別,並且生成的顏色通常是彼此相似的。是否有可能創造這樣的顏色?如何隨機生成容易識別的顏色?

我的方法:

public Color[] GenerateColors(int n) 
    { 
     Color[] colors = new Color[n]; 
     for (int i = 0; i < n; i++) 
     { 
      int R = rnd.Next(0, 250); 
      int G = rnd.Next(0, 250); 
      int B = rnd.Next(0, 250); 

      Color color = Color.FromArgb(R, G, B); 
      colors[i] = color; 
     } 
     return colors; 
    } 
+1

在這種情況下,你最好不要使用隨機的,而是某種模式 – Ian

+2

的見[這裏](http://stackoverflow.com/questions/27374550/how-to-compare-color-object以獲得最接近的顏色/ 27375621?s = 1 | 1.0441#27375621)討論顏色距離。另請查看['KnownColors'](https://msdn.microsoft.com/en-us/library/system.drawing.knowncolor(v = vs.110).aspx)! – TaW

+1

這裏有一些想法http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/和這裏 http://stackoverflow.com/questions/43044/algorithm-隨機產生一種美觀的調色板 – OldBoyCoder

回答

0

這裏是一個RandomColors類組合來自TawOldBoyCoder的建議。根據您想要生成的顏色數量Generate或者從KnownColors中挑選,或者在最後一種顏色用作混合顏色的情況下生成隨機新顏色。

public class RandomColors 
{ 
    static Color lastColor = Color.Empty; 

    static KnownColor[] colorValues = (KnownColor[]) Enum.GetValues(typeof(KnownColor)); 

    static Random rnd = new Random(); 
    const int MaxColor = 256; 
    static RandomColors() 
    { 
     lastColor = Color.FromArgb(rnd.Next(MaxColor), rnd.Next(MaxColor), rnd.Next(MaxColor)); 
    } 

    public static Color[] Generate(int n) 
    { 
     var colors = new Color[n]; 
     if (n <= colorValues.Length) 
     { 
      // known color suggestion from TAW 
      // https://stackoverflow.com/questions/37234131/how-to-generate-randomly-colors-that-is-easily-recognizable-from-each-other#comment61999963_37234131 
      var step = (colorValues.Length-1)/n; 
      var colorIndex = step; 
      step = step == 0 ? 1 : step; // hacky 
      for(int i=0; i<n; i++) 
      { 
       colors[i] = Color.FromKnownColor(colorValues[colorIndex]); 
       colorIndex += step; 
      } 
     } else 
     { 
      for(int i=0; i<n; i++) 
      { 
       colors[i] = GetNext(); 
      } 
     } 

     return colors; 
    } 

    public static Color GetNext() 
    { 
     // use the previous value as a mix color as demonstrated by David Crow 
     // https://stackoverflow.com/a/43235/578411 
     Color nextColor = Color.FromArgb(
      (rnd.Next(MaxColor) + lastColor.R)/2, 
      (rnd.Next(MaxColor) + lastColor.G)/2, 
      (rnd.Next(MaxColor) + lastColor.B)/2 
      ); 
     lastColor = nextColor; 
     return nextColor; 
    } 
}