题解 CF600D Area of Two Circles' Intersection

发布时间 2023-10-07 16:34:43作者: zhicheng123

题意简述

给出两个圆的圆心和半径,求两个圆的面积交。

思路

首先通过两圆半径和圆心的距离判断两圆是相离,包含还是相交。相离面积交为 \(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);
}