公式 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; }