题解 CF600D Area of Two Circles' Intersection

· · 题解

题意简述

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

思路

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