Алгоритм создания уникальных цветов

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

У меня есть серия объектов, у которых есть идентификаторы, которые подсчитываются с 1. Я хотел бы представлять каждый из них с другим, эстетически приятным цветом, который не будет легко путать с его соседями. Однако цвета не обязательно должны быть случайными. Я хотел бы получать один и тот же цвет каждый раз при вводе того же ID.

Ответ 1

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

Если вы хотите генерировать цвета, а не использовать список, один трюк, чтобы заставить их иметь последовательный и достойный внешний вид, - это генерировать их с помощью HSB. Предварительно определите яркость и насыщенность, затем установите значение оттенка с некоторой функцией идентификатора (это может быть множество вещей в зависимости от того, сколько идентификаторов вы планируете иметь, но умножая идентификатор на некоторую величину (и модификация, когда она превышает 255!) - хороший приблизительный подход. При таком подходе цвета будут "выравниваться" с точки зрения насыщенности и яркости, но каждый из них будет иметь четкий цвет.

Мне немного скучно на работе, поэтому я быстро собрал быстрое решение:

class HsbColor
{
    public int Hue { get; set; }
    public int Saturation { get; set; }
    public int Brightness { get; set; }

    public Color ToRGB
    {
        // left as exercise to the reader...
    }
}

public class Item
{


    public int Id { get; set; }
    private static const byte EXPECTED_MAX = 15;
    private static int HUE_FACTOR = 255 / EXPECTED_MAX;

    public HsbColor Color 
    {
       get {

         var color = new HsbColor() { Saturation = 175, Brightness = 175 };

         color.Hue = (Id * HUE_FACTOR) % 255;

         return color;
       }
    }
}

Ответ 2

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

max difference color palette

#000000
#00FF00
#0000FF
#FF0000
#01FFFE
#FFA6FE
#FFDB66
#006401
#010067
#95003A
#007DB5
#FF00F6
#FFEEE8
#774D00
#90FB92
#0076FF
#D5FF00
#FF937E
#6A826C
#FF029D
#FE8900
#7A4782
#7E2DD2
#85A900
#FF0056
#A42400
#00AE7E
#683D3B
#BDC6FF
#263400
#BDD393
#00B917
#9E008E
#001544
#C28C9F
#FF74A3
#01D0FF
#004754
#E56FFE
#788231
#0E4CA1
#91D0CB
#BE9970
#968AE8
#BB8800
#43002C
#DEFF74
#00FFC6
#FFE502
#620E00
#008F9C
#98FF52
#7544B1
#B500FF
#00FF78
#FF6E41
#005F39
#6B6882
#5FAD4E
#A75740
#A5FFD2
#FFB167
#009BFF
#E85EBE

Ответ 3

Вы можете умножить идентификатор на золотой коэффициент (phi), чтобы получить число 0 <= n < 1. Все числа, которые вы генерируете, будут распределены равномерно.

PHI = (1 + sqrt(5))/2
n = id * PHI - floor(id * PHI) 

Затем это вопрос преобразования этого числа в цвет, например.

hue = floor(n * 256)

Ответ 4

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

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

Ответ 5

Я написал статью об этой же теме:

Как создавать случайные цвета программно

В основном вы можете использовать цветовое пространство HSV, установить фиксированную насыщенность и значение и изменить оттенок. Когда вам известно количество цветов, которые вам нужны, просто разделите диапазон оттенков [0,1[ на это. Если вы не знаете количество требуемых цветов, вы все равно можете использовать золотой коэффициент для выбора цветов из этого пространства.