- •Синхронизация процессов и цепочек
- •Венгерская нотация, ссылки и ресурсы
- •Стандартные кисти, иконки, курсоры
- •Пример:
- •Введение в ресурсы
- •Курсоры, пиктограммы и растровые изображения
- •Работа с текстом
- •Работа с мышью
- •Ресурс панель диалога
- •Основные понятия машинной графики
- •Рассмотрим такие примитивы, как вершина, отрезок, воксель и модели, строящиеся на их основе, а также функциональные модели. Полигональные модели
- •Воксельные модели
- •Поверхности свободных форм (функциональные модели)
- •Проекции
- •Различают следующие проекции.
- •Алгоритм Коэна - Сазерленда отсечения прямоугольной областью
- •Метод дихотомии
- •Задача удаления невидимых линий и поверхностей
- •Удаление нелицевых граней многогранника. Алгоритм Робертса
- •Алгоритм Варнока
- •Алгоритм Вейлера-Азертона
- •Метод z-буфера
- •Методы приоритетов. Алгоритм художника.
- •Алгоритм плавающего горизонта
- •Алгоритмы построчного сканирования для криволинейных поверхностей
- •Библиотека OpenGl
- •Простейшая программа
- •Создание формы
- •Формат пикселя
- •Вершины и система координат
- •Треугольники
- •Многоугольники
- •Область рисования
- •Преобразование координат. Матрицы
- •Видовое преобразование. Масштабирование, поворот и перенос
- •Параметры вида. Перспективная проекция
- •Буфер глубины
- •Надстройки над OpenGl
- •Источник света
- •Свойства материала и модель освещения
- •Отсечение
- •Анализ алгоритмов. Модель вычислений
- •Асимптотический анализ алгоритмов
- •Анализ рекурсивных алгоритмов
- •Метод заметающей прямой
- •Метод локусов. Задачи геометрического поиска
- •Задачи регионального поиска. Многомерное двоичное дерево
- •Задачи локализации точки. Метод луча
- •Локализация точки на планарном подразбиении. Метод полос
- •Некоторые основные понятия вычислительной геометрии
- •Построение звездчатого полигона
- •Предварительная разработка алгоритма построения выпуклой оболочки на плоскости
- •Метод обода Грэхема
- •Триангуляция Делоне
- •Диаграмма Вороного
- •Построение диаграммы Вороного
- •Модель osi
- •Уровни модели tcp/ip
Метод обода Грэхема
Предположим, что внутренняя точка уже найдена, а координаты других точек тривиальным образом преобразованы так, что найденная внутренняя точка оказалась в начале координат. Упорядочим лексикографически N точек в соответствии со значениями полярного угла и расстояния от начала координат. При выполнении сортировки не нужно вычислять действительное расстояние между двумя точками, так как требуется лишь сравнить две величины. Сравнение расстояний необходимо выполнять лишь в случае, если две точки имеют один и тот же полярный угол. Но тогда они лежат на одной прямой с началом координат, и сравнение в этом случае тривиально.
Просмотр начинается с точки, помеченной как НАЧАЛО, в качестве которой можно взять самую правую с наименьшей ординатой точку из данного множества, заведомо являющуюся вершиной выпуклой оболочки. Тройки последовательных точек проверяются в порядке обхода против часовой стрелки с целью определить, образуют они или нет угол, больший или равный 1800. Если внутренний угол р1р2р3 больше или равен 1800, то говорят, что р1р2р3 образует “правый поворот”, иначе они образуют “левый поворот”. Из выпуклости полигона следует, что при его обходе будут делаться только левые повороты.
В зависимости от результата проверки угла, образуемого текущей тройкой точек, возможны два варианта:
р1р2р3 образуют правый поворот. Удалить вершину р2 и проверить тройку р0р1р3.
р1р2р3 образуют левый поворот. Продолжить просмотр, перейдя к проверке тройки р2р3р4.
Просмотр завершается когда, обойдя все вершины, вновь приходим в вершину НАЧАЛО.
Алгоритм.
Найти внутреннюю точку q.
Используя q как начало координат, упорядочить точки множества S лексикографически в соответствии с полярным углом и расстоянием от q. Организовать точки множества в виде кольцевого дважды связанного списка со ссылками next и prev и указателем НАЧАЛО на первую вершину. Значение true логической переменной f указывает на то, что вершина НАЧАЛО оказалась достигнутой при прямом продвижении по оболочке, а не в результате возврата.
Обход
begin v:=НАЧАЛО; w:=prev[v]; f:=false;
while ( next[v]<>НАЧАЛО or f=false) do
begin if next[v]=w then f:=true;
if (три точки v, next[v], next[next[v]] образуют левый поворот) then v:=next[v];
else begin удалить next[v];
v:=prev[v];
end
end
end.
По окончании выполнения алгоритма список содержит упорядоченные нужным образом вершины оболочки.
Теорема 4. Выпуклая оболочка N точек на плоскости может быть найдена за время O(N logN) при памяти O(N) с использованием только арифметических операций и сравнений.
Доказательство.
Из обсуждения алгоритма видно, что в нем использовались лишь арифметические операции и сравнения. Шаги 1 и 3 требуют линейного времени, тогда как щаг 2 выполняется за время O(N logN) (сортировка N точек). Для представления связного списка точек достаточно O(N) памяти.
