Стабильный алгоритм произвольного цвета

Здесь у нас есть интересное реальное требование алгоритма, включающее цвета.

  1. N Симпатичные Цвета: для рисования красивой диаграммы (т.е.: круговая диаграмма) мы должны выбрать случайный набор N цвета, которые "достаточно отличаются" и выглядят хорошими вместе. Это могло быть выполнено путем фиксации яркости и насыщенности и продвижения через оттенок на шагах 360/N.
  2. Стабильное Цветное Присвоение: данный Pie_1 с секторами маркировал ('B', 'C') и Pie_2 с секторами маркированный ('B', 'C', 'D'), было бы хорошо, если цвет секторов B и C является тем же и на Pie_1 и на Pie_2. Это поможет предотвратить беспорядок, если секторы будут удалены или добавляться к диаграмме со временем. Маркировка является единственной устойчивой вещью.
  3. Позволяет Трудно кодированные цвета: алгоритм должен позволить маркировку hardcoded-> цветные отношения как вход, но вычислит цвета (согласно правилам 1 и 2) для остальной части маркировок.

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

Какие-либо идеи?

Обновление: Eric прав, что это невозможно гарантировать устойчивость цветов для каждой маркировки, поскольку новые маркировки появляются и исчезают. Но я счастлив, если это "достаточно стабильно", т.е. минимизированы цветные изменения.

Я думал о чем-то как:

  1. Каждая маркировка получает случайное значение оттенка с помощью хеша (маркировка) %360
  2. Чтобы гарантировать, что сгенерированные оттенки достаточно отличаются, мы делим круг оттенка на установленную сумму шагов (т.е.: 2*N) и попробуйте к 'раунду', который предыдущий оттенок оценивает новым дифференцируемым.
  3. В случае различных маркировок, идущих в то же округленное значение оттенка, мы повреждаем связь так или иначе и перемещаем точку где-то в другом месте.

Но это не принимает во внимание проблему трудно кодированных цветов.

5
задан 3 revs, 2 users 66% 23 November 2011 в 08:10
поделиться

1 ответ

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

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

РЕДАКТИРОВАТЬ:

Цветовой круг позволяет вам выбрать одну основную начальную точку (например, (хэш (A)% 360) и убедиться, что два других цвета (B, C) «хороши» при использовании вместе с A. B и C определяются A. Если позже у вас будет круговая диаграмма (B, Y, Z), B будет установлен как (hash (B)% 360) и будет отличаться от того, что было в (A, B, C) случай.

Если вы можете произвольно смешивать метки на круговых диаграммах, НИ ОДИН алгоритм не может гарантировать, что они всегда будут хорошо смотреться вместе. Вот простое доказательство:

Пусть A, B, C выбраны так, чтобы они хорошо смотрелись вместе .

Теперь пусть A появляется с произвольным цветом Z

Вы, конечно, можете выбрать какой-нибудь цвет для Z, так что A и Z будут конфликтовать.

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

Вы можете использовать хеш, например, первая метка в качестве отправной точки на колесе (хэш (A)) или вы можете комбинировать хеши (хеш (A) + 31 * хеш (B) + 31 * 31 * хеш (C)). Умножение на 31 (простое число) - это что-то из мира Java, которое помогает обеспечить лучшее математическое распределение при объединении нескольких хешей.

4
ответ дан 15 December 2019 в 00:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: