Генерация цвета на основе случайного числа - PullRequest
1 голос
/ 01 июня 2010

Я хотел бы создать генератор цветов на основе случайных чисел, которые могут незначительно отличаться, но мне нужно, чтобы цвета были легко узнаваемы друг от друга. Тогда я думал о генерации в формате rgb, который был бы, вероятно, самым простым. Боюсь, просто умножение данных аргументов не очень хорошо. Какой алгоритм вы предлагаете использовать? Кроме того, второй сгенерированный цвет не должен быть таким же, как предыдущий, но я не хочу хранить их - ни умножение на (микро) время не принесло бы пользы, так как части скриптов обычно быстрее.

Ответы [ 5 ]

2 голосов
/ 02 июня 2010

Если вы хотите по-настоящему случайные цвета, тогда генерация одного и того же цвета 10 раз подряд будет приемлемой. Чтобы получить значения, которые воспринимаются как случайные, вы должны исключить истинную случайность.

Самый простой способ сделать это, вероятно, с помощью циклического индекса в списке цветов. Скажем, вы выбираете веб-цвета, список из 216 цветов. Каждый раз, когда вы хотите новый цвет, добавьте случайное число в индекс, упаковывая по мере необходимости. Чтобы предотвратить получение одного и того же цвета, ограничьте число случайных чисел меньшим, чем количество цветов.

colorIndex = (colorIndex + (random ()% 100) + 1)% 216;

Если вам не нужна таблица поиска, генерируйте цвета HSB, но ограничивайте оттенок той частью круга, которая не включает предыдущий цвет. Если предыдущий оттенок был 60 градусов, то выберите следующий оттенок выше 90 или ниже 30 градусов, например. Возможно, вы хотите ограничить насыщенность и яркость более чем на 50%.

1 голос
/ 02 июня 2010

Не ответ, а просто чтобы поделиться хорошей картинкой xkcd: alt text

Нелегко моделировать то, что составляет "легко узнаваемые цвета". Евклидово расстояние компонентов цвета R, G, B - грубая мера, но человеческий глаз не рецептор цвета RGB! Например. если пара цветов имеет некоторое евклидово расстояние между ними, а другая пара цветов имеет точное расстояние между ними, вы на самом деле не знаете, одинаково ли различается каждый цвет пары, , если вы не видите их !

1 голос
/ 01 июня 2010

Существует 255 * 255 * 255 возможных комбинаций цветов, которые вы можете сделать, если сгенерируете случайное число для каждого значения RBG.

Я бы не боялся цветовых коллизий, но если вы хотите убедиться, что коллизий не будет, вам понадобится записать предыдущий цвет.

Этот простой псевдокод иллюстрирует, как избежать некоторых необходимых сравнений

if red is not equals previous_red then
  if blue is not equals previous_blue then
    if green is not equals previous_green then
      use this color
else
  generate again
0 голосов
/ 01 июня 2010

Позвольте мне подсказать это:

Создайте алгоритм псевдо-случайного числа (введите Google, чтобы найти тысячи) и создайте массив с цветами.

Вы не указали язык, но в любом случае вы можете получить что-то вроде:

colors = [0xFF0000, 0x00FF00, 0x0000FF]

Красный, Зеленый и Синий

И вы можете иметь что-то вроде:

position = fn_random ();

ничья (цвет [положение]);

Надеюсь, это то, что вы ищете ...

Дайте мне знать !!

0 голосов
/ 01 июня 2010

Для настоящего генератора случайных чисел, посмотрите здесь .Я уверен, что вы можете связать его и в диапазоне чисел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...