求两圆相交面积

求两圆相交的面积

输入两圆的圆心和半径,输出两圆相交的面积。

输入

第一行为 x1,y1,r1 表示第一个圆的圆心坐标和半径。
第二行为 x2,y2,r2 表示第二个圆的圆心坐标和半径。

输出

一个数,表示两圆相交的面积。

(1) 思路

画个图就能看出来相交面积就是两个扇形面积减去四边形面积。

求出两圆心的距离,然后判断相离,包含,还是覆盖,然后覆盖的话

首先用余弦公式求出两扇形的圆心角度 $\cos A = (b^2+c^2-a^2)/2bc$,然后算出扇形面积。

然后使用海伦公式通过三角形,相减得到相交面积。

这里注意反三角函数返回的是弧度制。 1度=π/180≈0.01745弧度,1弧度=180/π≈57.3度。

(2) 代码

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
#include<iostream>
#include<cmath>
#define PI 3.1415926
using namespace std;
int x_1,y_1,r_1,x_2,y_2,r_2;
int main(){
while(cin >> x_1 >> y_1 >> r_1){
cin >> y_1 >> y_2 >> r_2;
double ans=0;
double dis = sqrt(pow(x_1-y_1,2)+pow(y_1-y_2,2));

if(dis >= r_1+r_2){
ans = 0;
}else if(dis <= abs(r_1-r_2)){
ans = PI*pow(min(r_1,r_2),2);
}else{
double p = (dis+r_1+r_2)/2;
double angle1 = 2*acos((r_1*r_1+dis*dis-r_2*r_2)/(2*r_1*dis));
double angle2 = 2*acos((r_2*r_2+dis*dis-r_1*r_1)/(2*r_2*dis));
double area1 = (angle1*r_1*r_1+angle2*r_2*r_2)/2;
double area2 = sqrt(p*(p-dis)*(p-r_1)*(p-r_2));

ans = area1-area2;
}
cout<<ans<<endl;
}
return 0;
}

0%