已知两个圆的圆心半径,求两圆所覆盖的面积
注意这里两圆的位置有三大类别:
I 相离或外切
II 内切或包含
III 相交
但是相交需要两种算面积的方式
这里需要用到三角函数和反三角函数以及明确反三角函数的定义域等知识点
废话不多说(也没啥好多说的),上代码。代码已在DEV C++编译通过(gcc环境)
#include"iostream"
#include"math.h"
using namespace std;
int main(){
double x1,y1,r1,x2,y2,r2;
cin>>x1>>y1>>r1>>x2>>y2>>r2;//两圆的圆心和半径
double d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
double judge=r1+r2-d;
double area=0;
double PI=3.141592653589;
if(judge<0.0000001)
{
//相离或外切
area = r1*r1*PI+r2*r2*PI;
return area;
}
else if(r1-(r2+d)>-0.0000001||r2-(r1+d)>-0.0000001){
//内切或包含
if(r1>r2){
area=r1*r1*PI;
return area;
}
else{
area=r2*r2*PI;
return area;
}
}
else{
double cos1=(r1*r1+d*d-r2*r2)/(2.0*r1*d);
double cos2=(r2*r2+d*d-r1*r1)/(2.0*r2*d);
if(cos1>0&&cos2>0){
//相交情形1
double alfa1=2*acos(cos1);
double alfa2=2*acos(cos2);
double sin1=sin(alfa1);
double sin2=sin(alfa2);
double publicarea = (0.5*alfa2*r2*r2-0.5*r2*r2*sin2)+(0.5*alfa1*r1*r1-0.5*r1*r1*sin1);
area = r1*r1*PI+r2*r2*PI-publicarea;
cout<<area;
}
else{
//相交情形2
double sin1=sqrt(1-cos1*cos1);
double sin2=sqrt(1-cos2*cos2);
double alfa1=2*asin(sin1);
double alfa2=2*asin(sin2);
if(alfa1<alfa2){
area=r1*r1*PI+((0.5*alfa2*r2*r2-0.5*r2*r2*sin(alfa2))-(0.5*alfa1*r1*r1-0.5*r1*r1*sin(alfa1)));
cout<<area;
}
else{
area=r2*r2*PI+((0.5*alfa1*r1*r1-0.5*r1*r1*sin(alfa1))-(0.5*alfa2*r2*r2-0.5*r2*r2*sin(alfa2)));
cout<<area;
}
}
}
return 0;
}