Мой предпочтительный метод для этого - найти n
равномерно расположенных точек вдоль цветового круга.
Мы представляем цветовое колесо как диапазон значений от 0 до 360. Таким образом, мы будем использовать следующие значения: 360 / n * 0
, 360 / n * 1
, ..., 360 / n * (n - 1)
. При этом мы определили оттенок каждого из наших цветов. Мы можем описать каждый из этих цветов как цвета Hue-Saturation-Value (HSV), установив насыщенность на 1 и яркость на 1.
(Более высокая насыщенность означает, что цвет более «насыщенный»; более низкая насыщенность означает, что цвет ближе к серому. Более высокая яркость означает, что цвет «ярче»; более низкая яркость означает, что цвет «темнее».)
Теперь простой расчет дает нам значения RGB каждого из этих цветов.
http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_HSV_to_RGB
Обратите внимание, что приведенные уравнения могут быть упрощены:
- p = v * (1 - s) = 1 * (1 - 1) = 1 * 0 = 0
- q = v * (1 - f * s) = 1 * (1 - f * 1) = 1 - f
- t = v * (1 - (1 - f) * s) = 1 * (1 - (1 - f) * 1) = 1 - (1 - f) = 1 - 1 + f = f
Реализация псевдокода в Python
Примечание: Это намеренно ужасно неэффективная реализация. Суть этого примера в Python заключается в том, чтобы я мог дать исполняемый псевдокод.
import math
def uniquecolors(n):
"""Compute a list of distinct colors, each of which is represented as an RGB 3-tuple."""
hues = []
# i is in the range 0, 1, ..., n - 1
for i in range(n):
hues.append(360.0 / i)
hs = []
for hue in hues:
h = math.floor(hue / 60) % 6
hs.append(h)
fs = []
for hue in hues:
f = hue / 60 - math.floor(hue / 60)
fs.append(f)
rgbcolors = []
for h, f in zip(hs, fs):
v = 1
p = 0
q = 1 - f
t = f
if h == 0:
color = v, t, p
elif h == 1:
color = q, v, p
elif h == 2:
color = p, v, t
elif h == 3:
color = p, q, v
elif h == 4:
color = t, p, v
elif h == 5:
color = v, p, q
rgbcolors.append(color)
return rgbcolors
Краткая реализация в Python
import math
v = 1.0
s = 1.0
p = 0.0
def rgbcolor(h, f):
"""Convert a color specified by h-value and f-value to an RGB
three-tuple."""
# q = 1 - f
# t = f
if h == 0:
return v, f, p
elif h == 1:
return 1 - f, v, p
elif h == 2:
return p, v, f
elif h == 3:
return p, 1 - f, v
elif h == 4:
return f, p, v
elif h == 5:
return v, p, 1 - f
def uniquecolors(n):
"""Compute a list of distinct colors, ecah of which is
represented as an RGB three-tuple"""
hues = (360.0 / n * i for i in range(n))
hs = (math.floor(hue / 60) % 6 for hue in hues)
fs = (hue / 60 - math.floor(hue / 60) for hue in hues)
return [rgbcolor(h, f) for h, f in zip(hs, fs)]