Posts pythonTip 97 圆的面积
Post
Cancel

pythonTip 97 圆的面积

题目描述: 给你两个圆,每个圆由三个参数表示,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

  1. 相离: d > r1 + r2
  2. 外切: d = r1+ r2
  3. 内切: d = r2 - r1
  4. 相切: r2 - r1 < d < r1 + r2
  5. 包含: 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))))
This post is licensed under CC BY 4.0 by the author.
Trending Tags
Contents

pythonTip 96 Py的寻路系统

pythonTip 98 寻找临界楼层

Trending Tags