Ладно, думаю, я знаю, к чему вы клоните. Я не пробовал запускать ничего из этого, так что, вероятно, в нем есть какие-то ошибки ...
Сначала вам нужно определить значения HSV для красного, зеленого, синего и белого цветов. Назовите их, по часовой стрелке, a, b, c, d - например, белый цвет будет [0,0,1] или что-то в этом роде.
Для позиции в сетке (x,y)
с 0 <= x <= 1
Бит интерполяции похож на помещение значений в массив out
:
for(int i=0; i<3; i++){
out[i] = y*((x*a[i]) + ((1-x)*b[i])) + (1-y)*((x*d[i]) + ((1-x)*c[i]));
}
При нахождении линейно интерполированного значения доля x между A и B равна x*A + (1-x)*B
. Просто сделайте это по одному разу для каждого направления.
Затем просто конвертируйте их в RGB, используя соглашение из статьи в Википедии.
void HSVtoRGB(double H, double S, double V, double[] out){
double C = S*V;
double H_prime = H/60; // a number in [0,3]
double X = C*(1 - abs((H_prime%2)-1));
// Do the big if bit
switch((int)X){
case 0:
out[0] = C;
out[1] = X;
out[2] = 0;
case 1:
out[0] = X;
out[1] = C;
out[2] = 0;
// etc etc
}
double m = V - C;
for(int i=0; i<3; i++){
out[i] += m;
}
}
Это должно сделать это, плюс-минус. Ну, должно дать вам хотя бы приблизительное представление.
person
Lucas
schedule
21.10.2012