hdu 5120 Intersection

http://acm.hdu.edu.cn/showproblem.php?pid=5120

题意:求两个圆环的相交面积。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 int t;
 8 double r,R;
 9 struct point
10 {
11     double x,y;
12     double r;
13 };
14 
15 double circle_area(point a,point b)
16 {
17     double s,d,t,t1;
18     d=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
19     if(d>=a.r+b.r) s=0;
20     else if(d<=fabs(a.r-b.r)) s=min(acos(-1.0)*a.r*a.r,acos(-1.0)*b.r*b.r);
21     else
22     {
23         t=(a.r*a.r+d*d-b.r*b.r)/2.0/d;
24         t1=sqrt(a.r*a.r-t*t);
25         s=-d*t1+a.r*a.r*acos(t/a.r)+b.r*b.r*acos((d-t)/b.r);
26     }
27     return s;
28 }
29 
30 int main()
31 {
32     scanf("%d",&t);
33     for(int cas=1; cas<=t; cas++)
34     {
35         scanf("%lf%lf",&r,&R);
36         point st1,st2,st3,st4;
37         double x,y;
38         scanf("%lf%lf",&x,&y);
39         st1.x=st2.x=x;
40         st1.y=st2.y=y;
41         st1.r=r;
42         st2.r=R;
43         scanf("%lf%lf",&x,&y);
44         st3.x=st4.x=x;
45         st3.y=st4.y=y;
46         st3.r=r;
47         st4.r=R;
48         double ans=0;
49         ans+=circle_area(st2,st4);
50         ans-=circle_area(st1,st4);
51         ans-=circle_area(st2,st3);
52         ans+=circle_area(st1,st3);
53         printf("Case #%d: %.6lf
",cas,ans);
54     }
55     return 0;
56 }
View Code
原文地址:https://www.cnblogs.com/fanminghui/p/4233616.html