BNU4067:美丽的花环(求圆相交总面积)
BNU4067:美丽的花环(求圆相交面积) 学校的草坪上最近种植了一些漂亮的花卉,所有的花围成了一个环形(内径为
BNU4067:美丽的花环(求圆相交面积)
学校的草坪上最近种植了一些漂亮的花卉,所有的花围成了一个环形(内径为r,外径为R,0 <r < R) 。原来这片地上有一个用于喷灌的喷头。这个喷头可以为半径K以内的植物提供水。(如图)

现在,HK请你帮忙计算一下,花构成的环形当中有多大面积的可以由喷头提供灌溉。

Input #include<algorithm>#include<cstdio>#include<cstring>#include<cmath>using namespace std;#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 hf=(r1+r2+d)/2.0; double ss=sqrt(hf*(hf-r1)*(hf-r2)*(hf-d)); ss*=2; double a1=acos((r1*r1+d*d-r2*r2)/(2.0*r1*d)); a1=r1*r1*a1; double a2=acos((r2*r2+d*d-r1*r1)/(2.0*r2*d)); a2=r2*r2*a2; return a1+a2-ss;}int main(void){ double x1,x2,y1,y2,r1,r2,r3; while(~scanf("%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&r1,&r2,&x2,&y2,&r3)) printf("%.2f\n",area(x1,y1,r1,x2,y2,r3)-area(x1,y1,r2,x2,y2,r3)); return 0;}