В вычислительной геометрии триангуляция многоугольника — это разбиение многоугольной области ( простого многоугольника ) P на множество треугольников [1] , т. е. нахождение множества треугольников с попарно непересекающимися внутренностями, объединение которых равно P.
Триангуляции можно рассматривать как частные случаи плоских прямолинейных графов . Когда нет отверстий или добавленных точек, триангуляции образуют максимальные внешнепланарные графы .
Со временем было предложено несколько алгоритмов для триангуляции многоугольника.
Триангулировать любой выпуклый многоугольник в веерную триангуляцию за линейное время несложно , добавляя диагонали из одной вершины ко всем остальным вершинам, не являющимся ближайшими соседями.
Общее число способов триангуляции выпуклого n- угольника непересекающимися диагоналями равно ( n −2)-му числу Каталана , которое равно
формула, найденная Леонардом Эйлером . [2]
Монотонный многоугольник можно триангулировать за линейное время с помощью алгоритма А. Фурнье и Д. Я. Монтуно [3] или алгоритма Годфрида Туссена [4] .
Один из способов триангуляции простого многоугольника основан на теореме о двух ушах , поскольку любой простой многоугольник с не менее чем 4 вершинами без отверстий имеет не менее двух « ушей », представляющих собой треугольники, две стороны которых являются ребрами многоугольника, а третья полностью находится внутри него. [5] Затем алгоритм состоит из поиска такого уха, удаления его из многоугольника (что приводит к новому многоугольнику, который по-прежнему соответствует условиям) и повторения до тех пор, пока не останется только один треугольник.
Этот алгоритм прост в реализации, но медленнее, чем некоторые другие алгоритмы, и работает только на многоугольниках без отверстий. Реализация, которая сохраняет отдельные списки выпуклых и вогнутых вершин, будет работать за время O( n 2 ) . Этот метод известен как отсечение ушей и иногда обрезка ушей . Эффективный алгоритм для отсечения ушей был обнаружен Хоссамом Эль-Гинди, Хейзел Эверетт и Годфридом Туссеном . [6]
Простой многоугольник монотонен относительно прямой L , если любая прямая, ортогональная L, пересекает многоугольник не более двух раз. Монотонный многоугольник можно разбить на две монотонные цепи . Многоугольник, монотонный относительно оси y, называется y-монотонным . Монотонный многоугольник с n вершинами можно триангулировать за время O( n ) . Предполагая, что заданный многоугольник является y-монотонным, жадный алгоритм начинается с обхода одной цепи многоугольника сверху вниз с добавлением диагоналей, когда это возможно. [1] Легко видеть, что алгоритм можно применить к любому монотонному многоугольнику.
Если полигон не монотонен, его можно разбить на монотонные подполигоны за время O( n log n ) с использованием подхода sweep-line . Алгоритм не требует, чтобы полигон был простым, поэтому его можно применять к полигонам с отверстиями . Как правило, этот алгоритм может триангулировать плоское подразделение с n вершинами за время O( n log n ) с использованием пространства O( n ) . [1]
Полезный граф, который часто ассоциируется с триангуляцией многоугольника P , — это двойственный граф . Если задана триангуляция T P многоугольника P , то граф G ( T P ) определяется как граф, множество вершин которого — треугольники T P , причем две вершины (треугольники) являются смежными тогда и только тогда, когда они имеют общую диагональ. Легко заметить, что G ( T P ) — это дерево с максимальной степенью 3.
До 1988 года вопрос о том, можно ли триангулировать простой многоугольник быстрее, чем за время O( n log n ), был открытым в вычислительной геометрии. [1] Затем Тарьян и Ван Вик (1988) открыли алгоритм триангуляции со временем O( n log log n ) [7] , позже упрощенный Киркпатриком, Клэве и Тарьяном (1992). [8] Затем последовало несколько улучшенных методов со сложностью O( n log * n ) (на практике неотличимой от линейного времени ). [9] [10] [11]
Бернар Шазелл показал в 1991 году, что любой простой многоугольник может быть триангулирован за линейное время, хотя предложенный алгоритм очень сложен. [12] Известен также более простой рандомизированный алгоритм с линейным ожидаемым временем. [13]
Алгоритм разложения Зейделя [10] и метод триангуляции Шазелла подробно обсуждаются в работе Ли и Клетте (2011). [14]
Временная сложность триангуляции многоугольника с n вершинами и отверстиями имеет нижнюю границу Ω( n log n ) в алгебраических моделях вычислений на основе дерева . [1] Можно вычислить количество различных триангуляций простого многоугольника за полиномиальное время с помощью динамического программирования и (на основе этого алгоритма подсчета) сгенерировать равномерно случайные триангуляции за полиномиальное время. [15] Однако подсчет триангуляций многоугольника с отверстиями является #P-полным , что делает маловероятным, что его можно выполнить за полиномиальное время. [16]
{{citation}}
: CS1 maint: multiple names: authors list (link)