传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5120
题意:求两圆环的相交面积,注意是圆环,运用求两圆相交的模板,推出公式 圆环面积交=大圆大圆面积交-2×大圆小圆面积交+小圆小圆面积交。
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #define exp 1e-10 #define PI acos(-1.0) using namespace std; typedef long long ll; struct Point//圆心的X和Y值 { double x,y; Point (double x=0,double y=0):x(x),y(y){} }; double dist(Point a,Point b)//圆心距 { double x=(a.x-b.x)*(a.x-b.x); double y=(a.y-b.y)*(a.y-b.y); return sqrt(x+y); } double area(Point c1,double r1,Point c2,double r2) { double d=dist(c1,c2); if (r1+r2<d+exp) return 0;//相离 if (d<fabs(r1-r2)+exp)//内含 { double r=min(r1,r2); return PI*r*r; } double x=(d*d+r1*r1-r2*r2)/(2*d); double t1=acos(x/r1); double t2=acos((d-x)/r2); return r1*r1*t1+r2*r2*t2-d*r1*sin(t1);//相交 } int main()//hdu5120 求圆环的相交部分 { int T,ca=1; double r,R;//小圆半径,大圆半径 Point a,b; scanf("%d",&T); while(T--) { scanf("%lf%lf",&r,&R); scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y); double bb=area(a,R,b,R); double bs=area(a,R,b,r); double ss=area(a,r,b,r); printf("Case #%d: %.6lf\n",ca++,bb-2.0*bs+ss); } return 0; }