基础概念

简单多边形 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

相关文章: