思路:直接容斥搞,然后就是两圆相交面积的模板题了
#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; }
Description
Input
Output
Sample Input
2 2 3 0 0 0 0 2 3 0 0 5 0
Sample Output
Case #1: 15.707963 Case #2: 2.250778