- •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 Визуализация пространственных реалистических сцен Свето-теневой анализ
- •Метод излучательности
- •Глобальная модель освещения с трассировкой лучей
- •Текстуры
- •Вопросы и упражнения
- •Учебники к курсу
- •Список литературы
Алгоритмы Брезенхема растровой дискретизации окружности и эллипса
Алгоритм изображения окружности
несколько сложнее, чем построение
отрезка. Мы рассмотрим его для случая
окружности радиуса
с
центром в начале координат. Перенесение
его на случай произвольного центра не
составляет труда. При построении
растровой развертки окружности можно
воспользоваться ее симметрией относительно
координатных осей и прямых
.
Необходимо сгенерировать лишь одну
восьмую часть окружности, а остальные
ее части можно получить путем отображений
симметрии. За основу можно взять часть
окружности от 0 до 45° в направлении по
часовой стрелке с исходной точкой
построения
.
В этом случае координата окружности
является
монотонно убывающей функцией координаты
.

Рис. 9.7. Ближайший пиксель при движении по окружности
При выбранном направлении движения по окружности имеется только три возможности для расположения ближайшего пикселя: на единицу вправо, на единицу вниз и по диагонали вниз (рис. 9.7). Выбор варианта можно осуществить, вычислив расстояния до этих точек и выбрав минимальное из них:

Алгоритм можно упростить, перейдя к
анализу знаков величин
.
При
диагональная
точка лежит внутри окружности, поэтому
ближайшими точками могут быть только
диагональная и правая. Теперь достаточно
проанализировать знак выражения
.
Если
,
выбираем горизонтальный шаг, в противном
случае - диагональный. Если же
,
то определяем знак
,
и если
,
выбираем диагональный шаг, в противном
случае - вертикальный. Затем вычисляется
новое значение
,
причем желательно минимизировать
вычисления не только этой величины, но
и величин
на
каждом шаге алгоритма. Путем несложных
преобразований можно получить для
первого шага алгоритма, что
.
После перехода в точку
по
диагонали новое значение
вычисляется
по формуле
,
при горизонтальном переходе
,
при вертикальном
-
.
Таким образом, алгоритм рисования этой
части окружности можно считать полностью
описанным (блок-схема его приведена на
рис. 9.8). Все оставшиеся ее части строятся
параллельно: после получения очередной
точки
можно
инициализировать еще семь точек с
координатами
.
Для построения растровой развертки
эллипса с осями, параллельными осям
координат, и радиусами
воспользуемся
каноническим уравнением
![]()
которое перепишем в виде
![]()
В отличие от окружности, для которой
было достаточно построить одну восьмую
ее часть, а затем воспользоваться
свойствами симметрии, эллипс имеет
только две оси симметрии, поэтому
придется строить одну четверть всей
фигуры. За основу возьмем дугу, лежащую
между точками
и
в
первом квадранте координатной плоскости.

Рис. 9.8. Блок-схема построения восьмой части окружности
В каждой точке
эллипса
существует вектор нормали, задаваемый
градиентом функции
.
Дугу разобьем на две части: первая - с
углом между нормалью и горизонтальной
осью больше 45° (тангенс больше 1) и вторая
- с углом, меньшим 45° (рис.
9.9). Движение вдоль дуги будем
осуществлять в направлении по часовой
стрелке, начиная с точки
.
Вдоль всей дуги координата является
монотонно убывающей функцией от
,
но в первой части она убывает медленнее,
чем растет аргумент, а во второй - быстрее.
Поэтому при построении растрового
образа в первой части будем увеличивать
на
единицу и искать соответствующее
значение
,
а во второй - сначала уменьшать значение
на
единицу и определять соответствующее
значение
.
Направление нормали соответствует вектору
![]()
Отсюда находим тангенс угла наклона
вектора нормали:
.
Приравнивая его единице, получаем, что
координаты точки деления дуги на
вышеуказанные части удовлетворяют
равенству
.
Поэтому критерием того, что мы переходим
ко второй области в целочисленных
координатах, будет соотношение
,
или, переходя к целочисленным операциям,
.

Рис. 9.9. Две области на участке эллипса

Рис. 9.10. Схема перехода в первой и второй областях дуги эллипса
При перемещении вдоль первого участка
дуги мы из каждой точки переходим либо
по горизонтали, либо по диагонали, и
критерий такого перехода напоминает
тот, который использовался при построении
растрового образа окружности. Находясь
в точке
,
мы будем вычислять значение
.
Если это значение меньше нуля, то
дополнительная точка
лежит
внутри эллипса, следовательно, ближайшая
точка растра есть
,
в противном случае это точка
(рис.
9.10а).
На втором участке дуги возможен переход
либо по диагонали, либо по вертикали,
поэтому здесь сначала значение координаты
y уменьшается на единицу, затем вычисляется
и
направление перехода выбирается
аналогично предыдущему случаю (рис.
9.10б).
Остается оптимизировать вычисление
параметра
,
умножив его на 4 и представив в виде
функции координат точки. Тогда для
первой половины дуги имеем

Для второй половины дуги получим

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