简单多边形与圆相交求面积

简单多边形的有向面积

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

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

在这里插入图片描述
如上图所示,选择圆心 O O O作为基准点,则多边形与圆 O O O相交的有向面积,可以分解为圆 O O O与圆心 △ O P i P i + 1 \bigtriangleup{OP_iP_{i+1}} OPiPi+1的有向面积。所以,只需求解圆心三角形与圆相交的有向面积即可。

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

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

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

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

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值