100 - это много цветов, но вы можете сделать это, распределив их как можно реже в пространстве HSB или HSL; сделать это в RGB, вероятно, сложно.
Например, вы можете решить использовать 10 разных оттенков, 4 разных уровня насыщенности и 3 разных настройки яркости, что даст вам до 120 цветов. Вам нужно будет тщательно выбрать значения насыщенности и яркости; человеческие глаза - сложные и запутанные сенсоры. Если вы относитесь к цветовому пространству как к конусу, вам, вероятно, понадобится разное количество оттенков на каждом уровне яркости / насыщенности.
Вот ссылка на статью в википедии на HSB .
Для начала не используйте пространство RGB; Для этой проблемы трудно найти худшее цветовое пространство. (В зависимости от того, используете ли вы цвета для отображения или для печати, у вас есть огромное количество неотличимых цветов, близких к черному или почти белому.)
Если вы используете пространство Lab, существуют модели восприятия цвета (CIE 1996? И CIE 2000) для измерения визуальной близости цветов (для печати и отображения соответственно).
Вы не говорите, собираетесь ли вы вычислить цвета один раз и сохранить результат, или они должны быть пересчитаны на лету (и в этом случае должен ли он быть детерминированным или нет). Очевидно, что от этого будет зависеть любое обсуждение того, как лучше всего сгенерировать набор.
Хотя я бы предположил, что равномерное разделение осей цветового пространства (скажем, на 8) и их использование в качестве начальных точек было бы гораздо более эффективным, чем любой случайный процесс. Конечно, вам нужно только сравнить любую точку с ее соседями (и только если они уже есть в наборе), что сэкономит вам огромное количество сравнений.
float
не нарушит документооборот - кроме того, он расположит любой элемент, который он использует, как лучше всего, он может поместиться в ширину контейнера - скажем, у меня есть 5 x 200px divs в контейнере шириной 800 px, последний 5 пойдет в «новой строке» ниже других - используя положение :относительный
заставит вас рассчитать, когда нужно сломать себя, и он не будет нарушен правильно, так как дисплей
будет либо блоком
и проходить по всей ширине, либо будет встроенным блоком
или встроенным
, который не будет отображать такой же способ для дивов, как блок
будет и в значительной степени нарушит поток документов и макет.
Это зависит от того, что вы хотите сделать: position: relative
используется для перемещения элемента немного в сторону от его естественного местоположения, в то время как float
заставит его всплыть в крайнем левом или крайнем правом положении в родительском элементе. позиция: absolute
позволит расположить его относительно ближайшего позиционированного предка (вместо позиционированного относительно видового экрана, как фиксированный).
Однако; если абсолютный позиционированный элемент не имеет позиционированных предков, он использует тело документа и перемещается вместе с прокруткой страницы.
Укажите -Lpath/to/library/
для компоновщика.
Не ответ на ваш вопрос, но, если n имеет максимальное значение и ваше приложение позволяет это, вы можете использовать предопределенный список цветов:
http://en.wikipedia.org/wiki/List_of_colors
Одно из преимуществ заключается в том, что вы можете показать читаемое по-человечески имя цвета в подсказке для людей с цветовой слепотой.
Edit:
У меня нет опыта в этой области, и мои математические навыки довольно средние. Но у меня есть мнение, что решение этой проблемы более сложное и интересное, чем предлагают многие ответы здесь, поскольку я недавно пытался сделать что-то подобное и не нашел решения.
Восприятие цвета, конечно, субъективно, но между людьми существует значительное согласие. Например, мы все можем согласиться с тем, что красный, зеленый и синий - очень разные цвета, и даже дальтоники согласны с тем, что черный и белый очень разные.
Наиболее распространенным представлением цвета в компьютерных системах является вектор (r, g, b) , который предлагает простую функцию расстояния, например
. Давайте установим диапазон для r , g и b до [0, 1] и посмотрите, как это работает:
Пока все хорошо.Проблема, однако, в том, что синий и красный находятся на одинаковом расстоянии 1 от черного (0, 0, 0) , но при взгляде на изображение это кажется неверным:
Также желтый (1, 1, 0) и пурпурный (1, 0, 1) имеют одинаковое расстояние 1 от белого ] (1, 1, 1) , что, похоже, тоже не имеет смысла:
Я думаю, можно с уверенностью предположить, что аналоговые метрики для HSL и HSV цвета схемы имеют те же проблемы. Эти цветовые схемы не предназначены для сравнения цветов.
К счастью, есть ученые, которые уже пытаются найти хороший способ сравнения цветов. Они придумали несколько сложных методов, последний из которых - 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
Этот алгоритм имеет некоторые проблемы:
Расстановка цветов не оптимальна. Если представить цвета как числа в строке, три числа будут оптимально размещены следующим образом:
| a ----- b ----- c |
Добавление еще одного числа без перемещения a, b и c явно хуже, чем перестановка всех цветов.
Работа алгоритма не гарантируется .Что делать, если нет цвета, который достаточно далек от существующих цветов в списке? Цикл будет продолжаться вечно
Что ж ... У меня его нет.
Вы хотите преобразовать в HSL, а затем перебирать значения оттенка (H), сохраняя при этом другие 2 значения постоянными.
Для каждого значения вы конвертируете из HSL обратно в RGB .
См. Мои ответы здесь и здесь .
Если ваш N очень большой и, следовательно, цвета НЕ различимы визуально, вы можете в этот момент повторить итерацию по всем одним и тем же оттенкам и изменить другие компоненты, чтобы изменить насыщенность или яркость.Таким образом, у вас может быть максимальное количество значений оттенка для использования, и как только оно будет достигнуто, вы можете начать заново с другой насыщенностью или яркостью.