- •1. Цвет в компьютерной графике 13
- •2. Геометрические преобразования 20
- •3. Представление геометрической информации 37
- •4. Удаление невидимых поверхностей и линий 45
- •5. Проекции пространственных сцен 55
- •5.4. Вопросы и упражнения 67
- •10.6 Вопросы и упражнения 108
- •12.4 Вопросы и упражнения 118
- •Введение Предмет и область применения компьютерной графики
- •1. Отображение информации
- •2. Проектирование
- •3. Моделирование
- •4. Графический пользовательский интерфейс
- •Краткая история
- •Технические средства поддержки компьютерной графики
- •Вопросы и упражнения
- •1. Цвет в компьютерной графике
- •1.1. О природе света и цвета
- •1.2. Цветовой график мко
- •1.3. Цветовые модели rgb и cmy
- •1.4. Другие цветовые модели
- •1.5. Вопросы и упражнения
- •2. Геометрические преобразования
- •2.1. Системы координат и векторы на плоскости и в трёхмерном пространстве
- •2.2. Уравнения прямой и плоскости
- •2.3. Аналитическое представление кривых и поверхностей
- •2.4. Пересечение луча с плоскостью и сферой
- •2.5. Интерполяция функций одной и двух переменных
- •2.6. Матрицы
- •2.7. Геометрические преобразования (перенос, масштабирование, вращение)
- •2.8. Переход в другую систему координат
- •2.9. Задача вращения относительно произвольной оси
- •2.10. Вопросы и упражнения
- •3. Представление геометрической информации
- •3.1. Геометрические примитивы
- •Полигональные модели
- •Воксельные модели
- •Поверхности свободных форм (функциональные модели)
- •3.2. Системы координат: мировая, объектная, наблюдателя и экранная
- •3.3. Однородные координаты
- •3.4. Вопросы и упражнения
- •4. Удаление невидимых поверхностей и линий
- •4.1. Алгоритм Робертса
- •4.2. Метод z-буфера
- •4.3. Методы приоритетов (художника, плавающего горизонта)
- •4.4. Алгоритмы построчного сканирования для криволинейных поверхностей
- •4.5. Метод двоичного разбиения пространства
- •4.6. Метод трассировки лучей
- •4.7. Вопросы и упражнения
- •5. Проекции пространственных сцен
- •5.1. Основные типы проекций
- •Параллельные проекции
- •Центральные проекции
- •5.2. Математический аппарат
- •Ортогональные проекции
- •Косоугольные проекции
- •Центральные проекции
- •5.3. Специальные картографические проекции. Экзотические проекции земной сферы
- •Стереографическая проекция
- •Гномоническая проекция
- •Ортографическая проекция
- •Проекции на цилиндр
- •Проекция Меркатора
- •Проекции на многогранник
- •Необычные проекции
- •5.4. Вопросы и упражнения
- •6. Растровое преобразование графических примитивов
- •6.1. Алгоритм Брезенхема растровой дискретизации отрезка
- •6.2. Алгоритмы Брезенхема растровой дискретизации окружности и эллипса
- •6.3. Алгоритмы заполнения областей
- •6.4. Вопросы и упражнения
- •7. Закрашивание. Рендеринг полигональных моделей
- •7.1. Простая модель освещения
- •7.2. Закраска граней Плоское закрашивание
- •Закраска методом Гуро
- •Закраска методом Фонга
- •7.3. Более сложные модели освещения
- •7.4. Устранение ступенчатости (антиэлайзинг)
- •7.5. Вопросы и упражнения
- •8. Визуализация пространственных реалистических сцен
- •8.1. Трехмерный графический конвейер
- •8.2. Свето-теневой анализ
- •8.3. Глобальная модель освещения с трассировкой лучей
- •8.4. Текстуры
- •8.5. Вопросы и упражнения
- •9. Введение в вычислительную геометрию
- •9.1 Вычислительная сложность алгоритмов
- •9.2 Основные геометрические объекты
- •9.3 Вопросы и упражнения
- •10. Триангуляция Делоне и диаграмма Вороного
- •10.1 Введение
- •10.2 Разбиение Делоне
- •10.3 Разбиение Вороного
- •Многогранник Вороного
- •Теорема о разбиении Вороного
- •10.4 Дуальность разбиений Вороного и Делоне
- •10.5 Алгоритм построения тетраэдризации Делоне
- •Триангуляция Делоне
- •Ячейки Вороного
- •10.6 Вопросы и упражнения
- •11. Алгоритмы построения выпуклой оболочки и триангуляции
- •11.1. Алгоритм построения выпуклой оболочки с использованием метода сортировки
- •11.2 Алгоритм построения триангуляции
- •12. Алгоритмы геометрического поиска
- •12.1 Поиск в плоском случае
- •12.2 Поиск на множестве тетраэдров
- •12.3 Поиск на множестве произвольных несамопересекающихся многогранников е3
- •12.4 Вопросы и упражнения
- •Список литературы
6.3. Алгоритмы заполнения областей
Для заполнения областей, ограниченных замкнутой линией, применяются два основных подхода: затравочное заполнение и растровая развертка.
Методы первого типа исходят из того, что задана некоторая точка (затравка) внутри контура и задан критерий принадлежности точки границе области (например, задан цвет границы). В алгоритмах ищут точки, соседние с затравочной и расположенные внутри контура. Если обнаружена соседняя точка, принадлежащая внутренней области контура, то она становится затравочной и поиск продолжается рекурсивно.
Методы растровой развертки основаны на сканировании строк растра и определении, лежит ли точка внутри заданного контура области. Сканирование осуществляется чаще всего «сверху вниз», а алгоритм определения принадлежности точки заданной области зависит от вида ее границы.
Сначала рассмотрим простой алгоритм заполнения с затравкой с использованием стека. Под стеком в данном случае мы будем понимать массив, в который можно последовательно помещать значения и последовательно извлекать, причем извлекаются элементы не в порядке поступления, а наоборот: по принципу «первым пришел — последним ушел» («first in — last out»). Алгоритм заполнения выглядит следующим образом:
Поместить затравочный пиксель в стек
Пока стек не пуст:
Извлечь пиксель из стека
Инициализировать пиксель
Для каждого из четырех соседних пикселей:
Проверить, является ли он граничным и был ли он инициализирован
Если нет, то поместить пиксель в стек
Алгоритм можно модифицировать таким образом, что соседними будут считаться восемь пикселей (добавляются элементы, расположенные в диагональном направлении).
Методы растровой развертки рассмотрим сначала в применении к заполнению многоугольников. Простейший метод построения состоит в том, чтобы для каждого пикселя растра проверить его принадлежность внутренности многоугольника. Но такой перебор слишком неэкономичен, поскольку фигура может занимать лишь незначительную часть экрана, а геометрический поиск — задача трудоемкая, сопряженная с длинными вычислениями. Алгоритм станет более эффективным, если предварительно выявить минимальный прямоугольник, в который погружен контур многоугольника, но и этого может оказаться недостаточно.
В случае, когда многоугольник, ограничивающий область, задан списком вершин и ребер (ребро определяется как пара вершин), то можно предложить еще более экономный метод. Для каждой сканирующей строки определяются точки пересечения с ребрами многогранника, которые затем упорядочиваются по координате x. Определение того, какой интервал между парами пересечений является внутренним для многогранника, а какой нет, является достаточно простой логической задачей. При этом если сканирующая строка проходит через вершину многогранника, то это пересечение должно быть учтено дважды в случае, когда вершина является точкой локального минимума или максимума. Для поиска пересечений сканирующей строки с ребрами можно использовать алгоритм Брезенхема построения растрового образа отрезка.
В заключение в качестве примера приведем
алгоритм закраски внутренней области
треугольника, основанный на составлении
полного упорядоченного списка всех
отрезков, составляющих этот треугольник.
Для записи горизонтальных координат
концов этих отрезков будем использовать
два массива
и
размерностью, равной числу пикселей
растра по вертикали (рис. 6.9).
Построение начинается с инициализации
массивов
и
:
массив
заполняется нулями, а массив
— числом N, равным
числу пикселей растра по горизонтали.
Затем определяем значения
,
ограничивающие треугольник в вертикальном
направлении. Теперь, используя
модифицированный алгоритм Брезенхема,
занесем границы отрезков в массивы
и
.
Для этого всякий раз при переходе к
очередному пикселю
при формировании отрезка вместо его
инициализации будем сравнивать его
координату i с содержимым
j-ой ячейки массивов.
Если
,
то записываем координату i
в массив
Аналогично при условии
координату i записываем
в массив
.
Рис. 6.9. Схема построения растровой развертки треугольника
Если теперь последовательно применить
алгоритм Брезенхема ко всем трем сторонам
треугольника, то мы получим нужным
образом заполненные массивы границ.
Остается только проинициализировать
пиксели внутри отрезков
.
Этот алгоритм можно легко распространить на случай произвольного выпуклого многоугольника.
