Изменения

Перейти к: навигация, поиск
Связь пересечения полуплоскостей с выпуклой оболочкой
[[Файл:samplesHalfspaces.png|400px|thumb|right|Пересечение существует и выпукло, неограничено неограниченно или пусто]][[Файл:halfSpaces.png|400px|thumb|right|Нужна ли нам верхняя полуплоскость?]]
== Предикат трех прямых ==Задача: есть конечное множество полуплоскотейполуплоскостей, найти фигуру их пересечения или сообщить что оно пусто.
Для начала заметим, что если пересечение не пусто, то оно выпукло. (Доказательство {{---}} Пересечение выпуклых фигур выпукло, а полуплоскоть полуплоскость выпукла)
Пусть у нас прямые полуплоскости заданы уравнениями вида прямых и ориентацией, с какой стороны от прямой лежит полуплоскость. Сначала рассмотрим все полуплоскости, которые "смотрят", то есть ориентированны, вниз. Аналогично можно рассмотреть все полуплоскости, которые ориентированны вверх. {{Лемма|statement=[[Файл:halfSpaces.png|400px|thumb|right|Нужна ли полуплоскость <tex> Ax + By + C = 0 l'' </tex>. Тогда предикат?]]Предикат проверки (см. рисунок) проверки того, что прямая <tex> l'' : A''x + B''y + C'' = 0 </tex> лежит над пересечением прямых <tex> l : Ax + By + C = 0 </tex> и <tex> l' : A'x + B'y + C' = 0 </tex> будет равен знаку определителя <tex>
\begin{vmatrix}
A & B & C \\
\end{vmatrix}
</tex>.
|proof=Докажем это. Для проверки предиката нам надо нужно определить знак выражения <tex> A''x_0 + B''y_0 + C'' </tex>, где <tex> (x_0, y_0) </tex> {{---}} точка пересечения прямых <tex> l' </tex> и <tex> l </tex>. Эту точку можно найти Эта точка находится из уравнения <tex> \begin{pmatrix}
A & B\\
A' & B'
\end{vmatrix}
}
</tex>. Подставим его это решение в <tex> A''x_0 + B''y_0 + C'' </tex> и домножим на определитель. <tex>A'' \left<(B'; -B);(-C; -C')\right> + B'' \left<(-A'; A);(-C; -C')\right> + C'' \begin{vmatrix} A & B \\ A' & B' \end{vmatrix} =</tex> <tex>= A'' \begin{vmatrix} B' & B \\ -C' & -C \end{vmatrix} - B'' \begin{vmatrix} A' & A \\ -C' & -C \end{vmatrix} + C'' \begin{vmatrix} A & A' \\ B & B' \end{vmatrix} =</tex>
<tex> A'' (B'; -B)(-C; -C') + B'' (-A'; A)(-C; -C') + C \begin{vmatrix} A & B \\ A' & B' \end{vmatrix} = A'' \begin{vmatrix} B' & B \\ -C' & -C \end{vmatrix} - B'' \begin{vmatrix} A' & A \\ -C' & -C \end{vmatrix} + - C'' \begin{vmatrix} A ' & A' \\ B ' & B' \end{vmatrix} = \begin{vmatrix} A'' & A' & A \\ B'' & B' & B \\ -C'' & -C' & -C \end{vmatrix} =</tex><tex>= \begin{vmatrix} A & B & C \\ A' & B' & C' \\ A'' & B'' & C'' \end{vmatrix} </tex>}}
Таким образом , если представить прямую <tex> Ax + By + C = 0 </tex> как точку с однородными координатами <tex> (A, B, C) </tex>, где <tex> C </tex> {{---}} однородная координата, то этот предикат {{---}} всего лишь поворот, а проверка предиката {{---}} проверка очередной точки в [[Статические выпуклые оболочки: Джарвис, Грэхем, Эндрю, Чен, QuickHull#Алгоритм Грэхема|обходе Грэхема]] для нахождения выпуклой оболочки.
Алгоритм:
* Отсортировать все полуплоскости по углу наклона;
* Запустить обход Грэхема для полуплоскостей, смотрящих вниз (с предикатом-определителем);
* То же самое Запустить обход Грэхема для полуплоскостей, смотрящих вверх;
* Пересечь две цепочки.
От пересечения цепочек напрямую зависит фигура пересечения: неограниченная область получается если одна из цепочек пуста, а ограниченная {{---}} когда обе цепочки не пусты и пересекаются.
== Связь пересечения полуплоскостей с выпуклой оболочкой ==
{{Лемма
|id=1
|statement= Пересечение полуплоскостей может быть получено построением выпуклой оболочки в [[двойственное пространство|двойственном прострастве]] для множества точек, являющихся дуальным преобразованием исходных полуплоскостей
|proof=
[[Файл:DualSpaceCH.png ‎ |400px|thumb|right| Множество точек в двойственном пространстве]]
[[Файл:DualSpaceCH400.png |400px|thumb|right| Множество прямых в исходном пространстве]]
'''Важно:''' Покажем конструктивный алгоритм для множестве полуплоскостей, не содержащих вертикальный полуплоскости. После леммы приведены два рассуждения, позволяющие снять данное ограничение.
'''Важно:''' В картинке перепутаны <tex>P</tex> и <tex>P^\star</tex>. TODO
Рассмотрим планарный случай и предположим, что вертикальные и параллельные прямые отсутствуют (в конце приведем два способа решения данной проблемы).
Пусть у нас есть множество ориентированных прямых, каждая из которых задает полуплоскость(направление вектора нормали задаёт нужную полуплоскость).
Тогда каждую плоскость мы можем превратить в точку в двойственном пространстве: <tex> P(p_x, p_y) \Rightarrow P^\star (p_x x - p_y)</tex>.
Далее воспользуемся основными свойствами дуальной трансформации (см. доказательтсво в конспекте о [[двойственное пространство|двойственном прострастве]]):
#<tex>p</tex> <tex>\in</tex> <tex>l</tex> <tex>\Leftrightarrow</tex> <tex>l^\star</tex> <tex>\in</tex> <tex>p^\star</tex>, где <tex>p</tex> - точка в исходном пространстве, <tex>l</tex> - прямая в исходном пространстве, <tex>l^\star</tex>, <tex>p^\star</tex> - их дуальное отображение.
#<tex>p</tex> лежит "над" <tex>l</tex> <tex>\Leftrightarrow</tex> <tex>l^\star</tex> лежит "над" <tex>p^\star</tex>
Рассмотрим отображение <tex> D </tex> между точками и прямыми, такое что:
'''Важно 2:''' * <tex> Dp^\star</tex> - точка в двойственном пространстве, <tex>p</tex> - линия в исходном,* <tex>l^\star</tex> - прямая в двойственном пространстве, <tex>l</tex> - точка в исходном,* Значок <tex>*</tex> означает, что элемент из двойственного пространства.Рассмотрим множество точек(<tex>P^\star</tex>) в двойственном пространстве и рассмотрим верхнюю часть выпуклой оболочки, построенной на этих точках. Обозначим её за <tex>\mathcal{UH}</tex>(k, bUpper hull)) = . Далее мы будем работать только с прямыми(Y = kX - bв исходном пространстве) , у которых вектор нормали направлен вниз, т.е они образовывают верхнюю цепочку.По свойству выпуклой оболочки, любое ребро из цепи <tex>\mathcal{UH}</tex>содержит "ниже" себя все точки множества <tex>P^\star</tex>, а так же эта цепь соединяет самую правую точку с самой левой.
Рассмотрим какую-то точку <tex>p^\star \in P^\star</tex> и заметим, что она будет принадлежать цепи <tex>\mathcal{UH}</tex> <tex>\Leftrightarrow</tex> <tex>\exists</tex> прямая <tex>l^\star </tex> : <tex>p^\star \in l^\star</tex> и все точки из <tex>P^\star</tex> лежат ниже <tex> Dl^\star</tex> (Y = kX + bсейчаc мы жили в двойственном пространстве) = P. В обычном пространстве данный факт эквивалентен следующему: *Дуальное отображение точки <tex>p^\star</tex> в базовое пространство {{---}} прямая <tex>p</tex>, которая по ''первому свойству'' содержит точку <tex>l</tex>(kв базовом пространстве прямая <tex>p^\star</tex> перешла в точку <tex>p</tex>).*Так как прямая <tex>l^\star</tex> лежит выше всех точек, -b) то теперь каждая прямая из <tex>P</tex> лежит выше точки <tex>l</tex>(по свойству 2).
Это отображение не рассматривает вертикальные прямыеИтого: у нас есть точка <tex>l</tex> на прямой <tex>p</tex>, поэтому их мы рассмотрим в конце отдельнолежащая ниже всех остальных прямых из <tex>P</tex>.
[[Файл:dualПосмотрим на планарный граф множества(рис.2) прямых.png|400px|thumb|right|Совпадение верхнего CH и нижней огибающей]]Будем обозначатьИз факта выше, мы можем понять, что <tex> D(p) = p^* </tex>внесла ребро в самый нижний фейс(именно тот, который задаёт часть пересечения полуплоскостей). Обозначим цепочку данного фейса, как <tex> D\mathcal{LE}</tex>. Математически данную цепочку мы можем описать, как минимум из всех линейных функция (lзаданные прямыми) = l^* в <tex>P</tex>. Так же <tex>X</tex> компонента узлов этой цепочки монотонно возрастает.
Факт дуализма:* Точка Вернемся к <tex> p </tex> лежит под/на/над прямой <tex> l \mathcal{UH}</tex> тогда и только тогдазаметим, когда что при обходе цепи, координата <tex> D(l) X</tex> лежит под/на/над прямой точек растет. Если же мы будет обходить цепочку из <tex> D(p) P</tex>;Тогда точка , образующую пересечение полуплоскостей, мы заметим, что наклон прямых уменьшается. Учитывая этот факт, и то что наклон линии из <tex> p \in P = \cup p_i mathcal{LE}</tex> принадлежит совпадет с <tex> UH(P) X</tex> тогда координатой точки (вспоминаем отображение и только тогдаприменяем производную), когда существует такая не вертикальная прямая <tex> l </tex>можно сделать вывод, что обход слева направо точек из цепи <tex> \forall i : p_i mathcal{UH}</tex> лежит под , совпадает с обходом точек из <tex> l \mathcal{LE}</tex>справа налево.
Перефразируем для dual-пространства:* Существует (Обе линии монотоны, одна возрастает, другая убывает. Количество точек в массиве одинаковое, при это каждая точка из <tex> l^* \mathcal{UH}</tex> на прямой внесла вклад в <tex> p^* \in P^* : l^* </tex> лежит под любой прямой из <tex> P^*mathcal{LE}</tex>.)
Рассмортим верхний конвекс-халл точек Напоследок, cоседние точки <tex> P p^\star</tex> (англ. ''upper convex hull'') и нижнюю огибающей прямых <tex> Pq^* \star</tex> (англ. ''lower envelope''). Точки в из <tex> P ^\star</tex> появляются в образуют какое-то или принадлежат какому-то ребру <tex> \mathcal{UH(P) }</tex> по увелечению х-координаты. Прямые в <tex> P^* \Leftrightarrow</tex> появляются в все точки из <tex> LE(P^*) \star</tex> по уменьшению угла наклона. Так как угол наклона соответствует х-координатележат "ниже" линии, то список точек построенной на точках <tex> UH(P) p^\star</tex> слева-направо соответствует списку справа-налево ребер и <tex> LE(Pq^*) \star</tex>. Таким образом верхний конвекс-халл соответствует нижней огибающей В исходном пространстве это означает: все прямые из пространства <tex>P</tex> за исключением прямых<tex>p</tex> и <tex>q</tex> лежат над пересечением <tex>p</tex> и <tex>q</tex>. Аналогично для нижнего СН Это достаточное условие, что пересечение <tex>p</tex> и верхней огибающей<tex>q</tex> <tex>\in</tex> <tex>\mathcal{LE}</tex>.
Более формально: точки <tex> p, q \in P : pq </tex> {{---}} ребро верхнего конвекс-халла тогда и только тогда, когда все остальные точки из <tex> P </tex> лежат ниже прямой, проходящей через это реброТаким образом мы построили верхнее пересечение полуплоскостей. В dual-пространстве получаемАналогичным образом строится нижнее, что <tex> \forall r^*, r \in P \setminus \{p, q\} </tex> лежат над точкой пересечения <tex> p^* </tex> и <tex> q^* </tex>затем мы пересекаем полученные две цепочки. Это как раз условие, что <tex> p^* \cap q^* </tex> {{---}} вершина <tex> LE(P^*) </tex>.Что же делать с вертикальными линиями?Таким образом получаем алгоритм:* Считаем <tex> H_+ # Найдем все вертикальным прямые за </tex>. O(полуплоскости, смотрящие вверхN)* Считаем <tex> H_- </tex>. (полуплоскостиВозьмем самую правую, у которой нормаль смотрит вправо, и самую левую, смотрящие вниз)* Считаем <tex> H_> </tex>у которых нормаль смотрит влево. (вертикальные полуплоскостиПостроим верхнюю цепь и нижнюю цепь без всех вертикальных прямых, затем пересечем верхнюю цепь, смотрящие направо)* Считаем <tex> H_< </tex>. (вертикальные полуплоскостинижнюю цепь, смотрящие налево)* Пускаем заметающую самую правую и самую левую вертикальную прямую и получаем пересечение <tex> H_+ \cap H_- \cap H_> \cap H_< </tex>.Стоит уточнить, что каждое из этих множеств может быть пусто. Тогда мы не рассматриваем с ним объединение. Однако # Перейдем в результате мы можем получить пустое множество. Это главное отличние пересечения полуплоскостей и конвекс-халлаоднородное двойственное пространство.
== Источники ==
* http://wwwisg.cs.uni-magdeburg.de/ag/lehre/SS2012/GAG/slides/V12.pdf
* Mark de Berg, Otfried Cheong, Marc van Kreveld, Mark Overmars (2008), Computational Geometry: Algorithms and Applications (3rd edition), Springer-Verlag, ISBN 978-3-540-77973-5 Chapter 11 page 253-254
* http://wwwisg.cs.uni-magdeburg.de/ag/lehre/SS2012/GAG/slides/V12.pdf
 
[[Категория: Вычислительная геометрия]]
Анонимный участник

Навигация