模拟圆的碰撞

现在需要模拟圆的相互碰撞。

描述如下:在一个平面上,有n个圆,在做随机运动,一旦两个圆碰到一块,就同时消失,并且在消失的时候,会输出下列信息:圆的编号,位置是什么。这样的一个系统,直到所有的都消失,或者只剩下一个为止。

 

#include <iostream>
#include <cmath>
#include <time.h>
using namespace std;

const int Left=0;
const int Right=100;
const int Top=0;
const int Bottom=100;  //定义圆运动的平面

class circle{
 int iPosX;
 int iPosY;   //圆心的坐标
 double dRadius;   //圆的半径
 int iDirX;
 int iDirY;  //圆运动的方向
 int iSpeed;  //圆运动的速度
 int iCID;  //圆的生成编号
public: 
 static int iCirnum;  //记录现有几个圆存在
 circle(int,int,double);
 ~circle();
 int getPosX() { return iPosX; }
 int getPosY() { return iPosY; }  //获取圆的坐标
 double getRadius() { return dRadius; }  //获取圆的半径
 void Move(int speed);  //圆在平面内运动
 void OutputState();  //输出圆当前的状态
};

int circle::iCirnum=0;

circle::circle(int x,int y,double r)
{
 iPosX=x;
 iPosY=y;
 dRadius=r;
 iDirX=1;
 iDirY=1;
 iCID=++iCirnum;
 cout<<"我是"<<iCID<<"号圆,"<<"我在这里被生成,"<<"我的位置是("<<iPosX<<","<<iPosY<<"),我的半径为"<<dRadius<<"。"<<endl;
}

circle::~circle()
{
 iCirnum--;
 cout<<"我是"<<iCID<<"号圆,我在此被撞毁。我的位置是:("<<iPosX<<","<<iPosY<<")。"<<endl;
}

void circle::Move(int speed)
{
 iPosX+=iDirX*speed;
 if(iPosX<=Left||iPosX>=Right) 
 {
  iPosX-=iDirX*speed;
  iDirX*=-1;  //如果圆的坐标出了平面的范围,则向反方向运动
 }
 iPosY+=iDirY*speed;
 if(iPosY<=Top||iPosY>=Bottom)
 {
  iPosY-=iDirY*speed;
  iDirY*=-1;
 }
}

void circle::OutputState()
{
 cout<<"我是"<<this->iCID<<"号圆,我现在的位置是:("<<this->iPosX<<","<<this->iPosY<<")。"<<endl;
}

class Platform{
 bool *bLiveCir;  //记录圆是否存在,true表示存在,false表示已被销毁。
 circle **cir;
 int CheckHit(circle &,circle &);  //检测两个圆是否相撞
 void CreateCircle(int);  //生成一个圆
 void Delete(circle *);  //删除一个圆

 void LastLive();  //输出最后剩下的一个圆的信息
 int iCirnumber;  //一共生成的圆的个数
public:
 Platform(int);
 void Run();
};

Platform::Platform(int a)
{
 iCirnumber=a;
 cir=new (circle *[a]);
 bLiveCir=new bool[a];
 for(int i=0;i<a;i++)  //生成5个圆,并且将存在标识置为true.
 {
  CreateCircle(i);
  bLiveCir[i]=true;
 }
 system("pause");
 cout<<endl;
}

int Platform::CheckHit(circle &c1,circle &c2)
{
 double d=sqrt(pow((c1.getPosX()-c2.getPosX()),2)+pow((c1.getPosY()-c2.getPosY()),2));
 if(d<=c1.getRadius()+c2.getRadius())  //若两个圆的圆心之间的距离小于半径的和,则两圆相交
 {  
  return 1;
 } 
 return 0;
}

void Platform::CreateCircle(int i)
{
 int x=int(rand()/double(RAND_MAX)*(Right-Left)+Left);
 int y=int(rand()/double(RAND_MAX)*(Bottom-Top)+Top); //生成随机的初始坐标
 double r=rand()/double(RAND_MAX)*5; //生成随机的半径
 cir[i]=new circle(x,y,r);
}

void Platform::Delete(circle *c)
{
 delete c;
}

void Platform::Run()
{
 int i,j;
 while(circle::iCirnum>1)
 {
  for(i=0;i<iCirnumber;i++)
   if(bLiveCir[i])
   {
    int speed=int(rand()/double(RAND_MAX)*50);
    cir[i]->Move(speed);
   }
  for(i=0;i<iCirnumber-1;i++)
   for(j=i+1;j<iCirnumber;j++)
    if(bLiveCir[i]&&bLiveCir[j])
     if(CheckHit(*cir[i],*cir[j])==1)
     {
      bLiveCir[i]=false;
      bLiveCir[j]=false;
      Delete(cir[i]);
      Delete(cir[j]);
      cout<<endl;
      system("pause");
      cout<<endl;
      break;
     }
 }

 if(circle::iCirnum==1)  //如果还有一个圆,则输出剩下一个圆的信息。
  LastLive();
}

void Platform::LastLive()
{
 for(int i=0;i<iCirnumber;i++)
 {
  if(bLiveCir[i])
  {
   cout<<endl<<"现在还剩下一个圆:"<<endl;
   cir[i]->OutputState();
  }

 }
}

int main()
{
 srand((unsigned)time(NULL));
 int a;
 cout<<"请输入圆的个数:";
 cin>>a;
 Platform p(a);
 p.Run();
 cout<<endl;
 return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值