⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 car.cpp

📁 一个完整的交叉口仿真模型 实现生成交叉口 和车辆生成 运行 跟驰等
💻 CPP
字号:
// Car.cpp: implementation of the CCar class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "CrossSimulation1.h"
#include "Car.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCar::CCar()
{
	m_CarWidth=1.8;
	m_CarLenth=4.0;
	m_speed=60/3.6/100;  
	b_TurnLeft=FALSE;
	b_TurnRight=FALSE;
	angle=0;

}

CCar::~CCar()
{

}
void CCar::move()  //车辆行驶方向;1为向西;2为向东;3为向北;4为向南;

{
	if(direction==1)   //向西行驶;
	{
	   x=x-m_speed;	
	   changetopoint();
	}
	if(direction==2)   //向东行驶;
	{
		x=x+m_speed;
		changetopoint();
	}
	if(direction==3)   //向北行驶;
	{
		y=y+m_speed;

	p1.x=x+m_CarWidth/2;
	p1.y=y+m_CarLenth/2;
	p2.x=x+m_CarWidth/2;
	p2.y=y-m_CarLenth/2;
	p3.x=x-m_CarWidth/2;
	p3.y=y-m_CarLenth/2;
	p4.x=x-m_CarWidth/2;
	p4.y=y+m_CarLenth/2;

	}
	if(direction==4)   //向南行驶;
	{
		y=y-m_speed;

	p1.x=x-m_CarWidth/2;
	p1.y=y-m_CarLenth/2;
	p2.x=x-m_CarWidth/2;
	p2.y=y+m_CarLenth/2;
	p3.x=x+m_CarWidth/2;
	p3.y=y+m_CarLenth/2;
	p4.x=x+m_CarWidth/2;
	p4.y=y-m_CarLenth/2;

	}






}
void CCar::changetopoint()
{

    p1.x=x-m_CarLenth/2;
	p1.y=y+m_CarWidth/2;
	p2.x=x+m_CarLenth/2;
	p2.y=y+m_CarWidth/2;
	p3.x=x+m_CarLenth/2;
	p3.y=y-m_CarWidth/2;
	p4.x=x-m_CarLenth/2;
	p4.y=y-m_CarWidth/2;

}

void CCar::gostrait()
{
	if(m_RoadID==1)
	{
		m_RoadID=2;
	}
	if(m_RoadID==2)
	{
		m_RoadID==1;
	}
	if(m_RoadID==3)
	{
		m_RoadID=4;
	}
	if(m_RoadID==4)
	{
		m_RoadID=3;
	}

	if(direction==1)   //向西行驶;
	{
		x=x-m_speed;	
	}
	if(direction==2)   //向东行驶;
	{
		x=x+m_speed;
	}
	if(direction==3)   //向北行驶;
	{
		y=y+m_speed;
	}
	if(direction==4)   //向南行驶;
	{
		y=y-m_speed;
	}


}

void CCar::turnleft(float x,float y,float r,float l)
{
	point t1,t4;
    t1.x=x;
	t1.y=y;
	if(m_RoadID==1)
	{
	  t4.x=x;
	  t4.y=y-m_CarWidth;
	   p4.x=t4.x-r*sin(angle);
	p4.y=t4.y-r*(1-cos(angle));

	p1.x=t1.x-(r+m_CarWidth)*sin(angle);
	p1.y=t1.y-(r+m_CarWidth)*(1-cos(angle));
     
     /////懒惰的发现,把负号改为正号
	p2.x=m_CarLenth*(p1.y-p4.y)/sqrt((p1.y-p4.y)*(p1.y-p4.y)+(p1.x-p4.x)*(p1.x-p4.x))+p1.x;
	p2.y=(p1.x-p4.x)*(p1.x-p2.x)/(p1.y-p4.y)+p1.y;

	p3.x=m_CarLenth*(p1.y-p4.y)/sqrt((p1.y-p4.y)*(p1.y-p4.y)+(p1.x-p4.x)*(p1.x-p4.x))+p4.x;
	p3.y=(p1.x-p4.x)*(p4.x-p3.x)/(p1.y-p4.y)+p4.y;

	angle+=m_speed/r;

	if(angle>=l)
	{
		b_TurnLeft=FALSE;
		m_RoadID=3;
		direction=4;
		this->x=(p4.x-p1.x)/2+p1.x;
		this->y=(p2.y-p1.y)/2+p1.y;
	}

	}

	if(m_RoadID==2)
	{
		t4.x=x;
		t4.y=y+m_CarWidth;

		p4.x=t4.x+r*sin(angle);
		p4.y=t4.y+r*(1-cos(angle));
		
		p1.x=t1.x+(r+m_CarWidth)*sin(angle);
		p1.y=t1.y+(r+m_CarWidth)*(1-cos(angle));
		
		/////懒惰的发现,把负号改为正号
		p2.x=m_CarLenth*(p1.y-p4.y)/sqrt((p1.y-p4.y)*(p1.y-p4.y)+(p1.x-p4.x)*(p1.x-p4.x))+p1.x;
		p2.y=(p1.x-p4.x)*(p1.x-p2.x)/(p1.y-p4.y)+p1.y;
		
		p3.x=m_CarLenth*(p1.y-p4.y)/sqrt((p1.y-p4.y)*(p1.y-p4.y)+(p1.x-p4.x)*(p1.x-p4.x))+p4.x;
		p3.y=(p1.x-p4.x)*(p4.x-p3.x)/(p1.y-p4.y)+p4.y;
		
		angle+=m_speed/r;
		
		if(angle>=l)
		{
			b_TurnLeft=FALSE;
			m_RoadID=4;
			direction=3;
			this->x=(p1.x-p4.x)/2+p4.x;
			this->y=(p1.y-p2.y)/2+p2.y;
		}
		
	}

   


    
   
}

void CCar::turnright(float x,float y,float r,float l)   //车辆所在的路段编号;1为东,2为西向路段,3为南,4为北向路段
                   //车辆行驶方向;1为向西;2为向东;3为向北;4为向南;

{
	//改变方向;

    point t1,t4;
	
	t1.x=x;
	t1.y=y;
	if(m_RoadID==1&&direction==1)     ///为东向车流;
	{
		t4.x=x;
		t4.y=y-m_CarWidth;
		
		p1.x=t1.x-r*sin(angle);
		p1.y=t1.y+r*(1-cos(angle));
		
		p4.x=t4.x-(r+m_CarWidth)*sin(angle);
		p4.y=t4.y+(r+m_CarWidth)*(1-cos(angle));
		
		/////懒惰的发现,把负号改为正号
		p2.x=m_CarLenth*(p1.y-p4.y)/sqrt((p1.y-p4.y)*(p1.y-p4.y)+(p1.x-p4.x)*(p1.x-p4.x))+p1.x;
		p2.y=(p1.x-p4.x)*(p1.x-p2.x)/(p1.y-p4.y)+p1.y;
		
		p3.x=m_CarLenth*(p1.y-p4.y)/sqrt((p1.y-p4.y)*(p1.y-p4.y)+(p1.x-p4.x)*(p1.x-p4.x))+p4.x;
		p3.y=(p1.x-p4.x)*(p4.x-p3.x)/(p1.y-p4.y)+p4.y;
		
		angle+=m_speed/r;
		
		if(angle>=l)
		{
			b_TurnRight=FALSE;
			m_RoadID=4;
			direction=3;
			this->x=(p1.x-p4.x)/2+p4.x;
			this->y=(p1.y-p2.y)/2+p2.y;
		}
		
	}
	if(m_RoadID==2&&direction==2)  //为西向车流;
	{
	    t4.x=x;
		t4.y=y+m_CarWidth;
		
		p1.x=t1.x+r*sin(angle);
		p1.y=t1.y-r*(1-cos(angle));
		
		p4.x=t4.x+(r+m_CarWidth)*sin(angle);
		p4.y=t4.y-(r+m_CarWidth)*(1-cos(angle));
		
		/////懒惰的发现,把负号改为正号
		p2.x=m_CarLenth*(p1.y-p4.y)/sqrt((p1.y-p4.y)*(p1.y-p4.y)+(p1.x-p4.x)*(p1.x-p4.x))+p1.x;
		p2.y=(p1.x-p4.x)*(p1.x-p2.x)/(p1.y-p4.y)+p1.y;
		
		p3.x=m_CarLenth*(p1.y-p4.y)/sqrt((p1.y-p4.y)*(p1.y-p4.y)+(p1.x-p4.x)*(p1.x-p4.x))+p4.x;
		p3.y=(p1.x-p4.x)*(p4.x-p3.x)/(p1.y-p4.y)+p4.y;
		
		angle+=m_speed/r;
		
		if(angle>=l)
		{
			b_TurnRight=FALSE;
			m_RoadID=3;
			direction=4;
			this->x=(p4.x-p1.x)/2+p1.x;
			this->y=(p2.y-p1.y)/2+p1.y;
		}

	}

	if(m_RoadID==3&&direction==3)  //为南向车流;
	{
	    t4.x=x-m_CarWidth;
		t4.y=y;
		
		p1.x=t1.x+r*(1-cos(angle));
		p1.y=t1.y+r*sin(angle);
		
		p4.x=t4.x+(r+m_CarWidth)*(1-cos(angle));
		p4.y=t4.y+(r+m_CarWidth)*sin(angle);
		
		/////懒惰的发现,把负号改为正号
		p2.x=-m_CarLenth*(p1.y-p4.y)/sqrt((p1.y-p4.y)*(p1.y-p4.y)+(p1.x-p4.x)*(p1.x-p4.x))+p1.x;
		p2.y=(p1.x-p4.x)*(p1.x-p2.x)/(p1.y-p4.y)+p1.y;
		
		p3.x=-m_CarLenth*(p1.y-p4.y)/sqrt((p1.y-p4.y)*(p1.y-p4.y)+(p1.x-p4.x)*(p1.x-p4.x))+p4.x;
		p3.y=(p1.x-p4.x)*(p4.x-p3.x)/(p1.y-p4.y)+p4.y;
		
		angle+=m_speed/r;
		
		if(angle>=l)
		{
			b_TurnRight=FALSE;
			m_RoadID=1;
			direction=2;
			this->x=(p1.x-p2.x)/2+p2.x;
			this->y=(p4.y-p1.y)/2+p1.y;
		}

	}




   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -