Как выбрать красивые случайные цвета при рисовании диаграммы? - PullRequest
2 голосов
/ 05 марта 2012

Мне нужно получить несколько случайных цветов, чтобы нарисовать пирог.Мой код работает, но он может снова и снова принимать один и тот же цвет

    Random r = new Random();

    for (int i = 0; i < 20; i++)
    {
        int min = 0;
        int max = 255;
        int rand1 = r.Next(min, max);
        int rand2 = r.Next(min, max);
        int rand3 = r.Next(min, max);
        Color myColor = Color.FromArgb(rand1, rand2, rand3);  
        //drawing the pie here
   }

Как я могу переработать его, чтобы он больше не выбирал тот же цвет.

Ответы [ 3 ]

2 голосов
/ 05 марта 2012

Вы можете поместить случайные цвета, которые вы генерируете, в контейнер, а затем проверить, был ли подобный цвет определенной дельтой уже вставлен в контейнер.

Таким образом, вы не рискуете подобрать другой цвет, но очень похожий, например: RGB(0, 0, 0) и RGB(10, 2, 3)

const int DELTA_PERCENT = 10;
List<Color> alreadyChoosenColors = new List<Color>();

// initialize the random generator
Random r = new Random();

for (int i = 0; i < 20; i++)
{
    bool chooseAnotherColor = true;      
    while ( chooseAnotherColor )
    {
       // create a random color by generating three random channels
       //
       int redColor = r.Next(0, 255);
       int greenColor = r.Next(0, 255);
       int blueColor = r.Next(0, 255);
       Color tmpColor = Color.FromArgb(redColor, greenColor, blueColor);  

       // check if a similar color has already been created
       //
       chooseAnotherColor = false;
       foreach (Color c in alreadyChoosenColors)
       {
          int delta = c.R * DELTA_PERCENT / 100;
          if ( c.R-delta <= tmpColor.R && tmpColor.R <= c.R+delta )
          {
             chooseAnotherColor = true;
             break;
          }

          delta = c.G * DELTA_PERCENT / 100;
          if ( c.G-delta <= tmpColor.G && tmpColor.G <= c.G+delta )
          {
             chooseAnotherColor = true;
             break;
          }

          delta = c.B * DELTA_PERCENT / 100;
          if ( c.B-delta <= tmpColor.B && tmpColor.B <= c.B+delta )
          {
             chooseAnotherColor = true;
             break;
          }
        }
    }

    alreadyChoosenColors.Add(tmpColor);
    // you can safely use the tmpColor here

   }
2 голосов
/ 05 марта 2012

Обычно лучше заранее создать красивую палитру, а затем выбрать цвета из палитры.В псевдокоде:

var Palette = new Array(Color(r1, g1, b1), Color(r2, g2, b2), …);
for (var i=0; i<numberOfPieSegments; i++)
    drawPieSegment(Palette[i % Palette.length], …);
0 голосов
/ 05 марта 2012

см. Msdn для дескриптора класса Random , проверьте это: Однако, поскольку часы имеют конечное разрешение, использование конструктора без параметров для создания различных объектов Random в последовательной последовательности создает генераторы случайных чисел, которые производят идентичные последовательности случайных чисел.
По этой причине вы должны использовать разные начальные числа для инициализации случайного экземпляра каждый раз. Я рекомендую отметку времени.

...