Стабильный алгоритм случайных цветов - PullRequest
5 голосов
/ 02 июня 2010

Здесь у нас есть интересное требование к реальному алгоритму с использованием цветов.

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

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

Есть идеи?

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

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

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

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

1 Ответ

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

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

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

EDIT:

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

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

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

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

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

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

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

...