题意:求环的相交面积
思路:
通过画图可知,面积= 大圆相交面积 - 大小圆相交面积*2 + 小小圆相交面积 再通过圆相交模板计算即可
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
#define PI 3.141592654
double dis(double x1,double y1,double x2,double y2)
{
double x = (x1-x2)*(x1-x2);
double y = (y1-y2)*(y1-y2);
return sqrt(x + y);
}
double overload(int x1,int y1,int r1,int x2,int y2,int r2) //r1^2 - x^2 = r2^2 - (len-x)^2
{
double len = dis(x1,y1,x2,y2);
if (r1+r2<len + 1e-10) return 0;
if (len<fabs(r1-r2+1e-10))
{
double r=min(r1,r2);
return PI*r*r;
}
double x=(len*len+r1*r1-r2*r2)/(2*len);
double t1=acos(x/r1);
double t2=acos((len-x)/r2);
return r1*r1*t1+r2*r2*t2-len*r1*sin(t1);
}
int main()
{
int T;
int cas = 1;
scanf("%d",&T);
while(T--)
{
double x1,x2,y1,y2;
double r,R;
scanf("%lf%lf",&r,&R);
scanf("%lf%lf",&x1,&y1);
scanf("%lf%lf",&x2,&y2);
double bb_area = overload(x1,y1,R,x2,y2,R);
double bs_area = overload(x1,y1,R,x2,y2,r);
double ss_area = overload(x1,y1,r,x2,y2,r);
double ans = bb_area - bs_area*2 + ss_area;
printf("Case #%d: %.6lf\n",cas++,ans);
}
return 0;
}