Как и в заголовке вопроса, как триангулировать простой многоугольник, который динамически растет, то есть, когда новая вершина добавляется пользователем или компьютером динамически, многоугольник должен снова триангулироваться. Таким образом, вместо того, чтобы запускать какой-либо алгоритм триангуляции после добавления каждой новой вершины, есть ли какой-либо умный / эффективный (возможно, простой в реализации) способ для каждого нового ввода, который должен занять, скажем, ‹= O (n) времени, чтобы триангулировать многоугольник. Вновь добавленная вершина будет смежной с первой и последней вершинами текущего многоугольника.
динамическая триангуляция простого многоугольника
Ответы (2)
Когда вы вставляете новую вершину и заменяете ребро двумя, треугольник, который они образуют, может перекрывать несколько треугольников триангуляции. Перекрывающиеся треугольники образуют субполигон. Постройте контур этого многоугольника и вставьте новую вершину. Затем перетриангулируйте обновленный субполигон.
Я предполагаю, что перекрывающиеся треугольники можно эффективно найти, рекурсивно исследуя соседей начального треугольника и проверяя их на перекрытие. Контур субполигона образован краями, не являющимися общими для двух треугольников.
Я предполагаю, что многоугольник увеличивается на каждом шаге, добавляя вершину C, удаляя сегмент AB и добавляя сегменты AC и CB. Я также не предполагаю никаких вырождений.
Если ABC наматывается положительно (то есть многоугольник расширяется «наружу»), просто добавьте ABC к триангуляции.
В противном случае рассмотрим треугольник ABD из предыдущей триангуляции. Если C находится в этом треугольнике, удалите треугольник ABD и добавьте треугольники BDC и DAC. Если это не так, то он находится в субполигоне на стороне AD или на стороне BD. Удалите ABD и перейдите в соответствующий субполигон, добавив C (скажем) к сегменту BD. После завершения рекурсии добавьте треугольники BDC и DAC, как и раньше.
Это решение основывается на простоте как старого, так и нового многоугольника (несамопересечения). В противном случае добавление треугольников после рекурсивного шага может оказаться недопустимым.