Изменения

Перейти к: навигация, поиск

Участник:Kabanov

6401 байт убрано, 21:44, 20 января 2015
м
Сумма
'''Триангуляция полигона ''' — декомпозиция многоугольника <tex>P</tex> на множество треугольников, внутренние области которых попарно не пересекаются и объединение которых в совокупности составляет <tex>P</tex>. В строгом смысле слова, вершины этих треугольников должны совпадать с вершинами исходного многоугольника. Триангуляция любого многоугольника не единственна. В этом можно убедиться из примера на рисунке.  На плоскости задан произвольный многоугольник. Стороны многоугольника не пересекаются. Требуется найти его триангуляцию. == Теорема о существовании триангуляции Описание == '''Простым многоугольником''' является фигураСумма Минковского позволяет решать задачу Motion Planning, ограниченная одной замкнутой ломанойв случае, стороны которой не пересекаютсякогда робота нельзя поворачивать. Таким образом, случаи многоугольников с дырками в теореме исключаются.{{Теорема|about = О существовании триангуляции многоугольника|statement =У любого простого каждой точке <tex>n(x, y)</tex>-вершинного многоугольника ставится в соответствие фигура робота <tex>PR(x, y)</tex> всегда существует триангуляция, причём количество треугольников с точкой привязки помещенной в ней точку <tex>n - 2(x, y)</tex> независимо от самой триангуляции.|proof={{Определение[[Файл:Proof theorem.jpg|100px|thumb|right]]Доказательство ведётся индуктивно по <tex>n</tex>. При <tex>n definition= 3</tex> теорема тривиальна. Рассмотрим случай при <tex>n > 3</tex> и предположим, что теорема выполняется при всех <tex>m < n</tex>. Докажем существование диагонали в многоугольнике <tex>P</tex>. Возьмём самую левую по оси <tex>x</tex> вершину <tex>v</tex> многоугольника Для заданного робота <tex>PR</tex> и две смежных с ней вершины <tex>u</tex> и <tex>w</tex>. Если отрезок <tex>uw</tex> принадлежит внутренней области препятствия <tex>P</tex> — мы нашли диагональ. В противном случае, во внутренней области треугольника <tex>\Delta uwv</tex> или на самом отрезке <tex>uw</tex> содержится одна или несколько вершин <tex>P</tex>. Выберем из них наиболее удалённую от <tex>uw</tex> вершину <tex>v'</tex>. Отрезок, соединяющий <tex>v</tex> и <tex>v'</tex> не может пересекать ребро <tex>P</tex>, поскольку в противном случае одна из вершин этого ребра будет располагаться дальше от <tex>uw</tex>, чем <tex>v'</tex>. Это противоречит условию выбора <tex>vК-препятствием''</tex>. В итоге получаем, что <tex>v'v</tex> — диагональ. Любая диагональ делит <tex>P</tex> на два многоугольника <tex>P_1</tex> и <tex>P_2</tex>. За <tex>m_1</tex> и <tex>m_2</tex> обозначим количество вершин в <tex>P_1</tex> и <tex>P_2</tex> соответственно. <tex>m_1 < n</tex> и <tex>m_2 < n</tex>, поэтому по предположению индукции у <tex>P_1</tex> и <tex>P_2</tex> существует триангуляция, следовательно и у <tex>P</tex> она существует. Докажемназывается множество точек, что триангуляция <tex>P</tex> состоит из <tex>n - 2</tex> треугольников. Рассмотрим произвольную диагональ <tex>d</tex> будучи помещенным в триангуляции <tex>T_P</tex>. <tex>d</tex> делит <tex>P</tex> на два многоугольника <tex>P_1</tex> и <tex>P_2</tex>, количество вершин в которых <tex>m_1</tex> и <tex>m_2</tex> соответственно. Каждая вершина <tex>P</tex> встречается только в одном из двух многоугольников <tex>P_1</tex> и <tex>P_2</tex>, за исключением тех, которые являются концами <tex>d</tex>, поэтому справедливо следующееробот заденет препятствие: <tex>m_1 + m_2 CP := n + 2</tex>. По индукции, любая триангуляция <tex>P_i</tex> состоит из <tex>m_i - 2</tex> треугольников\{(x, откуда следует, что <tex>T_P</tex>. состоит из <tex>(m_1 - 2y) + : R(m_2 - 2x, y) = n - 2\cap P \neq \varnothing\}</tex> треугольников.
}}
 
== Ушной метод ==
{{Определение
|definition='''Суммой Минковского''' двух множеств <tex>S_1 \subset R^2, S_2 \subset R^2</tex> называется множество <tex>S_1 \oplus S_2 := \{p + q : p \in S_1, q \in S_2\}</tex>, где <tex>p + q</tex> обозначает векторную сумму.
}}{{Определение
|definition=
Вершина '''Отрицанием''' множества <tex>v_iS \subset R^2</tex> называется '''ухом''', если диагональ множество <tex>v_-S := \{i-1}v_{i+1p : p \in S\}</tex> лежит строго во внутренней области многоугольника , где <tex>P-p</tex>обозначает векторное отрицание.
}}
 
{{Теорема
|about = О существовании двух ушей многоугольника|statement =У любого простого Для заданного робота <tex>R</tex> и препятствия <tex>nP</tex>, К-вершинного многоугольника препятствием является множество <tex>P\oplus (-R(0, 0))</tex> всегда существует два не пересекающихся между собой уха.
|proof=
[[Файл:Ear case1minkowski_sum.jpg‎png |200pxright |thumb|left100px]][[Файл:Ear_case2.jpg|200px|thumb|right]]Доказательство будем вести по индукции. Базовый случай: Необходимо доказать, что робот <tex>n = 4R(x, y)</tex>. Предположим для всех многоугольников, количество вершин в которых не больше пересекает препятствие <tex>nP</tex>в том и только в том случае, теорема верна. Рассмотрим многоугольник если <tex>(x, y) \in P</tex>\oplus (-R(0, в котором <tex>n+10))</tex> вершина. Далее возможны два случая:* Произвольная выпуклая вершина Пусть робот задевает препятствие, и точка <tex>v_i</tex> многоугольника <tex>Pq = (q_x , q_y)</tex> является ухомточкой пересечения. Отрезав это ухоТогда, мы уменьшим число вершин так как <tex>Pq \in R(x, y)</tex> на одну. В результате, получиv то <tex>n(q_x - x, q_y - y) \in R(0,0)</tex>-вершинный многоугольник , или <tex>P'(x - q_x , y - q_y) \in -R(0,0)</tex>. По предположению индукции у него существует два непересекающихся уха. УчитываяА заметив, что уши <tex>q \in P'</tex> являются ушами и , получаем <tex>(x, y) \in P</tex>, несложно заметить\oplus (-R(0, что для <tex>P0))</tex> теорема верна.* Произвольная выпуклая вершина <tex>v_i</tex> многоугольника В обратную сторону, пусть <tex>(x, y) \in P</tex> не является ухом. В таком случае в треугольнике <tex>\Delta v_{ioplus (-1}v_{i}v_{i+1}R(0,0))</tex> лежат вершины, принадлежащие тогда существуют точки <tex>P</tex>. Из этих вершин выберем вершину <tex>q</tex>(r_x , r_y) \in R(0, которая будет ближе всего к <tex>v_i0)</tex>. Проведём отрезок <tex>Qи </tex>(p_x , который разделит <tex>p_y) \in P</tex> на два многоугольника: такие, что <tex>P_1(x, y) = (p_x - r_x , p_y - r_y)</tex> и или <tex>P_2(p_x , p_y) = (x + r_x , y + r_y)</tex>. В каждом из них будет не более <tex>n</tex> вершин, следовательно у каждого будет по два непересекающихся уха. Даже если предположитьа это означает, что ухо из <tex>P_1R(x, y)</tex> и ухо из <tex>P_2</tex> будут пересекаться по стороне <tex>v_{i}q</tex>, в пересекает <tex>P</tex> всё равно будет не менее двух непересекающихся ушей.
}}
==== Идея ===Допустим, для простоты, что робот и все препятствия выпуклые, а позже обобщим для невыпуклых фигур.{{Теорема|statement=Рассмотрим все вершины многоугольника Пусть заданы две выпуклые фигуры <tex>P</tex> и <tex>R</tex>, с числом вершин <tex>n</tex> и где возможно, будем отрезать уши до тех пор, пока <tex>m</tex> соответственно. Тогда суммой Минковского <tex>P\oplus R</tex> является выпуклая фигура с не станет треугольникомболее чем <tex>m + n</tex> вершинами.|proof=[[Файл:minkowski_extreme.png | right | 200px]]Для начала заметим, что любая крайняя точка в направлении вектора <tex>\vec{d}</tex> есть сумма крайних точек фигур в этом направлении. Убедиться в этом можно спроецировав обе фигуры на вектор <tex>\vec{d}</tex>.
Будем рассматривать вершины многоугольника в порядке обхода. Индексирование вершин для удобства будем вести по модулю Теперь рассмотрим произвольное ребро <tex>ne</tex>, т.е. из <tex>v_{-1} = v_{n-1}</tex> и <tex>v_0 = v_nP \oplus R</tex>. Если вершина <tex>v_i</tex> Оно является ухомкрайним в направлении к своей нормали, а значит оно образовано крайними точками фигур, и хотя бы у одной из фигур должно быть ребро, построим диагональ которое является крайним в этом направлении. Сопоставим <tex>v_{i+1}v_{i-1}e</tex> и отрежем треугольник с этим ребром. Тогда сопоставив таким образом всем ребрам <tex>P \Delta v_{i-1}v_{i}v_{i+1}oplus R</tex> от ребра исходных фигур, получаем что всего ребер в <tex>P\oplus R</tex>. В противном случае переходим к следующей вершине не более чем <tex>v_{im +1}</tex> в порядке обхода.  ==== Алгоритм ====При проверке каждой вершину следует для начала проверить, является ли она выпуклой, в противном случае её просто нет надобности рассматривать в качестве уха. Это несложно сделать, воспользовавшись [[Предикат_"левый_поворот"|левым поворотом]]. "Ушную" проверку вершины будем осуществлять алгоритмом принадлежности точки <tex>n</tex>-угольнику (в нашем случае треугольнику). В качестве поддерживаемых структур удобно хранить DCEL, в котором будем строить новые диагонали, и список вершин с двойными связями, аналогичный DCEL по построениютак как каждое ребро исходных фигур использовалось не более раза.}}
==Псевдокод == Псевдокод i =j =0 V[n] =V[0], V[n+1] =V[1], W[n] = W[0], W[n+1] = W[1] DCVL D1 //список вершин doubly connected vertex list по аналогии с DCEL while i < n or j < m do DCEL D2 add V[i]+W[j] to answer Construct if angle(D1V[i], V[i+1]); Construct< angle(D2W[j], W[j+1]); vertex v = random_vertex_of(D1); ++i while size_of else if angle(D1V[i], V[i+1]) <tex> \neq </tex> 3 if IsConvexangle(vW[j], W[j+1]) //проверка на выпуклость for each Vertex v_i in D1 ++j if v_i else ++i, ++jЗдесь множества точек <tex> \neq V</tex> v, v.prev(), v.next() //проверка всех вершин на and v_i и <tex>\in W</tex> Triangle(v, v.prev(), v.next())//принадлежность треугольникуотсортированы в порядке обхода против часовой стрелки, //одной из вершин которого //причем первым элементом в обоих массивах является потенциальное ухо vсамая левая нижняя точка множества. edge e = new edge(v.prevФункция angle возвращает значение полярного угла вектора, v.next) Insert e in D2; v = v.next Delete vзаданного ее аргументами.prev from D1
==== Корректность ====При нахождении каждого уха от многоугольника алгоритма следует из доказательства предыдущей теоремы, а время работы равно <tex>PO(n + m)</tex> отрезается треугольник, состоящий так как на каждой итерации хотя бы один из самого уха индексов <tex>i</tex> и его двух смежных вершин<tex>j</tex> увеличивается. Существование ушей в свою очередь следует из теоремы, доказанной выше. В конце алгоритма, когда все уши от == Случай невыпуклых фигур ==Для начала заметим следующий факт: <tex>PS_1 \oplus (S_2 \cup S_3) = (S_1 \oplus S_2) \cup (S_1 \oplus S_3)</tex> отрезаны, остается только один треугольник. Как несложно видеть, триангуляция выстраивается корректно.
==== Оценка работы ====Изначально в многоугольнике содержится <tex>\mathcal{O}(n)</tex> ушей. Нетрудно понятьВ случае, когда одна из фигур невыпукла, что в процессе отрезания ушейеё сначала надо затриангулировать, смежные точки могут тоже становиться ушами. В результате триангуляции образуется получив <tex>n - 3</tex> диагонали, соответственно максимальное количество вершин, которые в процессе могут становиться ушами <tex>2n - 62</tex>треугольников. Итого общее количество ушей будет <tex>\mathcal{O}(n)</tex>. ОпределитьПосле этого, является ли вершина ухом можно за <tex>\mathcal{O}(n)</tex>уже известным алгоритмом, поскольку используется алгоритм определения принадлежности точки треугольнику — это надо построить <tex>\mathcal{O}(1)</tex>. Таким образом общий процесс отрезания ушей займёт <tex>\mathcal{O}(n^-2)</tex>. Невыпуклых вершин всего выпуклых фигур с не более чем <tex>\mathcal{O}(n)m+3</tex>вершинами, каждая которые будут суммами Минковского соответствующих треугольников. Объединение этих выпуклых фигур будет состоять из них обрабатывается за константу, поэтому общее время для их обработки <tex>\mathcal{O}(nnm)</tex>. Списки рёбер и вершин строятся за линейное время, добавление ребра и удаление вершины в каждом из них работает за константу. Общее время <tex>\mathcal{O}(n^2)</tex>. Поскольку храним только два списка — память линейная.
[[Категория: Вычислительная геометрия]]В случае, когда обе фигуры невыпуклы, обе эти фигуры надо затриангулировать, получив <tex>n-2</tex> и <tex>m-2</tex> треугольников соответственно. Построив суммы Минковского множеств этих треугольников получим <tex>(n-2)(m-2)</tex> выпуклых фигур, объединение которых состоит из <tex>O(n^2m^2)</tex> вершин.
418
правок

Навигация