【算法设计】实验一:求解两圆相交的面积

实验一:求两圆相交的面积,题目来自POJ,题号2546

问题

In the single line of input file there are space-separated real numbers x1 y1 r1 x2 y2 r2. They represent center coordinates and radii of two circles.

算法的文字描述

Step1:输入两个圆的参数 x1、 y1、 r1、 x2、 y2、 r2。
Step2:计算 a,b的距离d。
若d>=(ra+rb),则 s=0;否则,进入 Step3
Step3:较大的圆为圆A的圆心(xa,yb),半径 ra;
较小的圆B的圆心( xc,yd 半径 rb。
若d<=(ra-rb) 则输出 s=PI* rb * rb
否则,若ra-rb<d<ra+rb则进入 Step4
Step4:利用 ra、 rb、d计算圆A对弦的圆心角的一半m;
利用ra、 rb、 d计算圆B对弦的圆心角的一半n。
Step5:计算圆B内重叠部分:

  1. M所对扇面积sx=mrara;
  2. M所对三角形面积ss=sinmcosm ra*ra;
  3. s1=sx-ss;
    同理,计算圆A内重叠部分s2。
    s=s1+s2。

Step6: 输出s返回 。

程序设计

#include<iostream>
#include<cmath>
#include <iomanip>
using namespace std;
#define PI 2*asin(1.0)
void setsize(double& a, double& b, double& c, double& d, double& r1, double& r2)
{ 
 if (r1 < r2) { 
  double t = 0;
  t = r1;
  r1 = r2;
  r2 = t;
  t = a;
  a = c;
  c = t;
  t = b;
  b = d;
  d = t;
 }
 else return;
}
double fun(double x, double r) { 
 double sx = 0, ss = 0;
 sx = x * r * r;
 ss = r * r * cos(x) * sin(x);
 return sx - ss;
}
int main() { 
 double a = 0, b = 0, r1 = 0, c = 0, d = 0, r2 = 0;
 cin >> a >> b >> r1 >> c >> d >> r2;
 double dis = 0, s = 0;
 dis=sqrt((a - c) * (a - c) + (b - d) * (b - d));
 if (dis >= r1 + r2) { 
  s = 0;
 }
 else { 
        setsize(a,b,c,d,r1,r2);
  if (dis <= r1 - r2) { 
   s = PI * r2 * r2;
  }
  else { 
   double m = 0, n = 0, s1 = 0, s2 = 0;
   m = acos((dis * dis + r1 * r1 - r2 * r2) / (2 * dis * r1));
   n = acos((dis * dis + r2 * r2 - r1 * r1) / (2 * dis * r2));
   s1 = fun(m,r1);
   s2 = fun(n,r2);
   s = s1 + s2; 
  }
 }
 cout << setiosflags(ios::fixed)<<setprecision(3) << s << endl;
 return 0;
}
    原文作者:蝉鸣的夏天
    原文地址: https://blog.csdn.net/yukiaustin/article/details/108674393
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞