HDOJ题目地址:传送门
0 0 2 2 2 1
0.108
解题思路
高中知识,先判断两个圈的状态(相交,相切,相离)。如果相交,用余弦定理:cosA=(b*b+c*c-a*a)/2*b*b分别求出两个弧的角度,用两个圆弧面积之和剪掉两个三角形面积
#include<stdio.h> #include<math.h> #define PI acos(-1.0) int main() { double a1,b1,r1,a2,b2,r2,d; double A1,A2,s1,s2,s; while(scanf("%lf%lf%lf%lf%lf%lf",&a1,&b1,&r1,&a2,&b2,&r2)!=EOF) { d=sqrt((a2-a1)*(a2-a1)+(b2-b1)*(b2-b1)); if(d>=r1+r2) printf("0.000\n"); else if(d<=fabs(r1-r2)&&d>=0) { if(r1>r2) printf("%0.3lf\n",PI*r2*r2); else printf("%0.3lf\n",PI*r1*r1); } else { A1=2*acos((d*d+r1*r1-r2*r2)/(2*d*r1));//余弦定理 A2=2*acos((d*d+r2*r2-r1*r1)/(2*d*r2)); s1=0.5*r1*r1*sin(A1)+0.5*r2*r2*sin(A2);//三角形面积 s=a*b*sinC/2; s2=A1/2*r1*r1+A2/2*r2*r2;//圆弧面积 s=A*l*l/2; s=s2-s1; printf("%.03lf\n",s); } } }
参考博客:传送门