Пересечение полуплоскостей, связь с выпуклыми оболочками — различия между версиями
Igorjan94 (обсуждение | вклад) м |
Igorjan94 (обсуждение | вклад) м |
||
Строка 6: | Строка 6: | ||
Для начала заметим, что если пересечение не пусто, то оно выпукло. (Доказательство {{---}} Пересечение выпуклых фигур выпукло, а полуплоскоть выпукла) | Для начала заметим, что если пересечение не пусто, то оно выпукло. (Доказательство {{---}} Пересечение выпуклых фигур выпукло, а полуплоскоть выпукла) | ||
− | Пусть у нас прямые заданы уравнениями вида <tex> Ax + By + C = 0 </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> Ax + By + C = 0 </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> |
− | <tex> | ||
\begin{vmatrix} | \begin{vmatrix} | ||
A & B & C \\ | A & B & C \\ | ||
Строка 15: | Строка 14: | ||
</tex>. | </tex>. | ||
− | Докажем это. Для проверки предиката нам надо определить знак <tex> A''x_0 + B''y_0 + C'' </tex>, где <tex> (x_0, y_0) </tex> {{---}} точка пересечения прямых <tex> l' </tex> и <tex> l </tex>. Эту точку можно найти из уравнения <tex> | + | Докажем это. Для проверки предиката нам надо определить знак выражения <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: | Строка 26: | ||
-C' | -C' | ||
\end{pmatrix} | \end{pmatrix} | ||
− | </tex>. | + | </tex>. Решением будет <tex> |
− | |||
− | <tex> | ||
\begin{pmatrix} | \begin{pmatrix} | ||
x_0\\ | x_0\\ | ||
Строка 50: | Строка 46: | ||
\end{vmatrix} | \end{vmatrix} | ||
} | } | ||
− | </tex>. Подставим | + | </tex>. Подставим его в <tex> A''x_0 + B''y_0 + C'' </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} = \begin{vmatrix} A & B & C \\ | <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} = \begin{vmatrix} A & B & C \\ | ||
Строка 56: | Строка 52: | ||
A'' & B'' & C'' \end{vmatrix} </tex> | A'' & B'' & C'' \end{vmatrix} </tex> | ||
− | Таким образом если представить прямую <tex> Ax + By + C = 0 </tex> как точку с координатами <tex> (A, B, C) </tex>, где <tex> C </tex> {{---}} однородная координата, то этот предикат {{---}} всего лишь поворот, а проверка предиката {{---}} обход Грэхема. | + | Таким образом если представить прямую <tex> Ax + By + C = 0 </tex> как точку с координатами <tex> (A, B, C) </tex>, где <tex> C </tex> {{---}} однородная координата, то этот предикат {{---}} всего лишь поворот, а проверка предиката {{---}} [[Статические выпуклые оболочки: Джарвис, Грэхем, Эндрю, Чен, QuickHull#Алгоритм Грэхема|обход Грэхема]] для нахождения выпуклой оболочки. |
Версия 19:31, 5 апреля 2014
Задача: есть конечное множество полуплоскотей, найти фигуру их пересечения или сообщить что оно пусто.
Для начала заметим, что если пересечение не пусто, то оно выпукло. (Доказательство — Пересечение выпуклых фигур выпукло, а полуплоскоть выпукла)
Пусть у нас прямые заданы уравнениями вида
. Тогда предикат(см. рисунок) проверки того, что прямая лежит над пересечением прямых и будет равен .Докажем это. Для проверки предиката нам надо определить знак выражения
, где — точка пересечения прямых и . Эту точку можно найти из уравнения . Решением будет . Подставим его в и домножим на определитель.
Таким образом если представить прямую обход Грэхема для нахождения выпуклой оболочки.
как точку с координатами , где — однородная координата, то этот предикат — всего лишь поворот, а проверка предиката —
Рассмотрим отображение между точками и прямыми, такое что:
Это отображение не рассматривает вертикальные прямые, поэтому их мы рассмотрим в конце отдельно.
Будем обозначать, что
,Факт дуализма:
- Точка лежит под/на/над прямой тогда и только тогда, когда лежит под/на/над прямой ;
Тогда точка
принадлежит тогда и только тогда, когда существует такая не вертикальная прямая , что лежит под .Перефразируем для dual-пространства:
- Существует точка на прямой лежит под любой прямой из .
Рассмортим верхний конвекс-халл точек
(англ. upper convex hull) и нижнюю огибающей прямых (англ. lower envelope). Точки в появляются в по увелечению х-координаты. Прямые в появляются в по уменьшению угла наклона. Так как угол наклона соответствует х-координате, то список точек слева-направо соответствует списку справа-налево ребер . Таким образом верхний конвекс-халл соответствует нижней огибающей прямых. Аналогично для нижнего СН и верхней огибающей.Более формально: точки
— ребро верхнего конвекс-халла тогда и только тогда, когда все остальные точки из лежат ниже прямой, проходящей через это ребро. В dual-пространстве получаем, что лежат над точкой пересечения и . Это как раз условие, что — вершина .Таким образом получаем алгоритм:
- Считаем . (полуплоскости, смотрящие вверх)
- Считаем . (полуплоскости, смотрящие вниз)
- Считаем . (вертикальные полуплоскости, смотрящие направо)
- Считаем . (вертикальные полуплоскости, смотрящие налево)
- Пускаем заметающую вертикальную прямую и получаем пересечение
Стоит уточнить, что каждое из этих множеств может быть пусто. Тогда мы не рассматриваем с ним объединение. Однако в результате мы можем получить пустое множество. Это главное отличние пересечения полуплоскостей и конвекс-халла.
Источники
- 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