您的当前位置:首页C++AGV路径规划与运行仿真程序

C++AGV路径规划与运行仿真程序

2021-01-06 来源:乌哈旅游
实用文案

程序代码

#include #include

#include #include #include #include #include

#define MAX 100 #define maxD 99999

class CFixedMap {

struct Coordinate {

int x; int y; int num;

};//记录点的结构体 struct combp {

int x1,y1; int x2,y2; };//连通点坐标

struct Combname {

int num1; int num2; };//连通点名

public:

int mVexNum; // 顶点数 int mEdgNum; // 边数

double mMatrix[MAX][MAX]; // 邻接矩阵 Combname comb[MAX]; //连通点名 combp cp[MAX]; //连通点坐标 Coordinate mVexs[MAX]; // 顶点集合 int getx(int n1); int gety(int n2);

void Input();//以文件方式输入地图信息

文案大全

实用文案

void ShowMap();//easyx显示地图 };

int CFixedMap::getx(int n1) {

int x=0;

for(int i=0;iint CFixedMap::gety(int n2) {

int y=0;

for(int i=0;ivoid CFixedMap::Input() {

int panju;

char fname[10]={\"map2.txt\

cout<<\"是否载入默认地图?(1:是,2:否)\"; cin>>panju; if(panju==2) {

cout<<\"请输入地图信息文件名:\"; cin>>fname; }

ifstream file(fname); char use1[100]; char use2[100]; char use3[100];

char use4[100]; //use数组用来储存提示信息。 file>>use1;

file>>mVexNum; //端点个数 file>>use2;

file>>mEdgNum; //边数 file>>use3;

for(int i=0;i文案大全

实用文案

file>>mVexs[i].num>>mVexs[i].x>>mVexs[i].y; }

file>>use4;

for(i=0;ifile>>comb[i].num1>>comb[i].num2; }

file.close(); }

//easyx显示地图

void CFixedMap::ShowMap() {

initgraph(800,600,SHOWCONSOLE| NOCLOSE); //初始化绘图环境 setbkcolor(WHITE); //设置背景色

cleardevice(); //用背景色清空屏幕 setfillcolor(BLACK); //设置填充色 //画顶点

for(int i=0;ifillcircle(mVexs[i].x,mVexs[i].y,5); settextcolor(BLACK); char s[MAX];

sprintf(s, \"%d\

outtextxy(mVexs[i].x-10,mVexs[i].y-20,s); }

//给实际连通的顶点连线 setlinecolor(RGB(0,0,0));

setlinestyle(PS_SOLID,6,NULL,0); for(i=0;icp[i].x1=getx(comb[i].num1); cp[i].y1=gety(comb[i].num1); cp[i].x2=getx(comb[i].num2); cp[i].y2=gety(comb[i].num2);

line(cp[i].x1,cp[i].y1,cp[i].x2,cp[i].y2); } }

class CPathPlan:public CFixedMap {

public:

int path[MAX]; //存放最后一个点

文案大全

实用文案

double dist[MAX]; //存放路径距离 int v0; //起始点 int route[40]; //路径

int rnum; //路径顶点数 Coordinate rpoints[MAX];//路径点集 void MaptoGraph(); void Dijstra(); void Putpath(); };

void CPathPlan::MaptoGraph() {

rnum=0;

int a,b,x,y;

for(int i=0;ifor(int j=0;jif(i==j) {

mMatrix[i][j]=0; } else {

mMatrix[i][j]=maxD; } } }

for(i=0;iif (comb[i].num1) {

a=comb[i].num1-1; b=comb[i].num2-1;

x=mVexs[a].x-mVexs[b].x; y=mVexs[a].y-mVexs[b].y; mMatrix[a][b]=sqrt(x*x+y*y); mMatrix[b][a]=sqrt(x*x+y*y); } } }

void CPathPlan::Dijstra() {

文案大全

实用文案

cout<<\"输入起点:\"; cin>>v0; v0--;

int s[MAX]; int v; int i; int j; int w;

double min;

for(v=0;vs[v]=0; //0表示未求出最短路径

dist[v]=mMatrix[v0][v]; //开始时假定为最短路径 if(dist[v]path[v]=v0; //直达情况 else path[v]=-1; //无直达路径 }

dist[v0]=0; //初始时v0属于s集,v0到v0路径最短 s[v0]=1;

for(i=1;imin=maxD;

for(w=0;wif(s[w]==0 && dist[w]v=w; //经点w中转 min=dist[w]; }

s[v]=1; //将v并入S,由v0到达v点最短距离为min,假设由v0到v再由v到其余各点,更新当前最后一个点及距离 for(j=0;jif(s[j]==0 && (min+mMatrix[v][j]dist[j]=min+mMatrix[v][j]; path[j]=v; //点的序号 } } }

void CPathPlan::Putpath() {

int opp[20];

文案大全

实用文案

int z; int i=0;

cout<<\"输入终点:\"; cin>>z; z--;

int next;

ofstream file2(\"fops.txt\");

if(dist[z]opp[i++]=mVexs[z].num; //终点

next=path[z]; //第一个点 while(next!=v0) {

opp[i++]=mVexs[next].num;

next=path[next]; //下一个点 }

opp[i]=mVexs[v0].num;

file2<<\"路径长度为:\"<else if(z!=v0) //无路径

file2<file2<\"; rnum=i+1;

file2<for(i=0;irpoints[i].x=getx(route[i]); rpoints[i].y=gety(route[i]); rpoints[i].num=route[i]; } }

class CAGV {

int speed; //AGV速度 int width; //AGV宽度 int length; //AGV长度 public:

文案大全

实用文案

CAGV(); int getl(); int getw(); int gets(); };

CAGV::CAGV() {

int panju;

cout<<\"是否自动设置AGV信息?(1:是,2:否)\"; cin>>panju; speed=8; width=6; length=6; if(panju==2) {

cout<<\"输入AGV的长:\"; cin>>length;

cout<<\"输入AGV的宽:\"; cin>>width;

cout<<\"输入AGV的速度(1-10):\"; cin>>speed; } }

int CAGV::getl() {

return length; }

int CAGV::getw() {

return width; }

int CAGV::gets() {

return speed; }

class CAGVShow:public CPathPlan,public CAGV {

public:

#define k (abs(y2-y1))/(abs(x1-x2)) int a,b,c,d; int x1,x2,y1,y2;

文案大全

实用文案

int i,j; int l,w,s;

void show(); };

void CAGVShow::show() {

l=getl(); w=getw(); s=11-gets();

for(int o=0;oif(o+1==rnum)break; x1=rpoints[o].x; x2=rpoints[o+1].x; y1=rpoints[o].y; y2=rpoints[o+1].y;

if(y1!=y2&&x1!=x2) {

if(x2>x1&&y2>y1){

for(j=1;ja=x1+j-l; b=y1+j*k+w; c=x1+j+l; d=y1+j*k-w;

setfillcolor(RGB(0,0,0)); rectangle(a,b,c,d);

clearrectangle(a-1,b-k,c,d-k); setlinecolor(RED);

line(x1+j,y1+j*k,x2,y2); setlinecolor(GREEN); line(x1,y1,x1+j,y1+j*k); if(j%2==0) {

setfillcolor(RGB(255,255,0)); circle(x2,y2,5); }

Sleep(s); } }

if(x2文案大全

实用文案

{

for(j=1;ja=x1-j-l; b=y1-j*k+w; c=x1-j+l; d=y1-j*k-w;

文案大全

setfillcolor(RGB(0,0,0)); rectangle(a,b,c,d);

clearrectangle(a-1,b-k,c,d-k); setlinecolor(RED);

line(x1-j,y1-j*k,x2,y2); setlinecolor(GREEN); line(x1,y1,x1-j,y1-j*k); if(j%2==0) {

setfillcolor(RGB(255,255,0)); circle(x2,y2,5); }

Sleep(s); } }

if(x2y1) {

for(j=1;ja=x1-j-l; b=y1+j*k+w; c=x1-j+l; d=y1+j*k-w;

setfillcolor(RGB(0,0,0)); rectangle(a,b,c,d);

clearrectangle(a-1,b-k,c,d-k); setlinecolor(RED);

line(x1-j,y1+j*k,x2,y2); setlinecolor(GREEN); line(x1,y1,x1-j,y1+j*k); if(j%2==0) {

setfillcolor(RGB(255,255,0)); circle(x2,y2,5); }

Sleep(s); }

实用文案

}

if(x2>x1&&y2for(j=1;ja=x1+j-l; b=y1-j*k+w; c=x1+j+l; d=y1-j*k-w;

setfillcolor(RGB(0,0,0)); rectangle(a,b,c,d);

clearrectangle(a-1,b-k,c,d-k); setlinecolor(RED);

line(x1+j,y1-j*k,x2,y2); setlinecolor(GREEN); line(x1,y1,x1+j,y1-j*k); if(j%2==0) {

setfillcolor(RGB(255,255,0)); circle(x2,y2,5); }

Sleep(s); } } }

else if(y1==y2) {

if(x2>x1) {

for(j=1;j<(x2-x1);j++) {

setfillcolor(RGB(0,0,0));

rectangle(x1+j-l,y1+w,x1+j+l,y1-w);

clearrectangle(x1+j-l-1,y1+w,x1+j+l-1,y1-w); setlinecolor(RED); line(x1+j,y1,x2,y2); setlinecolor(GREEN); line(x1,y1,x1+j,y1); if(j%2==0) {

setfillcolor(RGB(255,0,255)); circle(x2,y2,5);

文案大全

实用文案

}

Sleep(s); } }

if(x2for(j=1;j<(x1-x2);j++) {

setfillcolor(RGB(0,0,0));

rectangle(x1-j-l,y1+w,x1-j+l,y1-w);

clearrectangle(x1-j-l-1,y1+w,x1-j+l-1,y1-w); setlinecolor(RED); line(x1-j,y1,x2,y2); setlinecolor(GREEN); line(x1,y1,x1-j,y1); if(j%2==0) {

setfillcolor(RGB(255,0,255)); circle(x2,y2,5); }

Sleep(s); } } }

else if(x1==x2) {

if(y2>y1) {

for(j=1;j<(y2-y1);j++) {

setfillcolor(BLUE);

rectangle(x1-l,y1+j+w,x1+l,y1+j-w); setfillcolor(WHITE);

rectangle(x1,y1+j+w-1,x1+1,y1+j-1-w);

clearrectangle(x1-l-1,y1+(j-1)+w,x1+l-1,y1+(j-1)-w); setlinecolor(RED); line(x1,y1+j,x2,y2); setlinecolor(GREEN); line(x1,y1,x1,y1+j); if(j%2==0) {

setfillcolor(RGB(255,255,0));

文案大全

实用文案

circle(x2,y2,5); }

Sleep(s); } }

if(y2for(j=1;j<(y1-y2);j++) {

setfillcolor(BLUE);

rectangle(x1-l,y1-j+w,x1+l,y1-j-w); setfillcolor(WHITE);

rectangle(x1,y1-j+w-1,x1+1,y1-j-1-w);

clearrectangle(x1-l-1,y1-(j-1)+w,x1+l-1,y1-(j-1)-w); setlinecolor(RED); line(x1,y1-j,x2,y2); setlinecolor(GREEN); line(x1,y1,x1,y1-j); if(j%2==0) {

setfillcolor(RGB(255,255,0)); circle(x2,y2,5); }

Sleep(s); } } } }

cout<<\"成功显示!!\\n\";

getch(); // 按任意键继续 closegraph(); // 关闭图形界面 }

void main() {

CAGVShow a; int panju; a.Input();

cout<<\"多次演示?(1:是,2:否)\"; cin>>panju; if(panju==1) {

文案大全

实用文案

for(int i=0;i<20;i++) {

a.ShowMap(); a.MaptoGraph(); a.Dijstra(); a.Putpath(); a.show(); panju=0;

cout<<\"是否结束?(1:结束)\"; cin>>panju; if(panju==1) break; } } else {

a.ShowMap(); a.MaptoGraph(); a.Dijstra(); a.Putpath(); a.show(); } }

相关文件 //map2.txt

点的个数(输入所有数据前请换行): 16

连线条数: 26

依次输入所有点的编号,x,y坐标(用空格隔开):

1 50 50 2 250 50 3 550 50 4 750 50 5 50 150 6 250 150 7 550 150 8 750 150 9 50 350 10 250 350 11 550 350 12 750 350 13 50 550 14 250 550 15 550 550 16 750 550 输入所有互相连通的点的编号:

1 2 2 3 3 4 5 6 6 7 9 10 10 11 11 12 13 14 14 15 15 16 1 5 5 9 9 13 6 10 10 14 3 7 7 11 11 15 4 8 8 12 12 16 1 6 6 11 6 9 3 12

文案大全

因篇幅问题不能全部显示,请点此查看更多更全内容