
- •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 Вопросы и упражнения
- •Список литературы
11.2 Алгоритм построения триангуляции
Постановка задачи: Задано конечное
множество точек на плоскости с
вещественными координатами,
.
Требуется построить триангуляцию для
этого множества точек.
Алгоритм решения задачи:
Будем одновременно строить выпуклую оболочку и триангуляцию (вовсе не обязательно Делоне).
Шаг 1: заводим двусвязный список в который, будем заносить отсортированные точки таким образом, чтобы можно было определить точки с совпадающими координатами по y (точки одного уровня).
Далее будем считать, что порядок в списке идет слева на право.
Шаг 2: сортируем лексикографически
множество P. Берем две
точки
,
и
сравниваем координаты y.
Если
больше
,
то говорим что i-тая точка больше (i+1)-й,
меняем их местами и заносим в список;
если
и
равны, то сравниваем координаты x
аналогичным образом и заносим точки в
список (рис 1).
Шаг 3: Строим триангуляцию итерационно по уровням и одновременно строим выпуклую оболочку.
Если количество точек на первом уровне больше трех, и они не лежат на одной прямой, то строим треугольник (рис 2).
Далее идет итерация по различным координатам y (по высоте). Пусть мы имеем выпуклую оболочку на i-м шаге (для i уровней по y). Рассмотрим переход от i-го шага итерации к (i+1)-му.
Если i-й и (i+1)-й уровни содержат ровно по одной точке то соединяем их и переходим к шагу 4, иначе переходим к шагу 2.
Из точек i-го и (i+1)-го уровня берем две, первую и последнюю. Соединяем первую точку i-го уровня с первой точкой (i+1)-го уровня, и последнюю с последней этих же уровней.
Выберем точку p0 из выпуклой оболочки, следующую за первой точкой i-го уровня в списке. Соединим первую точку (i+1)-го уровня с точкой p0, получим вектор
.
Проверим значение угла между вектором и вектором , соединяющем первые точки i-го и (i+1)-го уровней (рис 4). Для этого решим систему уравнений
Находим параметры и . Если значения и положительны, то выбираем точку p1, следующую за p0 и переходим к шагу 4 положив вместо p0 p1. Иначе, обозначаем последнюю точку, при которой и были положительными plt.
Аналогичный процесс проводим для последней точки i+1-го уровня, только идем в обратном направлении, получая точку prt (Рис 3).
Строим триангуляцию для (i+1)-го уровня
Последовательно соединяем крайнюю левую точку (i+1)-го уровня отрезками с точками от p0 до plt из выпуклой оболочки.
Аналогично соединяем крайнюю правую точку (i+1)-го уровня отрезками с точками от p0 до prt из выпуклой оболочки.
Для точек лежащих на уровнях i и i+1 строим триангуляцию.
Перестраиваем выпуклую оболочку
Удаляем из выпуклой оболочки ребра от точки plt до точки prt.
Добавляем в цепь prt – крайнюю правую точку и plt – крайнюю левую точку.
|
|
а) |
б) |
|
|
в) |
г) |
Рис. 11.4.
12. Алгоритмы геометрического поиска
12.1 Поиск в плоском случае
Для начала дадим несколько необходимых определений.
Поисковое сообщение, в соответствии с которым ведется просмотр файла, обычно именуется запросом. От типа файла и от набора допустимых запросов будут сильно зависеть организация первого и алгоритмы обработки последних.
Пусть имеется набор геометрических данных и нужно узнать, обладают ли они определенным свойством (скажем, выпуклостью). В простейшем случае, когда этот вопрос возникает единожды, было расточительством проводить предобработку в надежде ускорить прохождение последующих запросов. Назовем разовый запрос такого типа уникальным. Однако будут и запросы, обработка которых повторяется многократно на том же самом файле. Такие запросы назовем массовыми.
Рис. 12.1. |
Рассмотрим случай уникального запроса для различных многогранников.
Рис. 12.2. |
Дан многоугольник Р и точка z. Определим положение точки относительно многоугольника. Проведем через точку z горизонталь l (рис. 12.1.). Если l не пересекает Р, то z — внешняя точка. Поэтому пусть l пересекает Р, и рассмотрим вначале случай, когда l не проходит ни через одну из вершин Р. Пусть L - число точек пересечения l с границей Р слева от z. Поскольку Р ограничен, левый конец l лежит вне Р. Будем двигаться вдоль l от -∞ направо вплоть до z. На самом левом пересечении l с границей Р мы попадем внутрь Р, на следующем пересечении выйдем наружу и т. д. Поэтому z лежит внутри тогда и только тогда, когда L нечетно. Теперь рассмотрим вырожденный случай, когда l проходит через вершины Р. Бесконечно малый поворот l вокруг z против часовой стрелки не изменит классификации (внутри/вне) точки z, но устранит вырожденность. Итак, вообразив реализацию этого бесконечно малого поворота, мы увидим: если обе вершины ребра принадлежат l, то это ребро следует отбросить; если же ровно одна вершина ребра лежит на l, то пересечение будет учтено, когда эта вершина с большой ординатой, и игнорируется в противном случае.
Рис. 12.3. |
Исследуем нашу задачу с участием звёздного многоугольника. Предлагаемый метод использует свойство, что вершины звёздного многоугольника упорядочены по полярным углам относительно некоторой внутренней точки. Такую точку q можно легко найти; звёздный многоугольник содержит по меньшей мере одну точку q такую, что отрезок qPi лежит целиком внутри многоугольника Р для любой вершины Pi из P i = 1,…,N по определению звёздного многоугольника. Теперь рассмотрим N лучей, исходящих из точки q и проходящих через вершины многоугольника Р (рис. 12.2.).
Эти лучи разбивают плоскость на N клиньев. Каждый клин разбит на две части одним из ребер Р. Одна из этих частей лежит целиком внутри Р, другая целиком снаружи. Считая q началом полярных координат, мы можем отыскать тот клин, где лежит точка z, проведя один раз двоичный поиск, поскольку лучи следуют в порядке возрастания их углов. После нахождения клина остается только сравнить z с тем единственным ребром из Р, которое разрезает этот клин, и решить, лежит ли z внутри Р. Предобработка в вышеописанном способе решения состоит в поиске центра q, служащего основой поиска, и размещении вершин p1, р2, ..., pN в структуре данных, пригодной для двоичного поиска (например, в векторе). Очевидно, это можно проделать за время 0(N) для заданной последовательности р1, р2, …, pN .
Теперь рассмотрим задачу геометрического поиска в простейшей постановке для массовых запросов с предобработкой множества многоугольников. Имеется некоторая совокупность связных не самопересекающихся многоугольников. Для заданной точки нужно определить множество многоугольников, которым она принадлежит. Считаем, что поиск ориентирован на массовые запросы (т.е., предполагается, что поиск будет осуществляться по данной совокупности тетраэдров много раз). Для эффективного решения этой задачи можно предварительно построить специальную информационную структуру-индекс и использовать ее для оптимизации поиска. Можно выделить следующие этапы построения этой структуры.
У нас имеется совокупность заданных многоугольников(рис. 3.). Найдем все точки пересечения сторон этих многоугольников. Проведем через эти точки и вершины многоугольников прямые, параллельные оси Х (рис. 12.4.). При этом предполагаем, что стороны многоугольников не параллельны оси Х.
Две такие соседние прямые образуют полосу. При этом, отрезки, которые получаются при пересечении ребер многоугольника с полосой, не пересекаются строго внутри полосы и строго внутри полосы нет вершин треугольников. Таким образом, для данной полосы мы можем упорядочить последовательность ребер многоугольника, пересекающихся с этой полосой (рис. 12.5.). Для трапеции, образуемой соседними отрезками в полосе, можно занести в структуру совокупность треугольников, в которые она входит.
Рис. 12.4. |
Задача поиска решается в три этапа, причем, на каждом шаге используется дихотомия. Пусть дана точка (x,y), будем искать множество многоугольников, которым она принадлежит. На первом этапе ищется полоса, в которой лежит точка (x,y). На втором – трапеция в этой полосе, в которую попадает точка (x,y). Вычислительная сложность поиска равна O(ln(N)), где N-число многоугольников.
Рис. 12.5. |