两圆圆心距离计算及位置关系判断(C++实现)

  • 实验目的

学习友元函数的定义与调用,理解友元函数的意义。

  • 实验原理

  1. 友元函数时在类中用关键字 friend修饰的函数,是类的非成员函数,但是它可以通过对象名访问类的私有和保护成员
  2. 利用圆心距与两圆半径之间的关系来判断两圆的位置关系。假设 d c dc dc为圆心距, R R R r r r分别是两圆的半径,则:
    (1) d c > R + r dc > R + r dc>R+r,两圆外离;
    (2) d c = R + r dc = R + r dc=R+r,两圆外切;
    (3) ∣ R – r ∣ < d c < R + r |R – r| < dc < R + r Rr<dc<R+r,两圆相交;
    (4) d c = ∣ R – r ∣ dc = |R – r| dc=Rr,两圆内切;
    (5) 0 < = d c < ∣ R – r ∣ 0 <= dc < |R – r| 0<=dc<Rr,两圆内含。
  • 实验内容

题目:定义一个表示圆的类 C i r c l e Circle Circle,包含 x , y , r x,y,r x,y,r三个私有变量,分别为圆心 x x x坐标,圆心 y y y坐标和圆半径。声明 C i r c l e Circle Circle类的两个友元函数 d i s t a n c e distance distance r e l a t i o n relation relation,分别计算两圆圆心位置和判断两圆位置关系。
要求

  1. 两圆的参数 x , y , r x,y,r x,y,r从命令行读入;
  2. 程序具有健壮性;
  3. 测试五种位置关系。

注意:浮点数之间做比较考虑精度问题。

  • 实验结果(含源码)

#include <iostream>
#include <cmath>
using namespace std;

class Circle {
private:
	double x, y, r;
public:
	Circle() {
		double xx, yy, rr;
		cout << "Please enter the center coordinates (x,y) and the radius:" << endl;	//提示输入圆心坐标与半径
		cin >> xx >> yy >> rr;
		if (rr > 0) {		//检查圆半径值是否合理
			x = xx;
			y = yy;
			r = rr;
			cout << "center coordinates:" << "(" << x << "," << y << ") " << "radius:" << r <<"\n"<< endl;	//显示圆的坐标与半径
		}
		else {
			cout << "the radius is wrong " << endl;
		}
	}
	friend double distance(Circle &c1, Circle &c2);
	friend void relation(Circle &c1, Circle &c2);
};

/* distance函数:计算两圆圆心距离 */
double distance(Circle &c1, Circle &c2) {
	double dc;
	dc = sqrt((c1.x - c2.x)*(c1.x - c2.x )+(c1.y - c2.y)*(c1.y - c2.y));
	return dc;
}

/* relation函数:判断两圆位置关系 */
void relation(Circle &c1, Circle &c2) {
	if (distance(c1, c2) - (c1.r + c2.r)>0) {
		cout << "两圆外离" << endl;
	}
	else if (distance(c1, c2) == (c1.r + c2.r)) {
		cout << "两圆外切" << endl;
	}
	else if ((fabs(c1.r - c2.r) - distance(c1, c2)<0)  && (distance(c1, c2) - (c1.r + c2.r)<0)) {
		cout << "两圆相交" << endl;
	}
	else if (distance(c1, c2) == abs(c1.r - c2.r)) {
		cout << "两圆内切" << endl;
	}
	else {
		cout << "两圆内含" << endl;
	}
}

int main()
{
	Circle C1;	// 第一个圆
	Circle C2;	// 第二个园
	distance(C1, C2);	// 计算距离
	cout << "the distance of two circle is " << distance(C1, C2) << endl;
	relation(C1, C2);

	return 0;
}

依次输入两圆的坐标和半径
第一个圆圆心 ( 0.1 , 0.1 ) (0.1, 0.1) (0.1,0.1),半径 6 6 6
第二个圆圆心 ( 10 , 10 ) (10,10) (10,10),半径 1 1 1
代入公式计算,得圆心距离为 14.0007 14.0007 14.0007,大于两圆半径之和,所以外离
测试数据1
同理,以下是另外4组测试数据
测试数据2
测试数据3
测试数据4
测试数据5

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值