思路:直接容斥搞,然后就是两圆相交面积的模板题了
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=100010;
const int INF=0x3f3f3f3f;
int cas=1,T;
#define PI acos(-1.0)
double area(double x1, double y1, double r1, double x2, double y2, double r2)
{
double d=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
if(d>=(r1+r2)*(r1+r2)) return 0;
if(d<=(r1-r2)*(r1-r2)) return r1<r2 ? PI * r1 * r1 : PI * r2 *r2;
d=sqrt(d);
double a1=acos((r1*r1+d*d-r2*r2)/(2.0*r1*d));
double a2=acos((r2*r2+d*d-r1*r1)/(2.0*r2*d));
double s1=a1*r1*r1;
double s2=a2*r2*r2;
double t=(r1+r2+d)/2.0;
t=2.0*sqrt(t*(t-r1)*(t-r2)*(t-d));
return s1+s2-t;
}
int main()
{
//freopen("1.in","w",stdout);
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
scanf("%d",&T);
int ca=1;
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
while(T--)
{
int r, R, x1,y1,x2,y2;
scanf("%d%d", &r, &R);
scanf("%d%d", &x1, &y1);
scanf("%d%d", &x2, &y2);
double ans = area(x1,y1,R,x2,y2,R)-area(x1,y1,r,x2,y2,R)-area(x1,y1,R,x2,y2,r)+area(x1,y1,r,x2,y2,r);
printf("Case #%d: %.6lf\n", ca++, ans);
}
return 0;
}