Как создать набор случайных цветов, в которых нет двух почти одинаковых цветов? - PullRequest
2 голосов
/ 03 сентября 2010

В настоящее время я использую следующую функцию для генерации случайного шестнадцатеричного представления цвета.

function getRandomColor($max_r = 192, $max_g = 192, $max_b = 192) {
    if ($max_r > 192) { $max_r = 192; }
    if ($max_g > 192) { $max_g = 192; }
    if ($max_b > 192) { $max_b = 192; }
    if ($max_r < 0) { $max_r = 0; }
    if ($max_g < 0) { $max_g = 0; }
    if ($max_b < 0) { $max_b = 0; }

    return '#' . dechex(rand(0, 192)) . dechex(rand(0, 192)) . dechex(rand(0, 192));
}

Обратите внимание, что я установил максимальное значение равным 192 вместо 255 по единственной причине, что я избегаю очень светлых цветов, для того, чтобы я использовал случайный цвет как передний план на белом фоне.

Мой вопрос заключается в том, как мне создать набор цветов с неограниченной нумерацией, где нет почти одинаковых цветов. например: #D964D9 & #FF3EFF?

Ответы [ 3 ]

3 голосов
/ 03 сентября 2010

Может быть лучше использовать HSV координаты. Если вам не нужен белый или черный, вы можете установить максимальные значения S и V и генерировать значения H, которые не слишком близки друг к другу (мод 360 градусов). Затем конвертируйте в RGB.

1 голос
/ 03 сентября 2010

Есть несколько методов, которые приходят на ум:

  1. Установите массив из n стандартных цветов и поменяйте их случайным образом для получения желаемых "случайных" цветов.
  2. Заполнить массив n цветов; создать случайный цвет и проверить, есть ли что-то «близкое» уже в массиве. Если это так, выберите другой случайный цвет.
  3. Выберите каждый цвет в качестве детерминированной последовательности, например, простого хеш-значения, разработанного, чтобы не создавать дублирующихся значений. Серый код приходит на ум.
0 голосов
/ 03 сентября 2010

Ваш алгоритм может случайным образом генерировать цвета RGB (как это происходит сейчас), однако вы можете, например, проверить, что два R достаточно различны, прежде чем принимать выбор цвета. Алгоритм может повторить этот шаг (скажем, до 4 ... 10 ... N раз) для заданных R, G и / или B.

while ( (R1 > $max_r/2) && (R2 > $max_r/2) ) {
// Both are in the upper half of range, get a new random value for R1.
}

Другие возможности:

  • Повторите для нижней половины диапазона
  • Дальнейшие диапазоны деления (на 1/3 или 1/4)
  • Повторите для тонов G и B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...