HDU5120-Intersection-两个圆环相交面积
终究还是我太蠢了!!!!
原来这是两个同心圆的相交部分,(最中间是空的)我画的1和2部分加起来就是了。
无法理解字面意思。害
题意:计算两个一样的圆环相交的面积,给出r1小的圆的半径,r2是大的圆的半径,接下去给出两行x、y,代表两个圆环的圆心。
思路:
两个大的圆的相交部分-左边大圆和右边小圆的相交部分-左边小圆和右边大圆的相交部分+左右小圆的相交部分。
AC代码:
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<cmath> 5 #include<string.h> 6 7 using namespace std; 8 typedef long long ll; 9 #define inf 0x3f3f3f3f 10 #define PI acos(-1.0)//不是-1 11 #define eps 1e-9 12 13 struct node 14 { 15 int x,y; 16 }a,b; 17 18 double s(double r1,double r2) 19 { 20 double d=sqrt((a.x-b.x)*(a.x-b.x)*1.0+(a.y-b.y)*(a.y-b.y)*1.0); 21 if(r1+r2<d+eps) 22 return 0;//相离 23 if(d<fabs(r1-r2)+eps) 24 { 25 double minn=min(r1,r2); 26 return PI*minn*minn; 27 } 28 double t=(d*d+r1*r1-r2*r2)/(2*d); 29 double x=acos(t/r1),y=acos((d-t)/r2); 30 return r1*r1*x+r2*r2*y-d*r1*sin(x); 31 } 32 33 int main() 34 { 35 int T,cas=1; 36 scanf("%d",&T); 37 while(T--) 38 { 39 double r1,r2; 40 scanf("%lf %lf",&r1,&r2); 41 scanf("%d %d %d %d",&a.x,&a.y,&b.x,&b.y); 42 double ans=s(r2,r2)-s(r1,r2)-s(r2,r1)+s(r1,r1); 43 printf("Case #%d: %.6lf\n",cas++,ans); 44 } 45 return 0; 46 }