Здесь у нас есть интересное реальное требование алгоритма, включающее цвета.
N
Симпатичные Цвета: для рисования красивой диаграммы (т.е.: круговая диаграмма) мы должны выбрать случайный набор N
цвета, которые "достаточно отличаются" и выглядят хорошими вместе. Это могло быть выполнено путем фиксации яркости и насыщенности и продвижения через оттенок на шагах 360/N
. Я думаю этот алгоритм, даже если это будет выглядеть довольно специальным, то будет полезно больше чем в одной ситуации.
Какие-либо идеи?
Обновление: Eric прав, что это невозможно гарантировать устойчивость цветов для каждой маркировки, поскольку новые маркировки появляются и исчезают. Но я счастлив, если это "достаточно стабильно", т.е. минимизированы цветные изменения.
Я думал о чем-то как:
2*N
) и попробуйте к 'раунду', который предыдущий оттенок оценивает новым дифференцируемым.Но это не принимает во внимание проблему трудно кодированных цветов.
Вы можете выбрать набор случайных цветов, которые хорошо смотрятся вместе, используя алгоритм цветового круга . Вот вопрос 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, которое помогает обеспечить лучшее математическое распределение при объединении нескольких хешей.