LINUX.ORG.RU

алгоритм генерации цветов


0

1

Не смог даже нормальный заголовок придумать. Смысл вот в чем:

Мне нужно придумать алгоритм нахождения заранее заданного количества максимально отличных друг от друга цветов(rgb). Например 40 разных цветов или 64, при этом они должны быть контрастными на заранее заданном фоне( сейчас темно-зеленый). Уже пол дня над этим думаю(в фоновом режиме) и ничего толкового в голову не приходит.

//На худой конец хотя бы просто 64 цвета нагенерить отличных друг от друга и при этом контрастных на темно-зеленом. Руками(«ff00ff00»,«ffff0000»,«ffffaa00»,«ff00ffaa»,«ffdd00dd») пока что вышло около 15ти цветов, могу наверное до 20ти - 30ти догнать, но 64 руками мне не осилить... а если еще и базовый цвет сменить надо будет, то это же все заново.

[br]
for (int b = 255; b > 90; b -= 40)
   for (int g = 255; g > 90; g -= 40)
        for (int r = 255; r > 90; r -= 40)
         {
              colors2[clri] = "ff" + r.ToString("x") + g.ToString("x") + b.ToString("x");
              clri++;
         }


Написанное за 5 минут на коленке чудо результаты дает примерно такие же

★★★★★

Последнее исправление: Loki13 (всего исправлений: 2)

Придумалась такая идея.

Берешь трехмерное HSV пространство. Вот такое: en.wikipedia.org/wiki/File:HSV_color_solid_cone_chroma_gray.png

Берешь в нем точку твоего фонового цвета. И пытаешься расположить N других точек так, чтобы они были как можно дальше от фоновой точки и как можно дальше друг от друга.

geekless ★★
()

man Теория цвета

И geekless правильно говорит.

// я было думал, что это тред про алгоритмическую ботанику

buddhist ★★★★★
()
Ответ на: комментарий от geekless

С точки зрения теории идея интересная, но с какой стороны к реализации подходить... 64 равноудаленные от центра и равномерно расположенные на (полу)окружности точки? Сложновато имхо, хотя может так кажется только

Loki13 ★★★★★
() автор топика

все правильно говорят, hsv, цвет рандомом и lightness+saturation, т.е. (псевдокод)

color = Color(rand(), rand(), rand())

color.lightness(0.6).saturation(0.5)

играйся параметрами под свой фон и т.п. kiss.

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

А зачем тут рандом? Цвет от которого плясать известен, хотя можно пренебречь этим и взять черный. Мне большую сложность представляет сделать равноудаленные друг от друга 50 цветов, причем желательно на поверхности hsv по максимуму, т.е. не блеклые.

//вообще цель - выбор цветов для ярких меток(30-70 штук) на карте googleearth. карта России в большинстве своем темно-зеленая, поэтому такой исходный

Loki13 ★★★★★
() автор топика
Ответ на: комментарий от Loki13

ну думай дальше. рандом тут как пример, я тебе не задачу решал, я показывал как делают, например

trashymichael ★★★
()

Как-то так (gencolors.vala):

int main(string[] args)
    {
    if(args.length!=3)
        {
        stderr.printf("Call: gencolors count rrggbb\n");
        return 1;
        }

    var colors_count=double.parse(args[1]);
    int base_r=0, base_g=0, base_b=0;
    args[2].scanf("%2x%2x%2x", ref base_r, ref base_g, ref base_b);

    var divisor=Math.cbrt(colors_count) + 1.0; /* cube root */
    var step_r=(255 - base_r) / (int)divisor;
    var step_g=(255 - base_g) / (int)divisor;
    var step_b=(255 - base_b) / (int)divisor;
    for(int r=255; r >= base_r + step_r; r-=step_r)
        {
        for(int g=255; g >= base_g + step_g; g-=step_g)
            {
            for(int b=255; b >= base_b + step_b; b-=step_b)
                {
                stdout.printf("%02x%02x%02x\n", r, g, b);
                }
            }
        }

    return 0;
    }

Ну и запускать: gencolors 40 007f00

Цветов получится больше, чем задано, но больше - не меньше :)

cdslow ★★
()
Ответ на: комментарий от cdslow

Вот спасибо. Больше не меньше - выберу :)

Loki13 ★★★★★
() автор топика

Копать в сторону моделей HSV/HSB/HSL.

observer ★★★
()

Посмотри раскраску графа с заранее заданным числом вершин, расположение которых выбирается, например, «жадным алгоритмом», максимизирующем цветовые расстояния рёбер. Внизу есть ссылки на частные случаи (Other colorings).
Ещё загляни на Graph Coloring Page.

quickquest ★★★★★
()
Ответ на: комментарий от buddhist

Не покатит, вы забываете про контрастность. Черный с темно-зеленым не контрастирует, ergo HSV недо дробить на части и выбирать максимально удаленные из определенных частей.

malbolge ★★
()
perl -MList::Util=min,max -e 'sub f{255^max 0,min 255,abs($_[0])-255}printf"#%02x%02x%02x\n",255^f($_-765),f($_-510),f($_-1020)for 0..1529'

# вроде так %)

arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.