基础概念
简单多边形 P 的核(kernel),K(p)定义如下:K(p)由多边形内部的点构成,这些点与多边形的任何顶点相连所构成的线段完全包含在 P 中。
一个重要的性质是现,K(p)作为半平面的交集,它或者为空或者为完全包含在P 内的有界凸集。
红色部分。
半平面,在数学定义下就是
ax + by + c >= 0
所控制的一个的半空间。半空间在不同维度下意义不同,如果是2维的话,其实此时ax + by + c >= 0 就是二维中一条直线的一侧。
此时如果你再看核,其实可以理解为线性规划时得到的一个可行域。
我们上面说到 如果是2维的话,其实此时ax + by + c >= 0 就是二维中一条直线的一侧。所以直线(也就是决定半平面的直线)切割多边形 ,让直线不断的去切割当前多边形,然后得到新的多边形。
不难想象,其实结果可能是一个多边形(一定是凸的)、一个线段、空、一个点等等。我们记录顶点的数据来进行描述。
综上,如果计算半平面的交集,可以使用一个
- 将直线们极角排序,角度相同的保留下需要的一个
- 用一个双端队列存储当前半平面交,每次通过判断队首与队尾第一个交点是否满足当前直线来更新
- 先用队尾判定队首交点是否合法,再用队首判断队尾交点是否合法
- 最后求出来的半平面交是一个凸多边形
同理如果计算多边形交,可以将每一个边对应到一个半平面,从而运行半平面交集进行计算。
Ref
https://blog.csdn.net/weixin_30345577/article/details/97505934
https://blog.csdn.net/accry/article/details/6070621