Это решение предполагает, что у вас есть структура данных, которая представляет триангуляцию Делоне с использованием «виртуальной бесконечной вершины Делоне», как это делает CGAL ( подробности см. Здесь ).
Идея состоит в том, чтобы найти граничные ребра Делоне: ребра, соединяющие две последовательные точки выборки; а затем "затопить" через триангуляцию Делоне, чтобы классифицировать лица Делоне. Известно, что бесконечная вершина является внешней, поэтому ее соседей (и соседей соседей и т. Д.) Можно классифицировать как внешние, если только они не пересекают граничные ребра. Достигнув граничного края, можно просто пометить соседний треугольник как внутренний и продолжить аналогичным образом.
Ввод : набор точек плотной выборки границы замкнутой формы, которая может даже содержать отверстия
Выходные данные : диаграмма Вороного во внутренней части фигуры (аппроксимация средней оси фигуры)
- Рассчитайте триангуляцию Делоне ваших очков
- Отметьте ребра Делоне, которые соединяют две последовательные точки отбора. (См. на стр. 4-5 этой статьи как это можно сделать с помощью локального теста на каждом краю Делоне)
- Классифицируйте все бесконечные грани Делоне как ВНЕ и переместите их в очередь Q .
- Пока Q не пусто
- Лицо Делоне f = Pop от Q
- Для каждого неклассифицированного соседнего треугольника t of f
- , если отмечен край Делоне, общий для t и f ,
классифицировать t как противоположность f
- еще классифицировать т так же, как f
- push t до Q
- Для каждого края Делоне e
- , если два соседних треугольника Делоне d1 , d2 оба классифицированы как ИНТЕРЬЕР, выведите сегмент, соединяющий центр окружности d1 и d2 .
Для такого ввода
следующая аппроксимация средней оси может быть вычислена:
Вы можете проверить, как это приближение по средней оси ведет себя на практике, используя бесплатный двоичный файл windows Mesecina . Исходный код здесь .