欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-21 16:17:12
...

实验一:求两圆相交的面积,题目来自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;
}
相关标签: 算法设计