Пересечение полуплоскостей, связь с выпуклыми оболочками — различия между версиями
Igorjan94 (обсуждение | вклад) м |
м (rollbackEdits.php mass rollback) |
||
(не показано 39 промежуточных версий 8 участников) | |||
Строка 1: | Строка 1: | ||
− | [[Файл:samplesHalfspaces.png|400px|thumb|right|Пересечение существует и выпукло, | + | [[Файл:samplesHalfspaces.png|400px|thumb|right|Пересечение существует и выпукло, неограниченно или пусто]] |
− | |||
− | Задача: есть конечное множество | + | == Предикат трех прямых == |
+ | Задача: есть конечное множество полуплоскостей, найти фигуру их пересечения или сообщить что оно пусто. | ||
− | Для начала заметим, что если пересечение не пусто, то оно выпукло. (Доказательство {{---}} Пересечение выпуклых фигур выпукло, а | + | Для начала заметим, что если пересечение не пусто, то оно выпукло. (Доказательство {{---}} Пересечение выпуклых фигур выпукло, а полуплоскость выпукла) |
− | Пусть | + | Пусть полуплоскости заданы уравнениями прямых и ориентацией, с какой стороны от прямой лежит полуплоскость. |
− | <tex> | + | |
+ | Сначала рассмотрим все полуплоскости, которые "смотрят", то есть ориентированны, вниз. Аналогично можно рассмотреть все полуплоскости, которые ориентированны вверх. | ||
+ | |||
+ | {{Лемма | ||
+ | |statement= | ||
+ | [[Файл:halfSpaces.png|400px|thumb|right|Нужна ли полуплоскость <tex> 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} | \begin{vmatrix} | ||
A & B & C \\ | A & B & C \\ | ||
Строка 14: | Строка 20: | ||
\end{vmatrix} | \end{vmatrix} | ||
</tex>. | </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} | |
− | \begin{pmatrix} | ||
A & B\\ | A & B\\ | ||
A' & B' | A' & B' | ||
Строка 28: | Строка 33: | ||
-C' | -C' | ||
\end{pmatrix} | \end{pmatrix} | ||
− | </tex>. | + | </tex>. Решением будет <tex> |
− | |||
− | <tex> | ||
\begin{pmatrix} | \begin{pmatrix} | ||
x_0\\ | x_0\\ | ||
Строка 50: | Строка 53: | ||
\end{vmatrix} | \end{vmatrix} | ||
} | } | ||
− | </tex>. Подставим это решение в <tex> A''x_0 + B''y_0 + C'' </tex> и домножим на определитель | + | </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'' | + | <tex> |
− | A' & B' & C' \\ | + | = 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} = |
− | A'' & B'' & C'' \end{vmatrix} </tex> | + | </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} | ||
+ | = \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>, то этот предикат {{---}} всего лишь поворот, а проверка предиката {{---}} проверка очередной точки в [[Статические выпуклые оболочки: Джарвис, Грэхем, Эндрю, Чен, 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> | + | '''Важно 2:''' |
+ | * <tex>p^\star</tex> - точка в двойственном пространстве, <tex>p</tex> - линия в исходном, | ||
+ | * <tex>l^\star</tex> - прямая в двойственном пространстве, <tex>l</tex> - точка в исходном, | ||
+ | * Значок <tex>*</tex> означает, что элемент из двойственного пространства. | ||
+ | Рассмотрим множество точек(<tex>P^\star</tex>) в двойственном пространстве и рассмотрим верхнюю часть выпуклой оболочки, построенной на этих точках. Обозначим её за <tex>\mathcal{UH}</tex>(Upper hull). Далее мы будем работать только с прямыми(в исходном пространстве), у которых вектор нормали направлен вниз, т.е они образовывают верхнюю цепочку. | ||
+ | По свойству выпуклой оболочки, любое ребро из цепи <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>l^\star</tex> (сейчаc мы жили в двойственном пространстве). В обычном пространстве данный факт эквивалентен следующему: | |
+ | |||
+ | *Дуальное отображение точки <tex>p^\star</tex> в базовое пространство {{---}} прямая <tex>p</tex>, которая по ''первому свойству'' содержит точку <tex>l</tex>(в базовом пространстве прямая <tex>p^\star</tex> перешла в точку <tex>p</tex>). | ||
+ | *Так как прямая <tex>l^\star</tex> лежит выше всех точек, то теперь каждая прямая из <tex>P</tex> лежит выше точки <tex>l</tex> (по свойству 2). | ||
− | + | Итого: у нас есть точка <tex>l</tex> на прямой <tex>p</tex>, лежащая ниже всех остальных прямых из <tex>P</tex>. | |
− | |||
− | + | Посмотрим на планарный граф множества(рис.2) прямых. Из факта выше, мы можем понять, что <tex>p</tex> внесла ребро в самый нижний фейс(именно тот, который задаёт часть пересечения полуплоскостей). Обозначим цепочку данного фейса, как <tex>\mathcal{LE}</tex>. Математически данную цепочку мы можем описать, как минимум из всех линейных функция (заданные прямыми) в <tex>P</tex>. Так же <tex>X</tex> компонента узлов этой цепочки монотонно возрастает. | |
− | |||
− | |||
− | + | Вернемся к <tex>\mathcal{UH}</tex> и заметим, что при обходе цепи, координата <tex>X</tex> точек растет. Если же мы будет обходить цепочку из <tex>P</tex>, образующую пересечение полуплоскостей, мы заметим, что наклон прямых уменьшается. Учитывая этот факт, и то что наклон линии из <tex>\mathcal{LE}</tex> совпадет с <tex>X</tex> координатой точки (вспоминаем отображение и применяем производную), можно сделать вывод, что обход слева направо точек из цепи <tex>\mathcal{UH}</tex>, совпадает с обходом точек из <tex>\mathcal{LE}</tex> справа налево. | |
− | |||
− | + | (Обе линии монотоны, одна возрастает, другая убывает. Количество точек в массиве одинаковое, при это каждая точка из <tex>\mathcal{UH}</tex> внесла вклад в <tex>\mathcal{LE}</tex>) | |
− | + | Напоследок, cоседние точки <tex>p^\star</tex> и <tex>q^\star</tex> из <tex>P^\star</tex> образуют какое-то или принадлежат какому-то ребру <tex>\mathcal{UH}</tex> <tex>\Leftrightarrow</tex> все точки из <tex>P^\star</tex> лежат "ниже" линии, построенной на точках <tex>p^\star</tex> и <tex>q^\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>O(N)</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 | * 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 | ||
− | |||
− | |||
[[Категория: Вычислительная геометрия]] | [[Категория: Вычислительная геометрия]] |
Текущая версия на 19:05, 4 сентября 2022
Предикат трех прямых
Задача: есть конечное множество полуплоскостей, найти фигуру их пересечения или сообщить что оно пусто.
Для начала заметим, что если пересечение не пусто, то оно выпукло. (Доказательство — Пересечение выпуклых фигур выпукло, а полуплоскость выпукла)
Пусть полуплоскости заданы уравнениями прямых и ориентацией, с какой стороны от прямой лежит полуплоскость.
Сначала рассмотрим все полуплоскости, которые "смотрят", то есть ориентированны, вниз. Аналогично можно рассмотреть все полуплоскости, которые ориентированны вверх.
Лемма: |
Доказательство: |
Для проверки предиката нужно определить знак выражения , где — точка пересечения прямых и . Эта точка находится из уравнения . Решением будет . Подставим это решение в и домножим на определитель.
|
Таким образом, если представить прямую обходе Грэхема для нахождения выпуклой оболочки.
как точку с однородными координатами , то этот предикат — всего лишь поворот, а проверка предиката — проверка очередной точки вАлгоритм:
- Отсортировать все полуплоскости по углу наклона;
- Запустить обход Грэхема для полуплоскостей, смотрящих вниз (с предикатом-определителем);
- Запустить обход Грэхема для полуплоскостей, смотрящих вверх;
- Пересечь две цепочки.
От пересечения цепочек напрямую зависит фигура пересечения: неограниченная область получается если одна из цепочек пуста, а ограниченная — когда обе цепочки не пусты и пересекаются.
Связь пересечения полуплоскостей с выпуклой оболочкой
Лемма: |
Пересечение полуплоскостей может быть получено построением выпуклой оболочки в двойственном прострастве для множества точек, являющихся дуальным преобразованием исходных полуплоскостей |
Доказательство: |
Важно: Покажем конструктивный алгоритм для множестве полуплоскостей, не содержащих вертикальный полуплоскости. После леммы приведены два рассуждения, позволяющие снять данное ограничение. Важно: В картинке перепутаны и . TODO
Пусть у нас есть множество ориентированных прямых, каждая из которых задает полуплоскость(направление вектора нормали задаёт нужную полуплоскость). Тогда каждую плоскость мы можем превратить в точку в двойственном пространстве: .Далее воспользуемся основными свойствами дуальной трансформации (см. доказательтсво в конспекте о двойственном прострастве):
Рассмотрим множество точек( ) в двойственном пространстве и рассмотрим верхнюю часть выпуклой оболочки, построенной на этих точках. Обозначим её за (Upper hull). Далее мы будем работать только с прямыми(в исходном пространстве), у которых вектор нормали направлен вниз, т.е они образовывают верхнюю цепочку. По свойству выпуклой оболочки, любое ребро из цепи содержит "ниже" себя все точки множества , а так же эта цепь соединяет самую правую точку с самой левой.Рассмотрим какую-то точку и заметим, что она будет принадлежать цепи прямая : и все точки из лежат ниже (сейчаc мы жили в двойственном пространстве). В обычном пространстве данный факт эквивалентен следующему:
Итого: у нас есть точка на прямой , лежащая ниже всех остальных прямых из .Посмотрим на планарный граф множества(рис.2) прямых. Из факта выше, мы можем понять, что внесла ребро в самый нижний фейс(именно тот, который задаёт часть пересечения полуплоскостей). Обозначим цепочку данного фейса, как . Математически данную цепочку мы можем описать, как минимум из всех линейных функция (заданные прямыми) в . Так же компонента узлов этой цепочки монотонно возрастает.Вернемся к и заметим, что при обходе цепи, координата точек растет. Если же мы будет обходить цепочку из , образующую пересечение полуплоскостей, мы заметим, что наклон прямых уменьшается. Учитывая этот факт, и то что наклон линии из совпадет с координатой точки (вспоминаем отображение и применяем производную), можно сделать вывод, что обход слева направо точек из цепи , совпадает с обходом точек из справа налево.(Обе линии монотоны, одна возрастает, другая убывает. Количество точек в массиве одинаковое, при это каждая точка из внесла вклад в )Напоследок, cоседние точки Таким образом мы построили верхнее пересечение полуплоскостей. Аналогичным образом строится нижнее, затем мы пересекаем полученные две цепочки. и из образуют какое-то или принадлежат какому-то ребру все точки из лежат "ниже" линии, построенной на точках и . В исходном пространстве это означает: все прямые из пространства за исключением прямых и лежат над пересечением и . Это достаточное условие, что пересечение и . |
Что же делать с вертикальными линиями?
- Найдем все вертикальным прямые за . Возьмем самую правую, у которой нормаль смотрит вправо, и самую левую, у которых нормаль смотрит влево. Построим верхнюю цепь и нижнюю цепь без всех вертикальных прямых, затем пересечем верхнюю цепь, нижнюю цепь, самую правую и самую левую вертикальную прямую.
- Перейдем в однородное двойственное пространство.
Источники
- 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