Список литературы[1] Ньюмен У., Спрулл Р. Основы интерактивной машинной графики. Пер. с англ. М.: Мир, 1976. [2] Роджерс Д. Алгоритмические основы машинной графики. Пер. с англ. М.: Мир, 1989. [3] Фоли Дж., вэн Дэм А. Основы интерактивной машинной графики: В 2-х книгах. Пер. с англ. М.: Мир, 1985. [4] Encarnacao J. Einfuerung in die Graphische Datenverarbeiterung// Eurographics '89. Tutorial Notes 1. Hamburg, FRG, September 4-8, 1989. 122 s. [5] Антонофф Майкл, Линдерхолм Оуэн. Лазерные принтеры// Компьютер Пресс, сборник N 1, 1989, с. 3-8. [6] Винцюк Т.К. Системы речевого диалога// Материалы пятой школы-семинара "Интерактивные системы" (Кутаиси, 2-10 апреля 1983 г.). Тбилиси: Мецниереба, 1983, с. 16-22. [7] Печатающие устройства персональных ЭВМ: Справочник// Под редакцией проф. И.М.Витенберга. М.: Радио и связь, 1992. [8] Лисицин Б.Л. Низковольтные индикаторы: Справочник. М.: Радио и связь, 1985. [9] Справочник по машинной графике в проектировании/ В.Е.Михайленко, В.А.Анпилогова, Л.А.Кириевский и др.: Под ред. В.Е.Михайленко. А.А.Лященко. Киев: Будiвельник, 1984. 184 с. [10] Мячев А.А, Степанов В.Н. Персональные ЭВМ и микроЭВМ. Основы организации: Справочник/ Под ред. А.А.Мячева. М.: Радио и связь, 1991. [11] Новаковский С.В. Цвет в цветном телевидении. М.: Радио и связь, 1988. 288 с. [12] Павлидис Т. Алгоритмы машинной графики и обработки изображений. Пер. с англ. М.: Радио и связь, 1986. [13] Роджерс Д., Адамс Дж. Математические основы машинной графики Пер. с англ. М.: Машиностроение, 1980. [14] Сизых В.Г. Растровые дисплеи ряда Гамма. Новосибирск, 1985. 26 с. (Препринт ВЦ СО АН СССР; 607). [15] Ткаченко А.П. Цветное телевидение. Минск: Беларусь, 1981. 253 с. [16] Фролов А.В., Фролов Г.В. Программирование видеоадаптеров CGA, EGA, VGA. M.: Диалог-МИФИ, 1992. [17] Joseph Hans, Mehl Max. Computer Graphics Hardware: Introduction and State of the Art// Eurographics '91. Tutorial Note 9. Viena, 2.-6. September 1991. Austria, Viena. 29 p. [18] Fontenier Guy and Gros Pascal. Architectures of Graphic Processors for Interactive 2D Graphics// Computer Graphics Forum 7 (1988) 78-89. [19] Pinkman R., Novak M., Guttag K. Video-RAM exels at fast graphics// Electronics Design, pp. 161-171 (August 18 1983). [20] Seidel H.-P. PC Graphics Hardware // Eurographics '88. Tutorial/Cours 8.-Nice, 12.-16. September 1988. France, Nice. 44 p. [21] Stralunsfreier Flacbildschirm. MC, Die MikrocomputerZeitschrift. 8, 1989, s. 66. 0.14 Приложение 1. Преобразование моделей цветов В данном приложении приведены процедуры перевода из RGB в HSV и наоборот и процедуры перевода из RGB в HLS и наоборот, соответствующие процедурам из [Род89] и [Фол85]. В процедурах используется вещественная арифметика. Переход на целочисленную арифметику, более подходящую для реальных применений, может быть выполнен определением констант для максимальных значений координат цвета - R,G,B, оттенка (hue), насыщенности (saturation), светлоты (value или lightness) и соответствующей модификацией текстов процедур. /*==================================================== RGB_HSV * Преобразования из модели HSV в RGB и наоборот */
#include <stdio.h>
#define UNDEFINED -1.0 /* Неопределенное значение для Hue */ 0.14.1 V_HSVRGB - перевод из HSV в RGB /*--------------------------------------------------- V_HSVRGB * Переводит из модели HSV в модель RGB * * void V_HSVRGB (float *r, float *g, float *b, * float hue, float sat, float val) * * Вход: * 0 <= hue <= 360 градусов - оттенок. Основные цвета: * 0 - красный, 60 - желтый, * 120 - зеленый, 180 - голубой * 240 - синий, 300 - пурпурный * Остальные цвета между ними * 0.0 <= sat <= 1.0 - Saturation - насыщенность * 0.0 <= val <= 1.0 - Value - светлота * * Выход: * 0.0 <= r,g,b <= 1.0 - значения красного, зеленого, синего * V_HSVRGB= 0 - норма * 1/2/3 - ошибка в hue/ошибка в sat/ошибка в val */
int V_HSVRGB (r, g, b, hue, sat, val) float *r, *g, *b, hue, sat, val; { int ii, otw; float c1, c2, c3, fr;
otw= 0; if (sat == 0.0) { /* Ахроматический цвет */ *r= val; *g= val; *b= val; if (hue != UNDEFINED) ++otw; } else { /* Хроматический цвет */ hue-= (ii= (int)(hue/360.0)) * 360.0; if (ii < 0) hue= -hue; ii= (int)(hue /= 60.0); fr= hue - ii; c1= val*(1.0 - sat); c2= val*(1.0 - sat*fr); c3= val*(1.0 - sat*(1.0 - fr)); switch (ii) { case 0: *r= val; *g= c3; *b= c1; break; case 1: *r= c2; *g= val; *b= c1; break; case 2: *r= c1; *g= val; *b= c3; break; case 3: *r= c1; *g= c2; *b= val; break; case 4: *r= c3; *g= c1; *b= val; break; case 5: *r= val; *g= c1; *b= c2; break; } } return (otw); } /* V_HSVRGB */ 0.14.2 V_RGBHSV - перевод из RGB в HSV /*--------------------------------------------------- V_RGBHSV * Переводит из модели RGB в модель HSV * * void V_RGBHSV (float r, float g, float b, * float *hue, float *sat, float *val) * * Вход: * 0.0 <= r,g,b <= 1.0 - значения красного, зеленого, синего * * * Выход: * 0 <= hue <= 360 градусов - оттенок. Основные цвета: * 0 - красный, 60 - желтый, * 120 - зеленый, 180 - голубой * 240 - синий, 300 - пурпурный * Остальные цвета между ними * 0.0 <= sat <= 1.0 - Saturation - насыщенность * 0.0 <= val <= 1.0 - Value - светлота * * V_RGBHSV= 0 - норма * 1/2/3 - ошибка в r/ошибка в g/ошибка в b */
int V_RGBHSV (r, g, b, hue, sat, val) float r, g, b, *hue, *sat, *val; { int otw; float minc, maxc, h, s, v, dmax, rc, gc, bc;
otw= 0; if (r < 0.0 || r > 1.0) ++otw; /* Проверки значений */ if (g < 0.0 || g > 1.0) otw= 2; if (b < 0.0 || b > 1.0) otw= 3; if (!otw) { if ((maxc= r) < b) maxc= b; /* Поиск макс значения */ if (maxc < g) maxc= g; if ((minc= r) > b) minc= b; /* Поиск мин значения */ if (minc > g) minc= g; s= 0.0; /* Насыщенность */ if (maxc != 0.0) s= (maxc-minc)/maxc; if (s == 0.0) h= UNDEFINED; /* Ахроматический цвет */ else { /* Хроматический цвет */ dmax= maxc-minc; rc= (maxc-r)/dmax; /* rc - удаленность */ gc= (maxc-g)/dmax; /* цвета от красного */ bc= (maxc-b)/dmax; if (r == maxc) h= bc-gc; else /* Цвет между жел- */ /* тым и пурпурным */ if (g == maxc) h= 2+rc-bc; else /* Цвет между голу-*/ /* бым и желтым */ h= 4+gc-rc; /* Цвет между пур- */ /* пурным и голубым*/ if ((h*= 60.0) < 0.0) h+= 360.0; } *hue= h; *sat= s; *val= maxc; } return (otw); } /* V_RGBHSV */ 0.14.3 Тест процедур V_HSVRGB и V_RGBHSV /*----------------------------------------------- MAIN RGB_HSV * Тестовая программа проверки прдпрограмм * преобразований из системы HSV в RGB и наоборот. */
void main(void) { int ii; float r, g, b, r1, g1, b1, hue, sat, val;
r= 0.0; g= 0.0; b= 0.0; hue= 0.0;
m0:printf ("HSV r,g,b= (\%f \%f \%f) ? ", r,g,b); scanf ("\%f\%f\%f", &r, &g, &b); ii= V_RGBHSV (r, g, b, &hue, &sat, &val); printf ("V_RGBHSV: otw=\%d hue=\%f sat=\%f val=\%f ", ii, hue, sat, val); ii= V_HSVRGB (&r1, &g1, &b1, hue, sat, val); printf ("V_HSVRGB: otw=\%d r=\%f g=\%f b=\%f ", ii, r1, g1, b1); goto m0; }
/*==================================================== RGB_HLS * Преобразования из модели HLS в RGB и наоборот */
#include <stdio.h>
#define UNDEFINED -1.0 /* Неопределенное значение для Hue */ 0.14.4 V_HLSRGB - перевод из HLS в RGB /*--------------------------------------------------- V_HLSRGB * Переводит из модели HLS в модель RGB * * void V_HLSRGB (float *r, float *g, float *b, * float hue, float sat, float lig) * * Вход: * 0 <= hue <= 360 градусов - оттенок. Основные цвета: * 0 - красный, 60 - желтый, * 120 - зеленый, 180 - голубой * 240 - синий, 300 - пурпурный * Остальные цвета между ними * 0.0 <= sat <= 1.0 - Saturation - насыщенность * 0.0 <= lig <= 1.0 - Value - светлота * * Выход: * 0.0 <= r,g,b <= 1.0 - значения красного, зеленого, синего * V_HLSRGB= 0 - норма * 1/2/3 - ошибка в hue/ошибка в sat/ошибка в lig */
static float VAL_RGB (n1, n2, hue) float n1, n2, hue; { float otw; if (hue < 0) hue+= 360.0; hue= hue - ((int)(hue/360.0)) * 360.0; if (hue < 60.0) otw= n1+(n2-n1)*hue/60.0; else if (hue < 180.0) otw= n2; else if (hue < 240.0) otw= n1+(n2-n1)*(240.0-hue)/60.0; else otw= n1; return (otw); } /* VAL_RGB */
int V_HLSRGB (r, g, b, hue, sat, lig) float *r, *g, *b, hue, sat, lig; { int otw; float m1, m2;
otw= 0; if (sat == 0.0) { /* Ахроматический случай */ if (hue == UNDEFINED) { *r= lig; *b= lig; *g= lig; } else ++otw; } else { /* Хроматический случай */ if ((m2= lig) > 0.5) m2= 1.0 - lig; m2= lig + sat*m2; m1= 2*lig - m2; *r= VAL_RGB (m1, m2, hue+120.0); *g= VAL_RGB (m1, m2, hue); *b= VAL_RGB (m1, m2, hue-120.0); } return (otw); } /* V_HLSRGB */ 0.14.5 V_RGBHLS - перевод из RGB в HLS /*--------------------------------------------------- V_RGBHLS * Переводит из модели RGB в модель HLS * * void V_RGBHLS (float r, float g, float b, * float *hue, float *sat, float *lig) * * Вход: * 0.0 <= r,g,b <= 1.0 - значения красного, зеленого, синего * * * Выход: * 0 <= hue <= 360 градусов - оттенок. Основные цвета: * 0 - красный, 60 - желтый, * 120 - зеленый, 180 - голубой * 240 - синий, 300 - пурпурный * Остальные цвета между ними * 0.0 <= sat <= 1.0 - Saturation - насыщенность * 0.0 <= lig <= 1.0 - Value - светлота * * V_RGBHLS= 0 - норма * 1/2/3 - ошибка в r/ошибка в g/ошибка в b */
int V_RGBHLS (r, g, b, hue, sat, lig) float r, g, b, *hue, *sat, *lig; { int otw; float minc, maxc, h, s, l, dm, rc, gc, bc;
otw= 0; if (r < 0.0 || r > 1.0) ++otw; if (g < 0.0 || g > 1.0) otw= 2; if (b < 0.0 || b > 1.0) otw= 3; if (!otw) { if ((maxc= r) < b) maxc= b; if (maxc < g) maxc= g; if ((minc= r) > b) minc= b; if (minc > g) minc= g; l= (maxc + minc) / 2; /* Светлота */ if (maxc == minc) { /* r=g=b - ахроматический */ s= 0.0; /* случай */ h= UNDEFINED; } else { /* Хроматический случай */ dm= maxc-minc; s= (l < 0.5) ? dm/(maxc+minc) : dm/(2-maxc-minc); rc= (maxc-r)/dm; /* Вычисление тона */ gc= (maxc-g)/dm; /* rc задает удаленность */ bc= (maxc-b)/dm; /* цвета от красного */ if (r == maxc) h= bc-gc; else /* Цвет между жел- */ /* тым и пурпурным */ if (g == maxc) h= 2+rc-bc; else /* Цвет между голу-*/ /* бым и желтым */ h= 4+gc-rc; /* Цвет между пур- */ /* пурным и голубым*/ if ((h*= 60.0) < 0.0) h+= 360.0; } *hue= h; *sat= s; *lig= l; } return (otw); } /* V_RGBHLS */ 0.14.6 Тест процедур V_HLSRGB и V_RGBHLS /*----------------------------------------------- MAIN RGB_HLS * Тестовая программа проверки подпрограмм * преобразований из системы HLS в RGB и наоборот. */
void main(void) { int ii; float r, g, b, r1, g1, b1, hue, sat, lig;
r= 0.0; g= 0.0; b= 0.0; hue= 0.0;
m1:printf ("HLS r,g,b= (\%f \%f \%f) ? ", r,g,b); scanf ("\%f\%f\%f", &r, &g, &b); ii= V_RGBHLS (r, g, b, &hue, &sat, &lig); printf ("V_RGBHLS: otw=\%d hue=\%f sat=\%f lig=\%f ", ii, hue, sat, lig); ii= V_HLSRGB (&r1, &g1, &b1, hue, sat, lig); printf ("V_HLSRGB: otw=\%d r=\%f g=\%f b=\%f ", ii, r1, g1, b1); goto m1; } В начало документа , На основную страничку
|
| Оглавление| |