【POJ】题目 2546:Circular Area

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
 } 

猜你喜欢

转载自blog.csdn.net/qq_34898866/article/details/82556015