Как получить спектр в RGB?

migel

очень нужно (по возможности простое) отображение из [0,1] в R3 с такими свойствами:
когда аргумент пробегает отрезок, образ пробегает цвета из спектра в RGB кодировке (т.е. красный, желтый и т.д). Можно необязательно строго такие цвета, главное чтобы разноцветно и более-менее приятно для глаза.
Может кто-нибудь знает такое?

margadon

где-то в инете я видел графики для цветовой восприимчивости глаза к компонентам R G B света... Может ими и отобразишь отрезок в куб?

Marinavo_0507

я в детстве по таким графикам делал
получалось похоже, но не очень

bleyman

А причём тут они?
Рекомендую найти какую-нить программу где отображение именно из R (а не из R2 как в фотошопе) (о! В фотошопе есть фильтр на hue/saturation, вот там отображение из R далее взять кулхацкерскую прогу dotColor и посмотреть какие там цвета.

margadon

ну, первое что в голову пришло Вроде там снизу нарисован спектр, а сверху интенсивности видимых компонент... вроде то что надо Или я туплю

maggi14

например:
r = (sin(x/2pi) / sqrt(2 * max_r
g = (cos(x/2pi) / sqrt(2 * max_g
b = (1 - r/max_r - g/max_g) * max_b
- сойдет?

yolki

Выбери палитру из N цветов - и дальше кусочно-линейно интерполируй.
могу дать программулю для проектирования палитры:

Maurog

давай
только мне нужны реальные формулы
а не просто видимость цвета)
буду очень благодарен
то есть хочу уметь из желтого в зеленый и из зеленого сразу в красный..и чтобы использовать в итоге 250 цветов

yolki

Пусть у нас есть палитра из N цветов...

TCMYKColor BlendColor(double x,double min,double max,TCMYKColor *palette, int N)
{
int t;
double tau,xn,h;
TCMYKColor c={0,0,0,0};
if(x<-1e50) return cur_color;
if(min==max) return palette[0];
h=(max-min)/(N-1);
t=(x-min)/h;
if(t<0) { printf("Warning!: %lf (%lf,%lf) --> %d\n",x,min,max,t); t=0; }
if (t>=N-1) {printf("Warning!: %lf (%lf,%lf) --> %d\n",x,min,max,t); t=N-2; }
xn=min+h*t;
tau=(x-xn)/h;
c.C=palette[t].C*(1-tau)+palette[t+1].C*tau;
c.M=palette[t].M*(1-tau)+palette[t+1].M*tau;
c.Y=palette[t].Y*(1-tau)+palette[t+1].Y*tau;
c.K=palette[t].K*(1-tau)+palette[t+1].K*tau;
return c;
}
на RGB сам переделаешь?
Этот метод даёт непрерывную палитру
в три цвета: {0,255,0}-{255,255,0}-{255,0,0} получается такая палитра:

Maurog

TCMYKColor *palette
вот етот аргумент меня убьет (не исопльзую я его)
мне сразу из трех параметров желтый, красный, зеленый и 250 сделать равномерные переходы от желтого к красному и от красного к зеленому...250 цветов

Maurog

да ты мне просто линейную херню даешь, мне такое не надо
а меня интересует формула построения такой палитры

bleyman

гы гы.
Это ты хочешь вполне непрерывное отображение квадрата в отрезок, так что ли?
Ну-ну.

Maurog

нет
я хочу по трем цветам сделать массив цветов из 250 элементов, чтобы переходы были плавные от 1го цвета ко второму и от второго к третьему
банальная задача

yolki

Чё-то я тебя не понял..
Цвета распределяются очень даже линейно... нехочешь линейную палитру - выдумывай сам...
Вот распределение для запощеной палитры в 8 и 16 цветов

Maurog

да мне просто формула нужна
есть три цвета..и есть 250
нужна формула, а не рисунки
ибо я сам рисовать собираюсь

yolki


struct RGB {
int r,g,b;
};

struct RGB mypal[250]=
{
{255,0,0},{255,2,0},{255,4,0},{255,6,0},{255,8,0},{255,10,0},{255,12,0},{255,14,0},
{255,16,0},{255,18,0},{255,20,0},{255,22,0},{255,24,0},{255,26,0},{255,28,0},{255,30,0},
{255,32,0},{255,34,0},{255,36,0},{255,38,0},{255,40,0},{255,42,0},{255,45,0},{255,47,0},
{255,49,0},{255,51,0},{255,53,0},{255,55,0},{255,57,0},{255,59,0},{255,61,0},{255,63,0},
{255,65,0},{255,67,0},{255,69,0},{255,71,0},{255,73,0},{255,75,0},{255,77,0},{255,79,0},
{255,81,0},{255,83,0},{255,85,0},{255,87,0},{255,89,0},{255,91,0},{255,93,0},{255,95,0},
{255,97,0},{255,99,0},{255,101,0},{255,103,0},{255,105,0},{255,107,0},{255,109,0},
{255,111,0},{255,113,0},{255,115,0},{255,117,0},{255,119,0},{255,121,0},{255,123,0},
{255,125,0},{255,128,0},{255,130,0},{255,132,0},{255,134,0},{255,136,0},{255,138,0},
{255,140,0},{255,142,0},{255,144,0},{255,146,0},{255,148,0},{255,150,0},{255,152,0},
{255,154,0},{255,156,0},{255,158,0},{255,160,0},{255,162,0},{255,164,0},{255,166,0},
{255,168,0},{255,170,0},{255,172,0},{255,174,0},{255,176,0},{255,178,0},{255,180,0},
{255,182,0},{255,184,0},{255,186,0},{255,188,0},{255,190,0},{255,192,0},{255,194,0},
{255,196,0},{255,198,0},{255,200,0},{255,202,0},{255,204,0},{255,206,0},{255,208,0},
{255,210,0},{255,212,0},{255,215,0},{255,217,0},{255,219,0},{255,221,0},{255,223,0},
{255,225,0},{255,227,0},{255,229,0},{255,231,0},{255,233,0},{255,235,0},{255,237,0},
{255,239,0},{255,241,0},{255,243,0},{255,245,0},{255,247,0},{255,249,0},{255,251,0},
{255,253,0},{255,255,0},{253,255,0},{251,255,0},{249,255,0},{247,255,0},{245,255,0},
{243,255,0},{241,255,0},{239,255,0},{237,255,0},{235,255,0},{233,255,0},{231,255,0},
{229,255,0},{227,255,0},{225,255,0},{223,255,0},{221,255,0},{219,255,0},{217,255,0},
{215,255,0},{212,255,0},{210,255,0},{208,255,0},{206,255,0},{204,255,0},{202,255,0},
{200,255,0},{198,255,0},{196,255,0},{194,255,0},{192,255,0},{190,255,0},{188,255,0},
{186,255,0},{184,255,0},{182,255,0},{180,255,0},{178,255,0},{176,255,0},{174,255,0},
{172,255,0},{170,255,0},{168,255,0},{166,255,0},{164,255,0},{162,255,0},{160,255,0},
{158,255,0},{156,255,0},{154,255,0},{152,255,0},{150,255,0},{148,255,0},{146,255,0},
{144,255,0},{142,255,0},{140,255,0},{138,255,0},{136,255,0},{134,255,0},{132,255,0},
{130,255,0},{128,255,0},{125,255,0},{123,255,0},{121,255,0},{119,255,0},{117,255,0},
{115,255,0},{113,255,0},{111,255,0},{109,255,0},{107,255,0},{105,255,0},{103,255,0},
{101,255,0},{99,255,0},{97,255,0},{95,255,0},{93,255,0},{91,255,0},{89,255,0},
{87,255,0},{85,255,0},{83,255,0},{81,255,0},{79,255,0},{77,255,0},{75,255,0},
{73,255,0},{71,255,0},{69,255,0},{67,255,0},{65,255,0},{63,255,0},{61,255,0},
{59,255,0},{57,255,0},{55,255,0},{53,255,0},{51,255,0},{49,255,0},{47,255,0},
{45,255,0},{43,255,0},{40,255,0},{38,255,0},{36,255,0},{34,255,0},{32,255,0},
{30,255,0},{28,255,0},{26,255,0},{24,255,0},{22,255,0},{20,255,0},{18,255,0},
{16,255,0},{14,255,0},{12,255,0},{10,255,0},{8,255,0},{6,255,0}
};
Нормально?

Maurog

да, это клева, но нужна формула )

margadon

блин, не парь народу мозги...
формулу он дал в приведённой выше функции. Простая линейная интерполяция. Если ты этого не можешь сделать сам, то тебе такое задание не осилить

Maurog

да ето фигня
от цвета 1 к цвету 2 линейно, потом от цвета 2 к 3 линейно, но я расчитывал, что есть что-то умнее

bleyman

ыыы
Можешь кубически переходить, если хочешь.
Оставить комментарий
Имя или ник:
Комментарий: