首先是定义
一条直线和直线的一侧称为一个半平面。
半平面是一个点集,因此是一条直线和直线的一侧构成的点集。当包含直线时,称为闭半平面;当不包含直线时,称为开半平面。
一般来讲,都写成$ax+by+c\ge 0$.
是不是很眼熟,线性规划记得不,还有各种鬼畜应用题.用来求$(x,y)$的取值范围.
然后半平面交呢….就是把一堆半平面的交集求出来,就是半平面交了.
$\begin{cases}
a_1x+b_1y+c_1\ge 0\\
a_2x+b_2y+c_2\ge 0\\
…
\end{cases}$
昂,就这样子,画画图,就发现是个线性规划问题了…
哦,还有多边形的核
定义是:
如果一个点集中的点与多边形上任意一点的连线与多边形没有其他交点,那么这个点集被称为多边形的核。
然后求解也很简单,也是半平面交,以逆时针方向为正方向,将多边形每个边看成$ax+by+c\ge 0$,求一下交集,就是答案.
如何求解
两种方法,一种分治,一种排序增量法,叫$S\&I$算法好像.
当然,工具人只学简单的2333.
- 我们以逆时针为正方向,半平面为向量方向的左手.
- 维护一个双端队列
- 加入一个直线,就判断$tail-1$和$tail$的交点在该直线的哪边.
- 在右面,说明$tail$的直线被新加入的直线覆盖了,于是$tail-=1$
- 在左面,不做处理
- 对于队首元素,进行同样操作.
- 放入队列中
- 全部遍历结束后,再分别将$\{tail-1,tail,head\}$以及$\{head+1,head,tail\}$这两种情况的三个直线分别判断.
1 | bool cmp(Line l1, Line l2) //半平面交的极角排序 |