版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34898866/article/details/82556015
传送门:http://poj.org/problem?id=2546
此题是基础题,大致题意是给定圆心和半径,算两个圆的交叉面积。
经典做法,分三种情况,外离为0,内含为小圆面积,相交即为2个扇形面积 - 三角形面积。此时扇形面积是S = Θ*r*r/2.0
。
tip1:一般PI用此来计算 const double pi = acos(-1);
tip2:double类型的变量不要随意进行大小比较,一般是用差值和eps进行比较。
tip3:此处计算弧度时用的是余弦定理
,acos计算出来的结果是弧度。
tip3:尽量少用sqrt函数,减少精度损失。但是这道题在计算圆心间距离时不用sqrt反而会WA,期待有大佬解释。
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
const double pi = acos(-1);
const double eps = 1e-8;
//const double pi = 3.141592653;
int main()
{
double x1,y1, r1, x2, y2, r2;
while(~scanf("%lf%lf%lf%lf%lf%lf", &x1,&y1,&r1,&x2,&y2,&r2))
{
double d = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
double rz = r1+r2;
double rf = fabs(r1-r2);
if(d-rz>=eps) //外离
{
puts("0.000");
}
else if(d-rf<=eps) //内含
{
if(r1>r2) printf("%.3f\n", pi*r2*r2);
else printf("%.3f\n", pi*r1*r1);
}
else{
double ang1 = acos((r1*r1+d*d-r2*r2)/2./r1/d);
double ang2 = acos((r2*r2+d*d-r1*r1)/2./r2/d);
double tmp = ang1*r1*r1+ang2*r2*r2-sin(ang1)*d*r1;
printf("%.3f\n", tmp);
}
}
return 0;
}