Как генерировать n различные цвета для какого-либо натурального числа n? [дубликат]

37
задан Charles Stewart 24 February 2010 в 22:36
поделиться

5 ответов

100 - это много цветов, но вы можете сделать это, распределив их как можно реже в пространстве HSB или HSL; сделать это в RGB, вероятно, сложно.

Например, вы можете решить использовать 10 разных оттенков, 4 разных уровня насыщенности и 3 разных настройки яркости, что даст вам до 120 цветов. Вам нужно будет тщательно выбрать значения насыщенности и яркости; человеческие глаза - сложные и запутанные сенсоры. Если вы относитесь к цветовому пространству как к конусу, вам, вероятно, понадобится разное количество оттенков на каждом уровне яркости / насыщенности.

Вот ссылка на статью в википедии на HSB .

6
ответ дан 27 November 2019 в 04:20
поделиться

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

Если вы используете пространство Lab, существуют модели восприятия цвета (CIE 1996? И CIE 2000) для измерения визуальной близости цветов (для печати и отображения соответственно).

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

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

1
ответ дан 27 November 2019 в 04:20
поделиться

float не нарушит документооборот - кроме того, он расположит любой элемент, который он использует, как лучше всего, он может поместиться в ширину контейнера - скажем, у меня есть 5 x 200px divs в контейнере шириной 800 px, последний 5 пойдет в «новой строке» ниже других - используя положение :относительный заставит вас рассчитать, когда нужно сломать себя, и он не будет нарушен правильно, так как дисплей будет либо блоком и проходить по всей ширине, либо будет встроенным блоком или встроенным , который не будет отображать такой же способ для дивов, как блок будет и в значительной степени нарушит поток документов и макет.

Это зависит от того, что вы хотите сделать: position: relative используется для перемещения элемента немного в сторону от его естественного местоположения, в то время как float заставит его всплыть в крайнем левом или крайнем правом положении в родительском элементе. позиция: absolute позволит расположить его относительно ближайшего позиционированного предка (вместо позиционированного относительно видового экрана, как фиксированный). Однако; если абсолютный позиционированный элемент не имеет позиционированных предков, он использует тело документа и перемещается вместе с прокруткой страницы.

-121--2666393-

Укажите -Lpath/to/library/ для компоновщика.

-121--2959390-

Не ответ на ваш вопрос, но, если n имеет максимальное значение и ваше приложение позволяет это, вы можете использовать предопределенный список цветов:

http://en.wikipedia.org/wiki/List_of_colors

Одно из преимуществ заключается в том, что вы можете показать читаемое по-человечески имя цвета в подсказке для людей с цветовой слепотой.

2
ответ дан 27 November 2019 в 04:20
поделиться

Edit:

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

Разница в цвете

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

RGB

Наиболее распространенным представлением цвета в компьютерных системах является вектор (r, g, b) , который предлагает простую функцию расстояния, например

RGB color difference

. Давайте установим диапазон для r , g и b до [0, 1] и посмотрите, как это работает:

  1. Red (1, 0, 0) и красный (1, 0, 0) имеют расстояние 0 , что должно быть очевидно
  2. Red (1, 0, 0) и желтый (1, 1, 0) имеют расстояние 1 , что меньше, чем расстояние
  3. Red (1, 0, 0 ) и синий (0, 0, 1) , который равен sqrt (2) , что правдоподобно

Пока все хорошо.Проблема, однако, в том, что синий и красный находятся на одинаковом расстоянии 1 от черного (0, 0, 0) , но при взгляде на изображение это кажется неверным:

blue and red on black

Также желтый (1, 1, 0) и пурпурный (1, 0, 1) имеют одинаковое расстояние 1 от белого ] (1, 1, 1) , что, похоже, тоже не имеет смысла:

yellow and magenta on white

HSL и HSV

Я думаю, можно с уверенностью предположить, что аналоговые метрики для HSL и HSV цвета схемы имеют те же проблемы. Эти цветовые схемы не предназначены для сравнения цветов.

CIEDE2000

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

CIEDE2000

(полная формула, описанная в статье, огромная )

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

Алгоритм выбора цвета

Наивное решение

В некоторых ответах предлагался следующий алгоритм

colors = []
for n in range(n):
    success=False
    while not success:
        new_color = random_color()
        for color in colors:
            if distance(color, new_color)>far_enough:
                colors.append(new_color)
                success = True
                break

Этот алгоритм имеет некоторые проблемы:

  1. Расстановка цветов не оптимальна. Если представить цвета как числа в строке, три числа будут оптимально размещены следующим образом:

    | a ----- b ----- c |

    Добавление еще одного числа без перемещения a, b и c явно хуже, чем перестановка всех цветов.

  2. Работа алгоритма не гарантируется .Что делать, если нет цвета, который достаточно далек от существующих цветов в списке? Цикл будет продолжаться вечно

Правильное решение

Что ж ... У меня его нет.

37
ответ дан 27 November 2019 в 04:20
поделиться

Вы хотите преобразовать в HSL, а затем перебирать значения оттенка (H), сохраняя при этом другие 2 значения постоянными.

Для каждого значения вы конвертируете из HSL обратно в RGB .

См. Мои ответы здесь и здесь .

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

4
ответ дан 27 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

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