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

浙公网安备 33010602011771号