Триангуляция Делоне - первое преимущество при слиянии
Я пытаюсь реализовать алгоритм "Разделяй и властвуй" для триангуляции Делоне, найденный здесь, но столкнулся с проблемой. При объединении двух наборов я должен найти самый нижний край между ними, который не пересекает ни один из ребер, уже находящихся на графике.
Моя первая проблема в том, что самое нижнее вообще не определено, и это не очевидно. Я читал, например, много текстов, что можно безопасно использовать ребро между вершинами с самыми низкими значениями y в двух наборах, но это не так, как видно на этом изображении:
Я почти уверен, что хотя бы один из этих пунктов должен быть частью этого края, но я все равно не могу доказать это.
Я не хочу проверять каждую пару ребер на графиках, потому что для больших наборов данных это может занять слишком много времени.
Поэтому я ищу способ найти этот базовый край. Любая помощь будет оценена.
1 ответ
Я почти уверен, я только что понял это. После получения вершин с наименьшими значениями y я пробежал по обоим наборам и искал две вершины, которые находятся под линией (или на ней), образованной ранее выбранными вершинами, и имеют наибольшее расстояние от нее. Если две точки имеют одинаковое расстояние от линии, я выбрал ту, которая имела наибольшее значение x в случае левого набора и самую низкую в случае правого.
Кажется, это работает очень хорошо. Это потому, что я заметил, что для того, чтобы произошло пересечение, должна быть точка под этой линией, которая является частью ребра, пересекающего наше базовое ребро. Таким образом, я думаю, что я нашел нижнюю границу, касательную к обоим наборам, а это означает, что если я поверну этот набор, так что эта линия будет горизонтальной, то под ней не будет точек.
Я пришел к следующему алгоритму:
- построить выпуклую оболочку, используя алгоритм монотонной цепи Эндрю.
- получить ребра выпуклой оболочки, не входящие в субтриангуляции выпуклой оболочки.
- нижняя из полученных кромок является требуемой базовой кромкой.
Обратите внимание на третий шаг: сегмент S1
считается ниже другого сегмента S2
если ориентация S2
(какие конечные точки берутся в порядке возрастания x
координата) с обеими конечными точками S1
не против часовой стрелки, т.е. S1
никогда не бывает слева от S2
если мы идем дальше S2
.
Заметки о сложности времени
- поскольку в начале алгоритма D&C мы лексикографически сортируем точки по
x
а затемy
, построение выпуклой оболочки субтриангуляций будетO(n)
(сортировка не требуется), гдеn
- количество точек в обеих субтриангуляциях. - мы можем использовать контейнеры с
O(1)
поиск (например, хеш-таблицы) ребер субтриангуляции и фильтрация вO(n)
. - поиск самого нижнего края можно выполнить в
O(n)
.
поэтому общий процесс потребует O(n)
операции.