【算法设计】实验一:求解两圆相交的面积
程序员文章站
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内重叠部分:
- M所对扇面积sx=mrara;
- M所对三角形面积ss=sinmcosm ra*ra;
- 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;
}
上一篇: 对List的数据进行分组