Жадный алгоритм построения триангуляции
Одним из первых точных алгоритмов был предложен так называемый жадный алгоритм построения триангуляции. Суть данного алгоритма:
Шаг 1. Генерируется список всех возможных отрезков, соединяющих пары исходных точек, и он сортируется по длинам отрезков.
Шаг 2. Начиная с самого короткого, последовательно выполняется вставка отрезков в триангуляцию. Если отрезок не пересекается с другими ранее вставленными отрезками, то он вставляется, иначе он отбрасывается.
Трудоемкость работы жадного алгоритма при некоторых его улучшениях составляет 0(n2 log n). В связи со столь большой трудоемкостью на практике он почти не применяется. Однако благодаря возможностям современной компьютерной техники, особенно при небольших входах, его можно реализовать.
Мы реализовали данный алгоритм на практике. При этом мы использовали: сортировку точек по абсциссе, прием нахождения наименьшего элемента для сортировки отрезков по их длинам, а также нахождение пересечения отрезков на плоскости.
Что касается сортировки, то можно использовать любую из известных Вам сортировок массивов (см. [17]). В нашей практической реализации мы воспользовались, так называемой, быстрой сортировкой Хоара, которую использовали и ранее (см. [5]).
Сортировка отрезков, соединяющих пары исходных точек, по длинам была реализована на основе стандартной схемы нахождения наименьшего элемента: полагали первый элемент массива наименьшим, если в оставшейся части массива находился элемент меньше данного, то он менялся с наименьшим, таким же образом искались последующие наименьшие по длине отрезки в оставшейся не отсортированной части массива.
Для определения наличия пересечения отрезков мы воспользовались знаниями из геометрии (см. [4]). Путь на плоскости заданы два отрезка а и b, а - точками с координатами (х1, у1) и (х2, y2), а b – точками с координатами (х3,у3) и (х4, y4). Необходимо найти их точку пересечения с координатами (х, у). Уравнение прямой, на которой лежит отрезок a имеет вид:
где (ха, уа) - координаты любой точки отрезка а; ta - параметр, принимающий значения [0,1].
Аналогично для отрезка b имеем:
где (хb, уb) координаты любой точки отрезка b; tb - параметр, принимающий значения [0,1].
Таким образом, если отрезки пересекаются в какой-либо точке, то соответствующие координаты этой точки должны удовлетворять уравнениям:
Решения систему из последних двух уравнений относительно tа и tb, получим:Подстановка любого из этих значений в соответствующее уравнение прямой даёт точку пересечения.
Замечания:
- Знаменатели одинаковы.
- Если знаменатель равен нулю, то прямые параллельны.
- Если и числитель и знаменатель равны нулю, то прямые совпадают.
- Если нужно найти пересечение отрезков, то нужно лишь проверить, лежат ли tа и tb на промежутке [0,1]. Если какая – нибудь из этих двух переменных принимает значения из промежутка [0,1], то соответствующий отрезок содержит точку пересечения. Если обе переменные приняли значения из [0,1], то точка пересечения прямых лежит внутри обоих отрезков. Причем чтобы исключить проверку совпадения концов отрезков (так как они у нас будут совпадать, например, может быть ребро (1, 2) и ребро (2, 3)), достаточно рассматривать интервал (0,1).
-Для двух отрезков при достаточной разреженности объектов можно сначала проверять принципиальную возможность пересечения, сравнивая координаты концов.
Весь необходимый теоретический материал для практической реализации построения жадной триангуляции изложен. Программа готова и приведена ниже в виде кода программы решения поставленной задачи.
Перед Вами ставится задача написать рецензию на изложенный алгоритм построения жадной триангуляции.
Напомним, что рецензия - это изложение анализа текста, в котором рассматриваются его содержание и форма, отмечаются и аргументируются его достоинства и недостатки, делаются выводы и обобщения.
То есть ваша рецензия должна содержать анализ текста программы с отмеченными и аргументированными его достоинствами и недостатками, сделанными выводами и обобщениями. Можно, например, начать рецензию с ответов на следующие вопросы. Является ли данная программа работоспособной (содержит ли существенные ошибки)? Все ли шаги предлагаемой программы Вам понятны? Является ли данная реализация эффективной с точки зрения техники программирования, можно ли предложить способы улучшения качества кода? и т.п.
Визуально форма для демонстрации процесса построения жадной триангуляции выглядит так, как показано на рис. 3.
В табл. 1 приведен листинг программы построения триангуляции с помощью жадного алгоритма и подробное описание отдельных шагов алгоритма.
Рис. 3. Вид формы для демонстрации процесса построения триангуляции с помощью жадного алгоритма
Листинг модуля формы и комментарии для программы построения жадной триангуляция Жми сюда
Как Вы считаете, исходя из вышеприведенного определения задачи построения триангуляции, полученный ответ (рис. 4) нас удовлетворяет?
Рис. 4.Вид формы с результатом построение триангуляции с помощью жадного алгоритмаДействительно - да, однако с точки зрения практики (например, для получения триангуляции Делоне из уже имеющейся триангуляции или построение линий уровня (изолиний) по триангуляции), триангуляцию необходимо рассматривать как нахождение множества треугольников, покрывающих все заданные точки множества и построение структуры данных, содержащей информацию об отношении соседства между треугольниками.