Вопрос

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

Теперь я мог бы просто использовать 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, которые пользовательский интерфейс широко использует для интерактивного исследования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top