类的基本操作,运算符重载,友元函数(C++)

在 E10 的圆形类的基础上(是否需要增减属性和方法可自行决定),完成如下功能:
a) 定义两个圆对象,确定它们的位置关系为相离。
b) 令两圆沿圆心连线作相向运动。两圆运动速度之比为面积之比的反比。设速度较慢的圆的运动速度为 1,即每走一步的距离为 1。
c) 两圆运动的同时不断地缩小面积。每走一步,半径缩小 1。
d) 用程序模拟上述过程(用循环来实现,每循环一次代表走一步),找出两圆的碰撞位置(即两圆的圆心距离小于等于两圆半径之和,两圆的圆心坐标和半径)。
e) 每走一步,输出两圆的位置、半径和距离(距离是指两圆相距最近的两个点之间的距离)。
f) 提示 1:考虑一下,两圆是否一定会碰撞?
g) 提示 2:在不影响被模拟问题本身性质的前提下,是否有办法简化计算?
 

/*=======================================================================
作业:E11
时间:4.25
作者:
要求:在E10的圆形类的基础上(是否需要增减属性和方法可自行决定),完成如下功能:
a) 定义两个圆对象,确定它们的位置关系为相离。
b) 令两圆沿圆心连线作相向运动。两圆运动速度之比为面积之比的反比。设速度
较慢的圆的运动速度为1,即每走一步的距离为1。
c) 两圆运动的同时不断地缩小面积。每走一步,半径缩小1。
d) 用程序模拟上述过程(用循环来实现,每循环一次代表走一步),找出两圆的碰
撞位置(即两圆的圆心距离小于等于两圆半径之和,两圆的圆心坐标和半径)。
e) 每走一步,输出两圆的位置、半径和距离(距离是指两圆相距最近的两个点之
间的距离)
======================================================================*/

#include<iostream>
#include<math.h>
#define Pi 3.14159f

using namespace std;

class Circle
{
private:
	float x,y;//圆心坐标
	float r;//圆半径
	float v;//圆的移动速度
public:
	float cal_s()const;//计算圆面积

	void set(float ix,float iy){x=ix,y=iy;}//设置圆心位置
	void setr(float ir){r=ir;}//设置半径
	void setv(float iv){v=iv;}//确定圆速度

	friend void rate(Circle &a,Circle &b);//用于确定圆的移动速度

	friend bool operator&(const Circle& A,const Circle& B);//判断两圆的位置是否是相离

	friend void move(Circle &a,Circle &b);//移动圆的友元函数
};

//圆面积
float Circle::cal_s()const
{
	float R=this->r;
	return R*R*Pi;
}

void rate(Circle &a,Circle &b)//确定两圆的移动速度
{
	if(a.r>b.r)
	{
		b.setv(1);
		a.setv(b.r*b.r/(a.r*a.r));
	}
	else
	{
		a.setv(1);
		b.setv(a.r*a.r/(b.r*b.r));
	}
}

void move(Circle &a,Circle &b)//移动并判断两圆是否相离
{
	if(a.x>b.x)
	{
			while(a.r>0&b.r>0)
			{
				b.x+=b.v;
				b.y+=b.v;
				--b.r;
				a.x-=a.v;
				a.y-=a.v;
				--a.r;
				float d=abs(sqrt((a.x-a.x)*(a.x-a.x)-(a.y-a.y)*(a.y-a.y))-a.r-b.r);
				if(a&b)
				{
					cout<<"圆一圆心坐标为:"<<a.x<<" "<<a.y<<" "<<"圆半径为;"<<a.r<<endl
						<<"圆二圆心坐标为:"<<b.x<<" "<<b.y<<" "<<"圆半径为;"<<b.r<<endl
						<<"两圆之间的距离为:"<<d<<endl;
				}
				else
				{
					cout<<"两圆碰撞时圆一圆心坐标为:"<<a.x<<" "<<a.y<<" "<<"圆半径为;"<<a.r<<endl
						<<"两圆碰撞时圆二圆心坐标为:"<<b.x<<" "<<b.y<<" "<<"圆半径为;"<<b.r<<endl;
				}
			}
	}
	else
	{
		while(a.r>0&&b.r>0)
		{
			a.x+=a.v;
			a.y+=a.v;
			--a.r;
			b.x+=b.v;
			b.y+=b.v;
			--b.r;
			float d=abs(sqrt((a.x-a.x)*(a.x-a.x)-(a.y-a.y)*(a.y-a.y))-a.r-b.r);
			if(a&b)
			{
				cout<<"圆一圆心坐标为:"<<a.x<<" "<<a.y<<" "<<"圆半径为;"<<a.r<<endl
						<<"圆二圆心坐标为:"<<b.x<<" "<<b.y<<" "<<"圆半径为;"<<b.r<<endl
						<<"两圆之间的距离为:"<<d<<endl;
			}
			else
			{
				cout<<"两圆碰撞时圆一圆心坐标为:"<<a.x<<" "<<a.y<<" "<<"圆半径为;"<<a.r<<endl
						<<"两圆碰撞时圆二圆心坐标为:"<<b.x<<" "<<b.y<<" "<<"圆半径为;"<<b.r<<endl;
			}
		}
	}
	if(a&b)//若两圆半径减为0时还是相离,则两圆不能碰撞
	{
		cout<<"两圆不能碰撞"<<endl;
	}
}

//判断两圆是否相离
bool operator&(const Circle& A,const Circle& B)//判断两圆是否相离
{
	float d1=sqrt((A.x-B.x)*(A.x-B.x)-(A.y-B.y)*(A.y-B.y));
	float d2=fabs(A.r-B.r);
	if(d1>d2)//若相离,则返回true,否则返回false
	{
		return true;
	}
	else
	{
		return false;
	}
}

//测试主函数
int main()
{
	float ix1,iy1,ir1,ix2,iy2,ir2;
	Circle A,B;
	cout<<"请输入第一个圆的圆心和半径(半径大于1):"<<endl;
	//圆一赋值
	cin>>ix1>>iy1>>ir1;
	A.set(ix1,iy1);
	A.setr(ir1);
	//圆二赋值
	cout<<"请输入第二个圆的圆心和半径(半径大于1):"<<endl;
	cin>>ix2>>iy2>>ir2;
	B.set(ix2,iy2);
	B.setr(ir2);
	//保证开始时两圆相离,若不相离,报错
	if(A&B)
	{
		cout<<"两圆相离"<<endl;
	}
	else
	{
		cout<<"两圆不相离"<<endl;
	}
	if(A&B)
	{
		rate(A,B);
		move(A,B);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ukco_well/article/details/86576447
今日推荐