Генерируйте уникальные цвета
-
13-09-2019 - |
Вопрос
Я хочу нарисовать некоторые данные в текстуре:много предметов подряд.Они создаются не по порядку и могут быть разных размеров (представьте себе кучу памяти).Каждый элемент данных представляет собой небольшой прямоугольник, и я хочу, чтобы их можно было различать, поэтому мне хотелось бы, чтобы каждый из них имел уникальный цвет.
Теперь я мог бы просто использовать rand() для генерации значений RGB и надеяться, что они все разные, но я подозреваю, что не получу хорошего распределения в пространстве RGB.Есть ли лучший способ, чем этот?Например.как лучше всего переключаться между разными цветами, прежде чем они (почти) повторятся?
Цвета не обязательно должны совпадать с какими-либо данными в элементах.Я просто хочу иметь возможность просмотреть множество значений и увидеть, что они разные, поскольку смежны.
Я мог бы кое-что придумать, но думаю, это интересный вопрос.:)
Решение
Использование цветовой модели RGB — не лучший способ получить хорошее цветовое сочетание.Лучше использовать другую цветовую модель для создания цвета, а затем преобразовать ее в RGB.
Я предлагаю вам ВПГ или HSL вместо этого цветовая модель, в частности, вы хотите изменить Хюэ.
Если вам нужно X разных значений цвета, измените их от 0 до 360 с шагом 360, разделенным на X.
Другие советы
В целом RGB не является лучшим цветовым пространством для подобных задач, потому что, во-первых, оно нелинейно по восприятию.Это означает, что равные расстояния, перемещаемые между триплетами RGB, не выглядят одинаково разными для наших глаз.
Я бы, наверное, работал в Л*с*ч* космос (смотрите также) пространство, или ХСЛ пространство и просто создайте равномерный интервал в оттенке.Эти пространства были спроектированы так, чтобы быть приблизительно линейными по восприятию.
Какое у вас пространство для выборки...о скольких предметах мы говорим.
Вы можете создать массив троек RGB из
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) разных цветов перед повторением цвета.
Гуглите «дельта е cie 2000»;Формула цветоразности полезна для определения видимого (визуального) расстояния между двумя цветами.(На мониторе;для пигментов существует другая формула.) Он работает с цветами в пространстве Лаборатории (реквизит Саймону), но применяет перцептивный расчет разницы.
Мы обнаружили, что числа около 1,5 достаточно, чтобы визуально гарантировать отчетливый цвета (т.вы можете заметить разницу, если они находятся рядом друг с другом), но если вы хотите опознаваемый цвета (вы можете найти любой цвет в легенде), вам нужно будет его увеличить.
Что касается создания набора цветов...Я бы, вероятно, начал с какого-нибудь угла лабораторного пространства и обошел бы его, используя размер шага, который дает достаточно большие визуальные различия (примечание:он не линейный, поэтому размер шага, вероятно, придется сделать адаптивным), а затем рандомизировать список.
Это очень похоже на задачу четырех цветов, связанную с раскраской карт. Это может дать вам несколько интересных решений:
Если вам просто нужен набор различающихся по восприятию цветов (а не алгоритм для их генерации), я создал на своем веб-сайте бесплатный инструмент, который делает именно это:
http://phrogz.net/css/distinct-colors.html
Вместо того, чтобы просто использовать равномерные интервалы в пространстве RGB или HSV (которые неравномерно распределены по отношению к человеческому восприятию), инструмент позволяет генерировать сетку значений в пространстве HSV, а затем использует КМЦ(Я:с) стандарт цветового расстояния, позволяющий отбрасывать цвета, которые воспринимаются слишком близко друг к другу.(Ползунок «Порог» на второй вкладке позволяет вам контролировать, насколько визуально различимыми должны быть цвета, показывая результаты в реальном времени.)
В конце концов, вы можете отсортировать список сгенерированных цветов по различным критериям, а затем равномерно «перетасовать» этот список, чтобы гарантированно иметь визуально различные значения, расположенные рядом друг с другом в списке.(Я рекомендую значение Interleave около 5.)
На момент написания этой статьи инструмент хорошо работал с Chrome, Safari и (через прокладку) Firefox;IE9 не поддерживает ползунки ввода диапазона HTML5, которые пользовательский интерфейс широко использует для интерактивного исследования.