题目描述: 给你两个圆,每个圆由三个参数表示,x,y,r, 其中(x,y)表示圆心坐标,r表示半径。 现在给你这两个圆的参数,x1, y1, r1; x2,y2,r2, 请你求出这两个圆相交部分的面积,保留小数点后三位数。 如: x1=20.0,y1=30.0,r1=15.0,x2=40.0,y2=30.0,r2=30.0 则输出608.366。
示例: 输入: x1 = 20.0 y1 = 30.0 r1 = 15.0 x2 = 40.0 y2 = 30.0 r2 = 30.0 输出: 608.366
分析:
这是一个数学问题。感觉学好数学对于编程还是有很大的帮助的。
两个 圆 之间的位置关系有这么几种。假设 两圆心距离为 d, 圆半径为 r1 和 r2, 其中 r1 < r2
- 相离: d > r1 + r2
- 外切: d = r1+ r2
- 内切: d = r2 - r1
- 相切: r2 - r1 < d < r1 + r2
- 包含: d < r2 - r1
其中
包含 和 内切 相交的面积都是小圆的面积。
外切 和 相离 相交面积都为 0。
相切的面积就是考验数学本领的时候了,具体公式见代码。只能说还有点点小小的难求。不过这个时候,我们可以忽略掉计算量,毕竟是计算机计算。
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import math
d = math.sqrt((x1-x2)**2 + (y1-y2)**2)
if r1 > r2:
x1, y1, r1, x2, y2, r2 = x2, y2, r2, x1, y1, r1
def main(d):
# 相离和外切
if d >= r1 + r2:
return 0
# 内切 和 包含
if d + r1 <= r2:
return r1*r1*math.pi
# 相切的数学公式
cosa = (r1*r1 + d*d - r2*r2) / (2*r1*d)
cosb = (r2*r2 + d*d - r1*r1) / (2*r2*d)
a = math.acos(cosa)
b = math.acos(cosb)
s1 = a * r1 * r1
s2 = b * r2 * r2
tri = r1*d*math.sin(a)
ans = s1 + s2 - tri
return ans
print("{:.3f}".format((main(d))))