简单多边形与圆相交求面积
简单多边形的有向面积
所谓简单多边形,就是指不相邻的边不相交,且每个顶点只跟2条边相邻。一般而言,除非题目要求判断是否为简单多边形,否则给出的数据肯定都是简单多边形。以下将简单多边形简称为多边形。多边形一般都是以点集的形式给出,顺时针或者逆时针。另外一个需要注意的概念就是多边形的凹凸性。一般而言,凸多边形的算法比凹多边形的算法要简单的多。所以设计算法时,必须注意题目条件。而有向面积是不区分凹凸性的算法之一。
计算三角形的面积和有向面积使用叉积即可,请参考计算几何的基础数据结构与算法,这种情况下很容易计算出凸多边形的面积,对一个N边形来说,就是
N
−
2
N-2
N−2个三角形的面积之和。而对凹多边形而言,如上图右边,
△
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作为基点来划分三角形,也不需要选择多边形内部的一点,而是平面上的任意点。
如上图,
△
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=(1−t)A+tB当 t t t取值 [ 0 , 1 ] [0,1] [0,1]时, P P P就是线段 A B AB AB上的点,当 t ≥ 1 t\ge1 t≥1时, t t t就是射线B(AB方向)上的点,当 t ≤ 0 t\le0 t≤0时,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<0且t2∈(0,1)的情况。相当于下图。
即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次即可。具体代码可以参考多边形与圆相交求面积题目。