公式 A大B大-A大B小-A小B大+A小B小
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1 | 1
#define lowbit(x) x&(-x)
template <class T>
inline bool rd(T &ret){
char c;int sgn;
if(c=getchar(),c==EOF) return 0;
while(c!='-' && (c<'0' || c>'9')) c=getchar();
sgn=(c=='-')?-1:1;
ret=(c=='-')?0:(c-'0');
while(c=getchar(),c>='0' && c<='9') ret=ret*10+(c-'0');
ret*=sgn;
return 1;
}
template <class T>
inline void pt(T x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9) pt(x/10);
putchar(x%10+'0');
}
using namespace std;
typedef long long LL;
const int N=10005;
long long inf=1e15;
const int MOD=1e9+7;
int T,n,m,k,x,y,z,l,tot;
int cas=1;
double PI=acos(-1);
struct Point{
double x,y;
Point(){}
Point(double _x,double _y){
x=_x;y=_y;
}
Point operator -(const Point&b){
return Point(x-b.x,y-b.y);
}
double operator *(const Point &b){
return x*b.x+y*b.y;
}
};
double dis(Point c1,Point c2){
return sqrt((c1-c2)*(c1-c2));
}
double calc(Point c1,double R,Point c2,double r){
double d=dis(c1,c2);
if(d>=r+R) return 0;
if(d<=R-r) return r*r*PI;
double ang1= acos( (R*R+d*d-r*r)/(2*R*d));
double ang2= acos( (r*r+d*d-R*R)/(2*r*d));
return ang1*R*R+ang2*r*r-d*R*sin(ang1);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("aaa","r",stdin);
#endif
int T;
scanf("%d",&T);
while(T--){
int r,R;
rd(r);rd(R);
Point c1,c2;
rd(c1.x);rd(c1.y);
rd(c2.x);rd(c2.y);
double ans=calc(c1,R,c2,R)-calc(c1,R,c2,r)-calc(c2,R,c1,r)+calc(c1,r,c2,r);
printf("Case #%d: %f\n",cas++,ans);
}
return 0;
}