poj 2546 关于两圆面积求解

转自:https://blog.csdn.net/aaakkk_1996/article/details/81746858

两圆相交分如下集中情况:相离+外切 ,相交,包含+内切

 相交分两种,锐角和钝角相交,二者求解公式相同 【其实我自己都没理解钝角为啥同公式求解,欢迎帮我解答】

代码部分:


#include<iostream>
#include<vector>
#include<string>
#include<math.h>
#include <iomanip> 
# define M_PI 3.1415926535897932384626433832795

using  namespace std;
void r1r2swap(double& x1, double& y1, double& r1, double& x2, double& y2, double& r2) {
    if (r1 > r2) {
        swap(x1, x2);
        swap(y1, y2);
        swap(r1, r2);
    }
}
double area(double x1, double y1, double r1, double x2, double y2, double r2) {
    //求圆心距
   double c= sqrt((pow(x1 - x2, 2) + pow(y1 - y2, 2)));
   r1r2swap(x1, y1, r1, x2, y2, r2);//确保s1是小圆
   if (c >= r1 + r2)return 0;//外离+外切
   else if (c < r2 - r1) {//内含+内切
       return  M_PI * r1 * r1;
   }
   else {//相交 S1 小圆 S2 大圆
       double ang1 = acos((r1 * r1 + c * c - r2 * r2) / (2.0 * r1 * c));
       double ang2 = acos((r2 * r2 + c * c - r1 * r1) / (2.0 * r2 * c));
       return ang1 * r1 * r1 + ang2 * r2 * r2 - r1 * c * sin(ang1);  //两扇形和-四角形 
   }
}
int main(void) {
    double x1; double y1; double r1; double x2; double y2; double r2;
    cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
    cout.setf(ios::fixed);
    cout << fixed << setprecision(3) << area(x1, y1, r1, x2, y2, r2)<<endl;
    return 0;
}




 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值