hdu acm 1798 求两圆相交的面积

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1798

1.首先对两圆的位置进行判断:
(1).相离或相切,area=0;
(2).包含,area的面积等于半径小的圆的面积;
(3).相交,求面积;

2.利用的一些数学公式:

余弦定理:cos@=(r1*r1+d*d-r2*r2)/(2*r1*d);

我的程序如下:

View Code
 1 #include<stdio.h>
 2 #include<math.h>
 3 #define PI acos(-1.0)
 4 int main()
 5 {
 6     double x1,y1,r1,x2,y2,r2,a1,a2,dis,area;
 7     while(scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&r1,&x2,&y2,&r2)!=EOF)
 8     {
 9         dis=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));//两圆心之间的距离
10         if(r1+r2<=dis) //相离或相切
11         {
12             printf("0.000\n");
13             continue;
14         }
15         if(fabs(r1-r2)>=dis)  //包含
16         {
17             printf("%.3lf\n",PI*(r1>r2?r2:r1)*(r1>r2?r2:r1));
18             continue;
19         }
20         //相交的情况
21         a1=(r1*r1+dis*dis-r2*r2)/(2*r1*dis);//余弦定理
22         a2=(r2*r2+dis*dis-r1*r1)/(2*r2*dis);
23         a1=2*acos(a1);
24         a2=2*acos(a2);
25         area=r1*r1*(a1-sin(a1))/2+ r2*r2 * (a2 - sin(a2))/2;
26         printf("%.3lf\n",area);
27     }
28     return 0;
29 }

欢迎更犀利的大牛将他的算法拿出来分享。

2012-07-18

posted on 2012-07-18 15:52  l流沙  阅读(343)  评论(0)    收藏  举报

导航