当前位置: 代码迷 >> 综合 >> 【POJ】题目 2546:Circular Area
  详细解决方案

【POJ】题目 2546:Circular Area

热度:106   发布时间:2023-10-19 04:51:04.0

传送门: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;} 
  相关解决方案