题意简述
给出两个圆的圆心和半径,求两个圆的面积交。
思路
首先通过两圆半径和圆心的距离判断两圆是相离,包含还是相交。相离面积交为 \(0\),包含答案即为较小的圆的面积。当包含时相当于求两个弓形的面积。(见下图)
由正弦定理有:
\[\begin{aligned}
S_{\text{弓}ACD}&=S_{\text{扇}ACD}-S_{\Delta ACD}\\
&=\pi r_1^2\times\dfrac{\angle CAD}{2\pi}-\dfrac{1}{2}r_1^2\sin\angle CAD\\
\end{aligned}
\]
其中:
\[\angle CAD=2\angle CAB
\]
由余弦定理:
\[\angle CAB=\arccos\left(\dfrac{r_1^2+dis^2-r_2^2}{2r_1\times dis}\right)
\]
\(S_{\text{弓}B CD}\) 同理。然后就完了。
Code
#include<bits/stdc++.h>
using namespace std;
const long double pi=3.14159265358979323846264338;
int main(){
long double a,b,c,d,r1,r2,dis,deg,ans;
scanf("%Lf%Lf%Lf%Lf%Lf%Lf",&a,&b,&r1,&c,&d,&r2);
dis=sqrt((a-c)*(a-c)+(b-d)*(b-d));
if(r1+r2<=dis){
printf("0");//相离
return 0;
}
if(fabs(r1-r2)>=dis){
printf("%.7Lf",min(r1,r2)*min(r1,r2)*pi);//包含
return 0;
}
deg=2*acos((r1*r1+dis*dis-r2*r2)/(2*r1*dis));//弓形
ans=r1*r1*(deg/2-sin(deg)/2);
deg=2*acos((r2*r2+dis*dis-r1*r1)/(2*r2*dis));
ans+=r2*r2*(deg/2-sin(deg)/2);
printf("%.7Lf",ans);
}