两圆求面积问题

15 篇文章 0 订阅

已知两个圆的圆心半径,求两圆所覆盖的面积

注意这里两圆的位置有三大类别:

I 相离或外切

II 内切或包含

III 相交

但是相交需要两种算面积的方式

这里需要用到三角函数和反三角函数以及明确反三角函数的定义域等知识点

废话不多说(也没啥好多说的),上代码。代码已在DEV C++编译通过(gcc环境)

 

#include"iostream"
#include"math.h" 
using namespace std;
int main(){
    double x1,y1,r1,x2,y2,r2;
    cin>>x1>>y1>>r1>>x2>>y2>>r2;//两圆的圆心和半径 
    double d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    double judge=r1+r2-d;
    double area=0;
    double PI=3.141592653589;
    if(judge<0.0000001)
    {
        //相离或外切 
        area = r1*r1*PI+r2*r2*PI;
        return area;
    }
    else if(r1-(r2+d)>-0.0000001||r2-(r1+d)>-0.0000001){
        //内切或包含 
        if(r1>r2){
            area=r1*r1*PI;
            return area;
        }
        else{
            area=r2*r2*PI;
            return area;
        }
    }
    else{
        double cos1=(r1*r1+d*d-r2*r2)/(2.0*r1*d);
        double cos2=(r2*r2+d*d-r1*r1)/(2.0*r2*d);
        if(cos1>0&&cos2>0){
            //相交情形1 
            double alfa1=2*acos(cos1);
            double alfa2=2*acos(cos2);
            double sin1=sin(alfa1);
            double sin2=sin(alfa2);
            double publicarea = (0.5*alfa2*r2*r2-0.5*r2*r2*sin2)+(0.5*alfa1*r1*r1-0.5*r1*r1*sin1);
            area = r1*r1*PI+r2*r2*PI-publicarea;
            cout<<area;
        }
        else{
            //相交情形2 
            double sin1=sqrt(1-cos1*cos1);
            double sin2=sqrt(1-cos2*cos2);
            double alfa1=2*asin(sin1);
            double alfa2=2*asin(sin2);
            if(alfa1<alfa2){
                area=r1*r1*PI+((0.5*alfa2*r2*r2-0.5*r2*r2*sin(alfa2))-(0.5*alfa1*r1*r1-0.5*r1*r1*sin(alfa1)));
                cout<<area;
            }
            else{
                area=r2*r2*PI+((0.5*alfa1*r1*r1-0.5*r1*r1*sin(alfa1))-(0.5*alfa2*r2*r2-0.5*r2*r2*sin(alfa2)));
                cout<<area;
            }
        }
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值