Самый быстрый алгоритм триангуляции с отверстиями?

Я работаю над поиском пути для игры в жанре RTS, где я строю навигационную сетку из игровой сетки.

Я написал алгоритм, похожий на Marching Squares, который создает и упрощает границы между пешеходными и недоступными областями карты. Теперь у меня есть «сетка», состоящая только из ребер. Мне нужно триангулировать эту сетку, чтобы окончательная триангуляция содержала начальные края, а затем я могу удалить непроходимые области, чтобы создать дыры в навигационной сетке. Например, мне нужно сделать это ...

введите описание изображения здесь

Треугольники обозначают области на карте, по которым можно ходить. Дыры представляют собой непроходимые области, такие как горы или здания. Сетку можно рассматривать как 2D, так как высота значения не имеет. Очевидно, это очень упрощенный случай. Сетка навигации в игре будет состоять из тысяч вершин и множества дыр, но я могу разбить ее на более мелкие части для динамического обновления.

Я рассмотрел алгоритмы ограниченной триангуляции Делоне, которые сначала создают триангуляцию Делоне точек, а затем удаляют все треугольники, которые пересекают ограниченные ребра, а затем повторно триангулируют удаленные треугольники.

Для моих целей это кажется немного избыточным. Моя сетка не обязательно должна быть Делоне, и она полностью состоит из ограниченных краев, поэтому я бы хотел по возможности пропустить дополнительные триангуляции. Есть ли лучший алгоритм для этого? Я искал и искал, и смог найти только ограниченные алгоритмы Делоне. Или, может быть, я ошибаюсь, и лучше всего подойдет алгоритм Делоне с ограничениями?

Раньше я выполнял поиск пути навигационной сетки с нуля, но мне никогда не приходилось создавать навигационную сетку самостоятельно. Алгоритмы триангуляции для меня в новинку. Любое понимание?


person Janz Dott    schedule 08.12.2013    source источник
comment
Поскольку у вас нет специальных запросов по треугольникам, лучше использовать более простой подход, например триангуляция многоугольника. чем Делоне.   -  person Ante    schedule 09.12.2013
comment
Я посмотрел на метод Ear-Clipping, который кажется немного медленнее, чем триангуляция Делоне, но потребует от меня сортировки вершин в порядке зацикливания, верно?   -  person Janz Dott    schedule 09.12.2013
comment
Теперь я понимаю, что у вас только края. В каждом случае вам нужно будет соединить и сориентировать края, найти деталь внутри какой-то другой части (чтобы узнать, отверстие это или нет), а затем триангулировать многоугольник с отверстиями. Отверстия можно удалить, добавив 2 одинаковых ребра от отверстия к границе многоугольника или другому отверстию. Обрезка ушей - простой метод, и с разделением пространства (дерево BSP, дерево квадратов, ...) он быстрее, чем O (n ^ 2).   -  person Ante    schedule 09.12.2013
comment
Я хорошо знаком с разделением пространства, поэтому думаю, что попробую. Из того, что я прочитал, сказано, что вершины отверстий должны быть намотаны в направлении, противоположном вершинам внешнего многоугольника. Упорядочивание вершин по часовой стрелке и против часовой стрелки для каждого цикла ребер будет отдельным алгоритмом, поскольку в настоящее время они не упорядочены вообще и не сгруппированы по циклу ребер. Как весело это будет ...   -  person Janz Dott    schedule 09.12.2013
comment
Подумать только, краевая сетка создается из карты, на которой рельеф, вероятно, описан с некоторыми областями (полигонами), а края - это места изменения ландшафта (например, от поля до горы). Если области простые, то для создания сетки можно использовать информацию о соседстве, не переходя к общей триангуляции.   -  person Ante    schedule 09.12.2013
comment
Формы пешеходных и недоступных участков довольно сложны, поэтому я не вижу способа сделать это. Ландшафт создается процедурно, и здания должны иметь возможность размещать / удалять в любом месте.   -  person Janz Dott    schedule 09.12.2013
comment
Мои края отсортированы по их соответствующим петлям и направлению намотки, но я понял, что обрезка ушей не сработает для меня, потому что у меня есть острова, которые не являются частью основной пешеходной зоны. Это можно сделать, но это слишком сложно. У меня почти готов наивный триангулятор Делоне O (n ^ 2), тогда мне придется добавлять ребра одно за другим.   -  person Janz Dott    schedule 09.12.2013
comment
Мой триангулятор Делоне без ограничений работает и фактически включает почти все ребра самостоятельно без ограничений. Может быть, это потому, что вершины выровнены по сетке. Но он работает очень хорошо и работает лучше, чем ожидалось, так что я счастлив!   -  person Janz Dott    schedule 09.12.2013


Ответы (1)


Фернандес et al 2008, кажется, близок к последнему слову техники, когда дело касается проблемы декомпозиции сложных доменов. Если вы ищете (возможно, более простые) альтернативы, авторы перечисляют другие возможные алгоритмы во втором абзаце p370.

person Andy Jones    schedule 09.12.2013