- •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 Вопросы и упражнения
- •Список литературы
10.4 Дуальность разбиений Вороного и Делоне
Мы рассмотрели разбиения Вороного и Делоне по отдельности. Однако тот факт, что оба разбиения однозначно определяются системой {А}, говорит, что они сами однозначно определяют друг друга. Другими словами, если мы получили разбиение Вороного, то тем самым имеем полную информацию о разбиении Делоне, и наоборот. Как методом пустого шара, Делоне, так и с помощью плоскостей Вороного мы выявляем одну и ту же систему точек { D}. Действительно, согласно первому следствию теоремы 1, каждая вершина d в мозаике Вороного расположена на одинаковом расстоянии от четырех точек системы. Но это означает, что данная четверка лежит на сфере с центром в выбранной вершине d. Эта сфера является тем пустым шаром Делоне, который определяет соответствующий симплекс Делоне. Можно рассуждать в обратном порядке. Точка d из системы { D}, определенная с помощью пустого шара, лежит, по построению, на одинаковом расстоянии от своей четверки точек из {А}, но такая точка является общей для всех плоскостей Вороного данной четверки точек, а поэтому является общей вершиной их многогранников Вороного.
Рис. 10.5. Разбиение Вороного—Делоне для двумерной системы точек. Сплошными линиями нарисована мозаика Вороного, пунктирными — мозаика Делоне.
10.5 Алгоритм построения тетраэдризации Делоне
Реализованный в данной работе алгоритм строит тетраэдеризацию Делоне в пространстве (алгоритм триангуляции Делоне на плоскости можно получить путём относительно несложной адаптации данного, поэтому далее речь пойдёт только о 3D случае). Алгоритм относится к итерационным алгоритмам построения триангуляции (сначала строится первый тетраэдр, а затем к структуре по одной добавляются точки, которые образуют с уже полученной структурой новые тетраэдры). На каждом шаге алгоритма локализация следующей точки происходит методом «вкатывания шара».
Алгоритм Вороного работает на уже построенном разбиении Делоне, используя дуальность этих разбиений. Алгоритм основан на том свойстве, что вершины ячеек Вороного совпадают с центрами сфер, описанных вокруг каждого из тетраэдров Делоне. После нахождения центров описанных сфер, строится выпуклую оболочку, которая и будет ячейкой Вороного. Выпуклая оболочка строится методом «заворачивания подарка».
Триангуляция Делоне
Алгоритм логически делится на два этапа: построение первого тетраэдра и последующий обход с построением остальных тетраэдров разбиения.
Опишем первый этап алгоритма – Построение первого тетраэдра.
I этап: Построение первого тетраэдра Делоне.
Вход: Множество точек N в пространстве. N – количество точек в конечном множестве N.
Выход: Первый тетраэдр Делоне (n1,n2,n3,n4).
Пусть существует точка внутри выпуклой оболочки множества N, и существуем сколько угодно малая окрестность этой точки, не содержащая точек из N. Такой точкой может быть, например, среднее арифметическое радиус-векторов всех точек N:
Рис. 10.6
s=
/
|N|
Окрестность точки s не содержит точек множества. Пусть эта окрестность ограничена некой сферой с центром в s. Будем увеличивать эту сферу, так чтобы в итоге на ней лежали четыре и только четыре точки из N, которые и составят первый тетраэдр Делоне.
Сначала включим только одну точку (n1). Начнём расширять сферу, до тех пор, пока она не коснётся одной из точек N. Очевидно, что такой точкой окажется ближайшая к s:
Рис. 10.7.
n1
N
| |n1-s|=
(|n-s|)
Получим сферу с центром в s и радиусом |n1-s|.
Будем расширять имеющуюся сферу, пока она не коснётся второй точки из N (n2 N\{n1}). Гарантией того, что сфера не захватит случайных точек, является непрерывность её изменения, т.е. перемещение центра и увеличение радиуса должно производится непрерывно (без скачков). Для того чтобы n1 оставалась на сфере, будем сдвигать её центр, одновременно увеличивая радиус. Условие непрерывности изменения сферы требует, чтобы центр двигался по какой-либо прямой, проходящей через s, по направлению от n1. Пусть это будет прямая, проходящая через s и n1 (рис.10.7).
Программно этот процесс выглядит как
построение для каждой точки из N\{n1}
сферы, проходящей через эту точку и n1,
центр которой лежит на прямой n1,
s, с последующим выбором
сферы наименьшего радиуса и соответствующей
точки. Построение сферы сводится к
вычислению положения центра, который
есть точка равноудалённая от всех точек,
лежащих на поверхности сферы, кроме
того известна прямая, на которой лежит
центр. Прямым путём является решение
системы из 3-х линейных уравнений (3
неизвестных – координаты центра), и
хотя существует множество эффективных
алгоритмов решения таких систем, был
найден другой способ определения центра
сферы. Пусть есть прямая с направляющим
вектором v и точка на
этой прямой, тогда любую точку прямой
можно выразить через сумму радиус
вектора исходной точки и вектора t
v, где t
R. В нашем случае прямая
задана вектором v=s-n1
и точкой s, а t
(1,
)
(в силу непрерывности). Т.о. центр сферы
для второй точки можно задать: c2=n1+
t v,
остаётся выбрать сферу с минимальным
радиусом. Нетрудно заметить, что радиус
принимает минимальное значение при
минимальном значении t.
Значение t для заданной
точки ni
из N\{n1}
вычисляется путём решения линейного
уравнения: |c2-n1|
= |c2-ni|
|t v|
= |n1+ t
v-ni|.
Итак:
построим направляющий вектор: v=s-n1;
определим центр сферы: c=n1+ t v, где t (1, );
для каждой точки ni (N\{n1}) найдём центр сферы ci, решив уравнение:
|ci-n1|=|ci-ni| |t v|=|n1+ t v-ni| найдём ti;
из всех получившихся сфер выберем сферу с наименьшим радиусом:
ci=n1+
ti v
| ti
(1,
),
t
min
n2=ni,
c2=ci.
Получили сферу, центр которой лежит на прямой, перпендикулярной отрезку, соединяющему точки n1 и n2, и проходящей через середину этого отрезка.
Поиск третьей точки происходит аналогично поиску второй. Выберем направляющий вектор, пусть это будет v=c2-m, где m – середина отрезка n1, n2 ((n1+n2)/2), а центр новой сферы определяется как c3=m+t v (Рис. 10.8). Следует заметить, что до текущего шага центр оставался в одной плоскости, а теперь он перейдёт в другую плоскость, которая определяется точками n1, n2 и c2 (непрерывность изменения сферы при этом по-прежнему сохраняется). Снова расширяем сферу, проходящую через точки n1 и n2, сдвигая центр от точки c2 по направлению заданному вектором c2-m и увеличивая радиус, пока сфера не коснётся какой-либо точки из N\{n1,n2}.
Рис. 10.8.
Формально:
найдём середину отрезка (n1,n2): m=(n1+n2)/2;
построим направляющий вектор: v=c2-m;
центр сферы: c=m + t v, где t (1, );
для каждой точки ni (N\{n1,n2}) найдём центр сферы ci, решив уравнение:
|ci-n1|=|ci-ni| |m + ti v – n1|=|m + ti v-ni| найдём ti;
из всех получившихся сфер выберем сферу с наименьшим радиусом:
Рис. 10.9.
ci=m+ ti v | ti (1, ), t min n3=ni, c3=ci.
Найдём четвёртую точку n4. Три полученных точки составляют треугольник, а описанная вокруг него окружность представляет собой пересечение сферы и плоскости, проходящей через три найденные точки. Центр сферы лежит на прямой, перпендикулярной плоскости полученного треугольника и проходящей через центр описанной вокруг него окружности (Рис. 10.9). Т.о. v=c3-m, где m – центр описанной вокруг треугольника n1,n2,n3 окружности.
Будем сдвигать центр сферы из c3 по линии, перпендикулярной плоскости точек n1, n2, n3 и проходящей через центр окружности, описанной вокруг треугольника (n1,n2,n3), увеличивая радиус, так, чтобы точки n1, n2 и n3 продолжали оставаться на сфере. Будем продолжать до тех пор, пока сфера не коснётся какой-либо точки из N\{n1,n2,n3}.
Формально:
найдём центр окружности (m), описанной вокруг треугольника (n1,n2,n3):
пусть: m´ – середина отрезка n1, n2; m´=(n1+n2)/2
n´ – вектор нормали плоскости трёх найденных точек
v´ – вектор в плоскости треугольника,
v´
(n1-n2);
v´=(n1-n2)
n´
тогда m=m´+t´ v´
решив уравнение |m´-n1|=|m´-n3|, получим t´.
построим направляющий вектор: v=c3-m;
центр сферы: c=m + t v, где t (1, );
для каждой точки ni (N\{n1,n2,n3}) найдём центр сферы ci, решив уравнение:
|ci-n1|=|ci-ni| |m + ti v – n1|=|m + ti v-ni| найдём ti;
из всех получившихся сфер выберем сферу с наименьшим радиусом:
ci=m+ ti v | ti (1, ), t min n4=ni.
По точкам n1, n2, n3, n4 построим первый тетраэдр Делоне.
После выполнения первого этапа алгоритма имеем: тетраэдр, построенный по четырём точкам исходного множества N и удовлетворяющий условию Делоне; новое множество точек в пространстве: N´=N\{n1,n2,n3,n4}. Дальнейший процесс тетраэдеризации сводится к построению тетраэдров на свободных гранях-треугольниках полученной на данном шаге структуры. Для реализации обхода организуется очередь граней, в которую заносятся свободные грани вновь построенных тетраэдров. Треугольник, полученный с верхушки очереди, достраивается до тетраэдра аналогично поиску четвёртой точки в I этапе алгоритма (п. 5).
|
Рис. 10.10. |
Опишем подробно второй этап алгоритма:
II этап: Построение полного разбиения на тетраэдры Делоне
Вход: Первый тетраэдр (n1,n2,n3,n4), множество точек N´=N\{n1,n2,n3}.
Выход: Разбиение на тетраэдры Делоне.
Определим B – множество элементов [o, p, r, h] (очередь граней), где o, p, r N´ вершины построенного тетраэдра, описывающие его грань, а h – вектор нормали плоскости грани, направленный внутрь тетраэдра.
Инициализируем B гранями первого тетраэдра: B={[n1, n2, n3, h1], [n1, n2, n4, h2], [n2, n3, n4, h3], [n3, n1, n4, h4]}.
Вычтем элемент из B, для которого найдём четвёртую точку q, т.к. три точки мы уже знаем (первые три точки определяет грань уже построенного тетраэдра). Будем двигать центр сферы по линии, перпендикулярной плоскости известной грани и проходящей через центр окружности, описанной вокруг треугольника-грани, увеличивая радиус, так, чтобы известные точки грани продолжали оставаться на сфере (Рис. 10.11). Будем расширять сферу до тех пор, пока она не коснётся какой-либо точки из N´.
Рис. 10.11.
Формально:
возьмём элемент из B [o, p, r, h] (точки o, p, r определяют грань тетраэдра, а h является вектором нормали этой грани);
найдём центр окружности (m), описанной вокруг треугольника (o,p,r):
пусть: m´ – середина отрезка o, p; m´=(o+p)/2
v´ – вектор в плоскости треугольника, v´ (o-p); v´=(o-p) h
тогда m=m´+t´ v´
решив уравнение |m´-o|=|m´-r|, получим t´.
центр сферы: c=m + t h, где t (- ,1);
для каждой точки ni N´ найдём центр сферы ci, решив уравнение:
|ci-o|=|ci-ni| |m + tih – o|=|m + tih – ni| найдём ti;
из всех получившихся сфер выберем сферу, которой соответствует максимальное t:
ci=m+ ti h | ti (- ,1), t max q=ni;
если ни одного ti не найдено, то грань (o,p,r) является внешней гранью множества.
По точкам o, p, r, q построим очередной тетраэдр Делоне.
Добавим к B три грани очередного тетраэдра, содержащие точку q, причём, если добавляемая грань уже принадлежит B, то вместо добавления удаляем существующую. Такое действие соответствует операции исключающего или (xor). Итак: B=B xor {[o, p, q, g2], [p, r, q, g3], [r, o, q, g4]}, где g2, g3, g4 – вектора-нормали плоскостей соответствующих граней, направленные внутрь тетраэдра.
Если B не пусто, то вернёмся к п. 3.
