题意:求环的相交面积
思路:
通过画图可知,面积= 大圆相交面积 - 大小圆相交面积*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 ",cas++,ans); } return 0; }