Создание уникальных цветов

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

Теперь я мог бы просто использовать rand() для генерации значений RGB и надеюсь, что они все разные, но я подозреваю, что не буду получать хорошее распространение в пространстве RGB. Есть ли лучший способ, чем это? Например. что такое хороший способ ездить на велосипеде через разные цвета, прежде чем они (почти) повторятся?

Цвета не должны совпадать с любыми данными в элементах. Я просто хочу иметь возможность смотреть на многие значения и видеть, что они разные, поскольку они смежны.

Я мог бы кое-что понять, но я думаю, что это интересный вопрос.:)

Ответ 1

Использование цветовой модели RGB - не лучший способ получить хороший цветной микс. Лучше использовать другую цветовую модель для генерации вашего цвета, а затем конвертировать из этой цветовой модели в RGB.

Я предлагаю вам Hue.

Если вам нужны X разных значений цвета, измените их с 0 до 360 с размером шага 360, разделенным на X.

Ответ 2

В общем, RGB не является отличным цветовым пространством для таких вещей, потому что он перцептивно нелинейный, для начала. Это означает, что равные расстояния, перемещаемые между триплетами RGB, не выглядят одинаково по-разному для наших глаз.

Я бы, вероятно, работал в L * c * h * space (см. также), или HSL, и просто создайте равномерный интервал в оттенке. Эти пространства были спроектированы так, чтобы быть приблизительно перцепционно линейными.

Ответ 3

Каково ваше пространство в выборке... сколько предметов мы говорим.

Вы можете создать массив RGB Triples из

for(int r = 0; r < 255; r = r+16)
   for(int g = 0; g < 255; g = g+16)
      for(int b = 0; b < 255; b = b+16)
           // take r, g, b and add it to a list

Затем рандомизируйте свой список и повторите его. это даст вам 16 ^ 3 (4096) разных цветов перед повторным цветом.

Ответ 4

Google "delta e cie 2000"; формула цветовой разницы полезна для определения видимого (визуального) расстояния между двумя цветами. (На мониторе есть другая формула для пигментов.) Он работает с цветами в лабораторном пространстве (реквизит к симону), но применяет перцептивный расчет разницы.

Мы обнаружили, что число, равное 1,5, было достаточным для обеспечения визуально разных цветов (т.е. вы можете сказать разницу, если они находятся рядом друг с другом), но если вы хотите идентифицировать цвета (вы можете найти любой цвет в легенде) вам нужно поднять это.

Что касается создания набора цветов... я бы, вероятно, начал бы в каком-то уголке лабораторного пространства и обошел его, используя размер шага, который дает достаточно большие визуальные различия (обратите внимание: он не линейный, поэтому размер шага будет вероятно, должны быть адаптивными), а затем рандомизировать список.

Ответ 5

Это очень похоже на четырехцветную проблему, связанную с раскрашивающими картами, это может дать вам некоторые интересные решения:

Четырехцветная теорема

Ответ 6

Если вам просто нужен набор воспринимаемых разных цветов (а не алгоритм их генерации), я создал бесплатный инструмент на своем веб-сайте, который делает именно это:
http://phrogz.net/css/distinct-colors.html

Вместо того, чтобы просто использовать четное расстояние в пространстве RGB или HSV (которое неравномерно распределено по отношению к восприятию человека), инструмент позволяет создавать сетку значений в пространстве HSV, а затем использует CMC (I: c) стандарт для расстояния по цвету, чтобы выбрасывать цвета, которые воспринимаются слишком близко друг к другу. (Ползунок "порог" на второй вкладке позволяет вам управлять визуальным различием цветов, отображая результаты в реальном времени.)

В конце вы можете отсортировать список сгенерированных цветов по различным критериям, а затем равномерно перетасовать этот список, чтобы вы гарантированно имели визуально различные значения, смежные друг с другом в списке. (Я рекомендую значение "Interleave" около 5.)

С момента написания этой статьи инструмент хорошо работает с Chrome, Safari и (через прокладку) Firefox; IE9 не поддерживает ползунки ввода диапазона HTML5, которые пользовательский интерфейс широко использует для интерактивного исследования.