- •153000 Г. Иваново, пр. Ф.Энгельса, 21
- •Лекция №1 Предмет и область применения компьютерной графики
- •1. Отображение информации
- •2. Проектирование
- •3. Моделирование
- •4. Графический пользовательский интерфейс
- •Краткая история
- •Технические средства поддержки компьютерной графики
- •Вопросы и упражнения
- •Лекция №2 о природе света и цвета
- •Цветовой график мко
- •Цветовые модели rgb и cmy
- •Цветовые модели hsv и hls
- •Пространство cie Luv
- •Вопросы и упражнения
- •Лекция №3 Геометрические преобразования Системы координат и векторы
- •Уравнения прямой и плоскости
- •Аналитическое представление кривых и поверхностей
- •Пересечение луча с плоскостью и сферой
- •Лекция №3 (продолжение) Интерполяция функций одной и двух переменных
- •Матрицы
- •Геометрические преобразования (перенос, масштабирование, вращение)
- •Переход в другую систему координат
- •Задача вращения относительно произвольной оси
- •Вопросы и упражнения
- •Лекция №4 Введение в растеризацию кривых
- •Изображение отрезка с целочисленными координатами концов
- •Цифровой дифференциальный анализатор
- •Алгоритм Брезенхема
- •Алгоритм Кастла-Питвея
- •Изображение отрезка с нецелочисленными координатами концов
- •Изображение окружностей
- •Алгоритм Брезенхема
- •Изображение эллипсов
- •Построение по неявной функции
- •Построение путем сжатия окружности
- •Лекция №5 Представление геометрической информации Геометрические примитивы
- •Полигональные модели
- •Воксельные модели
- •Поверхности свободных форм (функциональные модели)
- •Системы координат: мировая, объектная, наблюдателя и экранная
- •Однородные координаты. Задание геометрических преобразований в однородных координатах с помощью матриц
- •Вопросы и упражнения
- •Лекция №6 Отсечение (клиппирование) геометрических примитивов
- •Алгоритм Сазерленда-Коэна отсечения прямоугольной областью
- •Отсечение выпуклым многоугольником
- •Клиппирование многоугольников
- •Вопросы и упражнения
- •Лекция №7 Удаление невидимых поверхностей и линий
- •Удаление нелицевых граней многогранника Алгоритм Робертса
- •Алгоритм Варнока
- •Алгоритм Вейлера-Азертона
- •Метод z-буфера
- •Методы приоритетов (художника, плавающего горизонта)
- •Алгоритмы построчного сканирования для криволинейных поверхностей
- •Метод двоичного разбиения пространства
- •Метод трассировки лучей
- •Вопросы и упражнения
- •Лекция №8 Проецирование пространственных сцен Основные типы проекций
- •Параллельные проекции
- •Центральные проекции
- •Математический аппарат
- •Ортогональные проекции
- •Косоугольные проекции
- •Центральные проекции
- •Специальные картографические проекции. Экзотические проекции земной сферы
- •Стереографическая проекция
- •Гномоническая проекция
- •Ортографическая проекция
- •Проекции на цилиндр
- •Проекция Меркатора
- •Проекции на многогранник
- •Необычные проекции
- •Вопросы и упражнения
- •Лекция 9 Растровое преобразование графических примитивов
- •Алгоритм Брезенхема растровой дискретизации отрезка
- •Алгоритмы Брезенхема растровой дискретизации окружности и эллипса
- •Алгоритмы заполнения областей
- •Вопросы и упражнения
- •Лекция 10 Закрашивание. Рендеринг полигональных моделей
- •Простая модель освещения
- •Закраска граней Плоское закрашивание
- •Закраска методом Гуро
- •Закраска методом Фонга
- •Более сложные модели освещения
- •Устранение ступенчатости (антиэлайзинг)
- •Вопросы и упражнения
- •Лекция 11 Визуализация пространственных реалистических сцен Свето-теневой анализ
- •Метод излучательности
- •Глобальная модель освещения с трассировкой лучей
- •Текстуры
- •Вопросы и упражнения
- •Учебники к курсу
- •Список литературы
Цифровой дифференциальный анализатор
Алгоритм Цифровой дифференциальный анализатор (англ. DDA - Digital Differential Analyzer) строит 8-связную линию. Для начала, пусть P1 = (1, 0); P2 = (1, 1). Для определения того, какой из пикселей, - P1 или P2, - следует закрасить, сравним расстояния до них. В силу подобия треугольников, образованных пересечением рисуемого отрезка, прямой x = 1 и перпендикулярами из P1 и P2 на отрезок (см. рис. 4.4), достаточно сравнить e (ординату пересечения отрезка c прямой x = 1) с . Далее, для следующего шага алгоритм работает аналогично с учетом изменения e - ординаты пересечения отрезка со следующей вертикальной прямой .
Рис. 4.4. Цифровой дифференциальный анализатор
// Координаты концов отрезка - (0,0) и (a,b)
e = b/a; // Текущая ордината
Δe = b/a; // Приращение ординаты
// (x,y) - Координаты текущей точки
x = 0; y = 0;
while( x < a )
{
plot(x, y);
if( e > 1/2 )
{
// d : диагональное смещение
x++; y++;
// т.к. произошло смещение по y на 1 вверх
e += Δe - 1;
}
else
{
// s: горизонтальное смещение
x++;
e += Δe;
}
}
Листинг 4.1. Цифровой дифференциальный анализатор
Недостатком данного алгоритма является то, что он работает с числами с плавающей точкой.
Алгоритм Брезенхема
Брезенхем [16] модифицировал алгоритм DDA, чтобы он работал в целых числах. Модифицируем алгоритм следующим образом:
-
уменьшим везде e на , чтобы сравнивать с 0;
-
домножим e и Δe на 2a: e 0 = 2b - a, Δ e = 2b
Приходим к следующему алгоритму:
// Координаты концов отрезка - (0,0) и (a,b)
e = 2b - a;
ΔeS = 2b;
ΔeD = 2b - 2a;
x = 0; y = 0; // (x,y) - Координаты текущей точки
while(x < a)
{
plot(x, y);
if(e > 0)
{ // d : диагональное смещение
x++; y++;
e += ΔeD;
}
else
{ // s : горизонтальное смещение
x++;
e += ΔeS;
}
}
Листинг 4.2. Алгоритм Брезенхема для отрезка
Алгоритм Брезенхема был создан им для вывода отрезков на цифровых инкрементальных графопостроителях, которые могли осуществлять лишь простые единичные сдвиги печатающей головки. Дальнейшая оптимизация может быть произведена, если заметить, что отрезок симметричен относительно прямой, проходящей перпендикулярно ему через его середину; в этом случае можно начинать рисовать сразу с двух концов, что сократит число итераций цикла в алгоритме вдвое.
Алгоритм Кастла-Питвея
Этот алгоритм гораздо менее эффективен с вычислительной точки зрения, чем алгоритм Брезенхема, однако обладает красивой математической структурой. Он основан на идее, схожей с известным алгоритмом Евклида нахождения Наибольшего Общего Делителя двух натуральных чисел [19].
Будем работать со строками, кодирующими последовательность закраски (т.е. состоящими из символов s и d, определенных выше).
Определим две операции над такими строками:
-
- конкатенация строк, например
-
- "переворот" строки, например
// Координаты концов отрезка - (0,0) и (a,b)
y = b;
x = a - b;
m1 = "s";
m2 = "d";
while( x \ne y )
{
if( x > y )
{
x = x - y;
m2 = m1 ~ m2;
}
else
{
y = y - x;
m1 = m2 ~ m1;
}
}
Листинг 4.3. Алгоритм Кастла-Питвея
После завершения работы алгоритма задает нужную последовательность сдвигов. Доказательство корректности работы этого алгоритма мы опустим ввиду его громоздкости.