Pull to refresh

Спектр видимого излучения в компьютерной графике

Reading time3 min
Views9.4K
RGB

Одним из основных режимов представления цвета в компьютерной графике является режим RGB — смесь красного, зеленого и синего. Чтобы задать какой либо цвет необходимо присвоить трем переменным R, G, B значения от 0 до 255. Таким образом, можно получить цвет любого оттенка, любой яркости.

Представление некоторых цветов в режиме RGB
• (255,0,0) image
• (0,255,0) image
• (255,255,0) image
• (0,0,255) image
• (0,255,255) image
• (255,0,255) image

Физическое представление цвета

Свет представляет собой э/м волну с интервалом длин волн: 380-760 нм.
В статье мы будем использовать представление света с помощью длины волны.
Из физических наблюдений известно, что красный цвет лежит в интервале длин волн (610;760), оранжевый — (590;610), желтый — (570;590), зеленый — (540;570), голубой — (510;540), синий — (480;510), фиолетовый — (380;480) нм.

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

image
Поэтому в нашем методе мы, используя опытные данные, определим в каком из интервалов цвета находится вводимая длина волны, а далее по полученному эмпирическому соотношению её можно перевести в режим RGB.
Рассмотрим перевод длины волны в RGB для зеленого цвета. Мы знаем, что зеленый цвет лежит в интервале (540;570). Предположим истинный зеленый цвет приходится на длину волны, лежащую в центре данного интервала: 555 нм. Поэтому при данной длине волны в режиме RGB он будет выглядеть так (0,255,0). При увеличении длины волны зеленый цвет плавно переходит в желтый (255,255,0). На границе этих двух цветов т.е. примерно при длине волны в 570 нм RGB представление будет иметь вид (127,255,0). Для этого интервала можно записать формулы перехода от длины волны к количеству красного, зеленого, синего в режиме RGB.
Анализируя границы указанного интервала длин волн можно заметить, что в нем не присутствует синяя составляющая, поэтому можно сразу записать: B=0. Также видно, что не изменяется зеленая составляющая G=255. А вот для красной составляющей запишем R=[127.5*(lamda-555)/(570-555)], где [] — операция извлечения целой части. Выражение не упрощено для сохранения смысла построения зависимости.
При попадании длины волны в интервал (540,555) зеленый цвет плавно переходит в голубой.
На левой границе этого интервала цвет в режиме RGB имеет вид: (0,255,127). Сравнивая левую(0,255,127) и правую(0,255,0) границу интервала, имеем R=0, G=255
А количество синей составляющей (B) уменьшается от 127 до 0. Переход можно осуществить по следующей формуле: R=[127.5*(1-(lamda-540)/(555-540))]
Используя вышеописанный принцип можно получить формулы перехода для всех интервалов спектра, и реализовать их в виде функций для каждой составляющей.

Реализация

function Red(l:integer):byte;
var n:byte;
begin
if (l>560)and(l<=760) then n:=255;
if (l>495)and(l<=555) then n:=0;
if (l>570)and(l<=580) then n:=round(127.5+127.5*(l-570)/10);
if (l>555)and(l<=570) then n:=round(127.5*(l-555)/15);
if (l>480)and(l<=495) then n:=round(127.5-127.5*(l-480)/15);
if (l>380)and(l<=480) then n:=round(255-127.5*(l-380)/100);
Red:=n;
end;

function Blue(l:integer):byte;
var n:byte;
begin
if (l>380)and(l<=525) then n:=255;
if (l>555)and(l<=760) then n:=0;
if (l>540)and(l<=555) then n:=round(127.5-127.5*(l-540)/15);
if (l>525)and(l<=540) then n:=round(255-127.5*(l-525)/15);
Blue:=n;
end;

function Green(l:integer):byte;
var n:byte;
begin
if (l>525)and(l<=580) then n:=255;
if (l>380)and(l<=495) then n:=0;
if (l>610)and(l<=760) then n:=round(63.5-63.5*(l-610)/150);
if (l>600)and(l<=610) then n:=round(127.5-63.5*(l-600)/10);
if (l>590)and(l<=600) then n:=round(190.5-63.5*(l-590)/10);
if (l>580)and(l<=590) then n:=round(255-63.5*(l-580)/10);
if (l>495)and(l<=510) then n:=round(127.5*(l-495)/15);
if (l>510)and(l<=525) then n:=round(127.5+127.5*(l-510)/15);
Green:=n;
end;

procedure TForm1.FormDblClick(Sender: TObject);
var n,k:integer;
begin
for k:=20 to 360 do
for n:=760 to 1520 do
form1.Canvas.pixels[n-760,k]:= RGB(Red(round(n/2)),Green(round(n/2)),Blue(round(n/2)));
end;

...


Результаты показаны ниже:
image

Применяя к построению определенные условия, можно получить спектр испускания атома водорода:
image
Tags:
Hubs:
+7
Comments7

Articles

Change theme settings