Участник:Muravyov — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Монотонный метод)
Строка 59: Строка 59:
 
|proof=
 
|proof=
 
Предположим, что <tex>P</tex> не <tex>y</tex>-монотонный. Тогда докажем, что <tex>P</tex> содержит split и merge вершины. Поскольку <tex>P</tex> не <tex>y</tex>-монотонный, горизонтальная прямая <tex>l</tex> пересекает его стороны более двух раз. Выберем <tex>l</tex> таким образом, чтобы самой левой компонентой пересечения <tex>l</tex> и <tex>P</tex> был бы отрезок <tex>pq</tex>. Далее будем двигаться наверх по сторонам <tex>P</tex>, начиная от точки <tex>q</tex>. В результате в некоторой точке <tex>r</tex>, где <tex>r \neq p</tex> (случай (a) на рисунке), прямая <tex>l</tex> снова пересечёт одну из сторон <tex>P</tex>. Отсюда самая высокая точка, которую мы достигли во время движения по сторонам <tex>P</tex>, будет split вершиной.
 
Предположим, что <tex>P</tex> не <tex>y</tex>-монотонный. Тогда докажем, что <tex>P</tex> содержит split и merge вершины. Поскольку <tex>P</tex> не <tex>y</tex>-монотонный, горизонтальная прямая <tex>l</tex> пересекает его стороны более двух раз. Выберем <tex>l</tex> таким образом, чтобы самой левой компонентой пересечения <tex>l</tex> и <tex>P</tex> был бы отрезок <tex>pq</tex>. Далее будем двигаться наверх по сторонам <tex>P</tex>, начиная от точки <tex>q</tex>. В результате в некоторой точке <tex>r</tex>, где <tex>r \neq p</tex> (случай (a) на рисунке), прямая <tex>l</tex> снова пересечёт одну из сторон <tex>P</tex>. Отсюда самая высокая точка, которую мы достигли во время движения по сторонам <tex>P</tex>, будет split вершиной.
 +
 +
[[Файл:Proof_lemma.jpg|500px]]
 +
 
Если же <tex>r = p</tex> (случай (b) на рисунке), начём опять двигаться по сторонам <tex>P</tex> теперь уже вниз. Как и в предыдущем случае найдётся некоторая точка <tex>r'</tex>, которая будет результатом пересечения <tex>l</tex> и <tex>P</tex>. При этом <tex>r' \neq p</tex>, в противном случае <tex>l</tex> будет пересекать <tex>P</tex> только два раза, то есть <tex>P</tex> будет <tex>y</tex>-монотонным, что противоречит нашему предположению. Аналогично предыдущему случаю, выберем теперь самую низкую точку, которую мы достигли во время движения по сторонам P. Она будет merge вершиной.
 
Если же <tex>r = p</tex> (случай (b) на рисунке), начём опять двигаться по сторонам <tex>P</tex> теперь уже вниз. Как и в предыдущем случае найдётся некоторая точка <tex>r'</tex>, которая будет результатом пересечения <tex>l</tex> и <tex>P</tex>. При этом <tex>r' \neq p</tex>, в противном случае <tex>l</tex> будет пересекать <tex>P</tex> только два раза, то есть <tex>P</tex> будет <tex>y</tex>-монотонным, что противоречит нашему предположению. Аналогично предыдущему случаю, выберем теперь самую низкую точку, которую мы достигли во время движения по сторонам P. Она будет merge вершиной.
 
}}
 
}}

Версия 14:01, 30 апреля 2012

Триангуляция полигона — декомпозиция многоугольника P на множество треугольников, внутренние области которых попарно не пересекаются и объединение которых в совокупности составляет P. В строгом смысле слова, вершины этих треугольников должны совпадать с вершинами исходного многоугольника. Триангуляция любого многоугольника не единственна. В этом можно убедиться из примера на рисунке.

Постановка задачи

На плоскости задан произвольный многоугольник. Стороны многоугольника не пересекаются. Требуется найти его триангуляцию.

Теорема о существовании трингуляции

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

Теорема (О существовании триангуляции многоугольника):
У любого простого n-вершинного многоугольника P всегда существует триангуляция, причём количество треугольников в ней n2 независимо от самой триангуляции.
Доказательство:

Доказательство ведётся индуктивно по n. При n=3 теорема тривиальна. Рассмотрим случай при n>3 и предположим, что теорема выполняется при всех m<n. Докажем существование диагонали в многоугольнике P. Возьмём самую левую по оси x вершину v многоугольника P и две смежных с ней вершины u и w. Если отрезок uw принадлежит внутренней области P — мы нашли диагональ. В противном случае, во внутренней области треугольника Δuwv или на самом отрезке uw содержится одна или несколько вершин P. Выберем самую наиболее далеко отстоящую от uw вершину v. Отрезок, соединяющий v и v не может пересекать сторон P, поскольку в противном случае одна из вершин это отрезка будет располагаться дальше от uw, чем v. Это противоречит условию выбора v. В итоге получаем, что vv — диагональ. Любая диагональ делит P на два многоугольника P1 и P2. За m1 и m2 обозначим количество вершин в P1 и P2 соответственно. m1<n и m2<n, поэтому по предположению индукции у P1 и P2 существует триангуляция, следовательно и у P она существует.

Докажем, что триангуляция P состоит из n2 треугольников. Рассмотрим произвольную диагональ d в триангуляции TP. d делит P на два многоугольника P1 и P2, количество вершин в которых m1 и m2 соответственно. Каждая вершина P встречается только в одном из двух многоугольников P1 и P2, за исключением тех, которые являются концами d, поэтому справедливо следующее: m1+m2=n+2. По индукции, любая триангуляция Pi состоит из mi2 треугольников, откуда следует, что TP. состоит из (m12)+(m22)=n2 треугольников.

Способы нахождения триангуляции

Примитивный алгоритм

В общем случае в произвольном n-угольнике всего n2 возможных вариантов построения диагоналей. За O(n) проверим каждый из них. Для этого выясним:

  • пересекает ли данная диагональ многоугольник — находится за линейное время проверкой по всем рёбрам
  • принадлежит ли диагональ внутренней область многоугольника.

Чтобы построить триангуляцию нужно найти n3 диагоналей. В результате получается оценка O(n4).

Для некоторых классов многоугольников предыдущую оценку можно улучшить. Например, если многоугольник выпуклый, то достаточно лишь выбирать одну его вершину и соединять со всеми остальными, кроме его соседей. В итоге оценка O(n).

Монотонный метод

Определение:
Простой многоугольник P называется монотонным относительно прямой l, если любая l, такая что ll, пересекает стороны P не более двух раз (результатом пересечения l и P может быть не быть не более одного отрезка).


Определение:
Многоугольник, монотонный относительно y-оси называется y-монотонным.


Идея данного метода заключается в том, чтобы разбить многоугольник на монотонные части, а затем триангулировать каждую из них.

Пять типов вершин

Рассмотрим самую верхнюю — максимальную по оси y вершину. Будем идти вниз по рёбрам до самой нижней — соотвественно минимальной по y вершине, то есть таким образом, что для некоторой вершины j: yj>yj+1. Поворотной назовём вершину i, на которой направление обхода будет меняется: yi1>yi и yi<yi+1. Опишем более подробно этот тип вершин. Уточним понятния выше и ниже: точка p лежит ниже точки q, если py<qy или если py<qy и px>qx, соответственно точка p лежит выше точки q, если py>qy или если py=qy и px<qx. Это было сделано для того, чтобы избежать неопределённых ситуаций с вершинами, у которых y-координаты равны.

Обозначим за ϕ внутренний при некоторой вершине вершине и определим далее пять типов вершин, четыре из которых являются поворотными:

  • start вершина — два её соседа лежат ниже её самой и ϕ<π
  • split вершина — два её соседа лежат ниже её самой и ϕ>π
  • end вершина — два её соседа лежат выше её самой и ϕ<π
  • merge вершина — два её соседа лежат выше её самой и ϕ>π
  • regular вершина — не является поворотной, в отличие от остальных, другими словами один её сосед находится выше, а другой ниже её самой.
Лемма:
Многоугольник P является y-монотонным, когда в нём отсутствуют split и merge вершины.
Доказательство:

Предположим, что P не y-монотонный. Тогда докажем, что P содержит split и merge вершины. Поскольку P не y-монотонный, горизонтальная прямая l пересекает его стороны более двух раз. Выберем l таким образом, чтобы самой левой компонентой пересечения l и P был бы отрезок pq. Далее будем двигаться наверх по сторонам P, начиная от точки q. В результате в некоторой точке r, где rp (случай (a) на рисунке), прямая l снова пересечёт одну из сторон P. Отсюда самая высокая точка, которую мы достигли во время движения по сторонам P, будет split вершиной.

Proof lemma.jpg

Если же r=p (случай (b) на рисунке), начём опять двигаться по сторонам P теперь уже вниз. Как и в предыдущем случае найдётся некоторая точка r, которая будет результатом пересечения l и P. При этом rp, в противном случае l будет пересекать P только два раза, то есть P будет y-монотонным, что противоречит нашему предположению. Аналогично предыдущему случаю, выберем теперь самую низкую точку, которую мы достигли во время движения по сторонам P. Она будет merge вершиной.

Ушной метод

Более эффективным я