2012-02-29 4 views
3

Я портирую кусок кода MATLAB в C/C++, и мне нужно сопоставить много цветов RGB в графе с целым интервалом.Отображение цветов до интервала

Пусть [-1; 1] - это интервал, в котором функция может иметь значение в, мне нужно отобразить -1 и любое число под ним до цвета, +1 и любого числа над ним другому цвету, любое число между -1 и +1 до другого цвета, промежуточного между границами. Очевидно, что числа бесконечны, поэтому я не беспокоюсь о том, сколько цветов я собираюсь отображать, но было бы здорово, если бы я мог отображать по меньшей мере 40-50 цветов в нем.

Я думал о разделении интервала [-1; 1] на X поддиапазонов и отображать каждый из них в цвет RGB, но это звучит ужасно скучно и долго.

Есть ли другой способ достичь этого? А если нет, как мне это сделать в C/C++?

ответ

0

Вот плохое решение. Определите функцию, которая принимает вход, x, который является поплавком (или двойным) и возвращает триплет целых чисел каждый в диапазоне 0-255. Этот триплет - это, конечно же, спецификация цвета RGB.

Функция имеет 3 части;

if x<=-1 f[x] = {0,0,0} 

if x>= 1 f[x] = {255,255,255} 

if -1<x<1 f[x] = {floor(((x + 1)/2)*255),floor(((x + 1)/2)*255),floor(((x + 1)/2)*255)} 

Я не очень хорошо писать на C++, так что я оставлю это как псевдокод, вы не должны иметь слишком много проблемы, поворачивая его в правильный код.

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

Для этого я обвиняю цветовое пространство RGB, это плохо подходит для такого рода простых вычислений «соседних» цветов.

+0

Это на самом деле дают черно-белый градиент, я думаю, что с помощью различных оттенков серого. – Joel

5

Если производительность не является проблемой, то я бы сделал что-то похожее на то, что предложил High Performance Mark, за исключением, может быть, сделать это в HSV color space: Максимально привязать значения S и V и изменить значение H линейно в определенном диапазоне :

s = 1.0; v = 1.0; 
if(x <= -1){h = h_min;} 
else if(x >= 1){h = h_max;} 
else {h = h_min + (h_max - h_min)*0.5*(x + 1.0);} 

// then convert h, s, v back to r, g, b - see the wikipedia link 

Если производительность является проблемой (например, вы пытаетесь обрабатывать видео в режиме реального времени или что-то), а затем рассчитать значения RGB раньше времени и загружать их из файла в виде массива. Тогда просто отобразить значение x с индексом:

int r, g, b; 
int R[NUM_COLORS]; 
int G[NUM_COLORS]; 
int B[NUM_COLORS]; 

// load R, G, B from a file, or define them in a header file, etc 

unsigned int i = 0.5*(x + 1.0); 
i = MIN(NUM_COLORS-1, i); 

r = R[i]; g = G[i]; b = B[i]; 
+2

HSV - это в значительной степени стандартный выбор для манипулирования цветами программно, не сходя с ума. – pmr

+0

HSV также имеет то преимущество, что наши глаза работают лучше, чем RGB. – Joel

Смежные вопросы