2016-05-15 3 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 -and-get-closest-color-in-an-color/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- to-randomly-generate-a-aesthetically-pleasing-color-palette – OldBoyCoder

ответ

0

Вот RandomColors класс, который сочетает в себе предложения от Taw и OldBoyCoder. Основываясь на том, сколько цветов вы хотите создать, метод 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; 
    } 
} 
Смежные вопросы