简单多边形的有向面积

所谓简单多边形,就是指不相邻的边不相交,且每个顶点只跟2条边相邻。一般而言,除非题目要求判断是否为简单多边形,否则给出的数据肯定都是简单多边形。以下将简单多边形简称为多边形。多边形一般都是以点集的形式给出,顺时针或者逆时针。另外一个需要注意的概念就是多边形的凹凸性。一般而言,凸多边形的算法比凹多边形的算法要简单的多。所以设计算法时,必须注意题目条件。而有向面积是不区分凹凸性的算法之一。
简单多边形与圆相交求面积
计算三角形的面积和有向面积使用叉积即可,请参考计算几何的基础数据结构与算法,这种情况下很容易计算出凸多边形的面积,对一个N边形来说,就是N-2个三角形的面积之和。而对凹多边形而言,如上图右边,三角形P0P1P2其实不在多边形内,如果直接加面积必然出错。但解决办法也很简单,使用有向面积!三角形P0P1P2的旋向与整个多边形的旋向其实是反的,而三角形P0P2P3则是正的,有向面积累加之后,很自然的多边形外部的面积就抵消了。最后的结果仍然是整个多边形的有向面积。更进一步的,实际上不需要旋转P0作为基点来划分三角形,也不需要选择多边形内部的一点,而是平面上的任意点。
简单多边形与圆相交求面积
如上图,三角形OP0P1既包含了多边形的内部部分,也包含了多边形的外部部分,但是三角形OP1P2旋向相反,就会抵消一部分,如此循环,最后外部部分必然全部抵消,只剩下多边形的内部部分。无论凹凸都一样。
总结一下,多边形的有向面积,其实就是选一个基准点(一般就是P0),然后对每条边(边与基准点构成一个三角形)算一个三角形的有向面积,累加即可。而圆与多边形相交求面积的处理思路是一样的。

简单多边形与圆相交的有向面积

简单多边形与圆相交求面积
如上图所示,选择圆心O作为基准点,则多边形与圆O相交的有向面积,可以分解为圆O与圆心三角形OPiPi+1OP_iP_{i+1}的有向面积。所以,只需求解圆心三角形与圆相交的有向面积即可。

圆心三角形与圆相交求面积

设圆心三角形的另外2个点分别为A和B,显然要考虑线段AB与圆O的相交情况。如果使用几何方法,需要判断A、B是否在圆内等几种情况。这里使用参数法来描述线段AB,将所有情况讨论都转化为对一元二次方程根的讨论,形式上比较统一。当然讨论情况的数量是一样多的。设P是线段AB上的一点,则P=(1t)A+tBP=(1-t)A+tB当t取值[0,1]时,P就是线段AB上的点,当t1t\ge1时,t就是射线B(AB方向)上的点,当t0t\le0时,t就是射线A(BA方向)上的点。所以控制t的取值,就能控制AB这一段线元到底是线段、射线还是直线。t的本质含义就是(注意与定比分点的区别)t=APABt=\frac{AP}{AB}又由于P是圆O上一点,所以满足圆方程,于是可以得到一个关于t的一元二次方程。t的解就对应直线AB与圆O的相交情况。设t1t_1是较小的解,t2t_2是较大的解,有如下情况:

  • 无解:说明直线AB与圆不相交,直接求扇形的有向面积即可。在这个过程中注意OA和OB的方向角的求法,其取值范围在±180°\plusmn180°之间,没有直接的反三角函数可以满足这个需求。需要自行处理一下。asinasinacosacos或者atan2atan2均可。另外要注意使用反正弦和反余弦时定义域的范围。
  • 1解:说明直线AB与圆相切,实际上与第一种情况相同。
  • 2解:此时需要考察解的范围,区间[0,1][0,1]将实数分成三段,一共有6种情况,一一讨论即可。这里仅讨论t1<0t2(0,1)t_1<0且t_2\in(0,1)的情况。相当于下图。
    简单多边形与圆相交求面积
    即A在圆内且B在圆外的情况,此时相交的有向面积就是一个三角形再加一个扇形的面积。考虑到t的含义,所以OAP\triangle{OAP}的面积就是OAB\triangle{OAB}的t倍,而POB\angle{POB}根据OPB\triangle{OPB}的面积配合反三角函数即可求出。这里的反三角函数直接用asinasin即可,因为保证不是钝角。这样扇形面积也可以求出。

简单多边形与圆相交的有向面积

求得圆心三角形与圆相交的面积后,不需要区分三角形还是多边形,直接按照N边形循环N次即可。具体代码可以参考多边形与圆相交求面积题目

相关文章: