C++AGV路径规划与运行仿真程序Word下载.docx
《C++AGV路径规划与运行仿真程序Word下载.docx》由会员分享,可在线阅读,更多相关《C++AGV路径规划与运行仿真程序Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
intgety(intn2);
voidInput();
//以文件方式输入地图信息
voidShowMap();
//easyx显示地图
};
intCFixedMap:
:
getx(intn1)
intx=0;
for(inti=0;
i<
mVexNum;
i++)
if(n1==mVexs[i].num)
x=mVexs[i].x;
returnx;
}
gety(intn2)
inty=0;
if(n2==mVexs[i].num)
y=mVexs[i].y;
returny;
voidCFixedMap:
Input()
intpanju;
charfname[10]={"
map2.txt"
cout<
<
"
是否载入默认地图?
(1:
是,2:
否)"
;
cin>
>
panju;
if(panju==2)
cout<
请输入地图信息文件名:
cin>
fname;
}
ifstreamfile(fname);
charuse1[100];
charuse2[100];
charuse3[100];
charuse4[100];
//use数组用来储存提示信息。
file>
use1;
//端点个数
use2;
mEdgNum;
//边数
use3;
i++)//输入所有点的信息
file>
mVexs[i].num>
mVexs[i].x>
mVexs[i].y;
use4;
for(i=0;
i++)//输入连通点编号
comb[i].num1>
comb[i].num2;
file.close();
ShowMap()
initgraph(800,600,SHOWCONSOLE|NOCLOSE);
//初始化绘图环境
setbkcolor(WHITE);
//设置背景色
cleardevice();
//用背景色清空屏幕
setfillcolor(BLACK);
//设置填充色
//画顶点
i++)
fillcircle(mVexs[i].x,mVexs[i].y,5);
settextcolor(BLACK);
chars[MAX];
sprintf(s,"
%d"
i+1);
outtextxy(mVexs[i].x-10,mVexs[i].y-20,s);
//给实际连通的顶点连线
setlinecolor(RGB(0,0,0));
setlinestyle(PS_SOLID,6,NULL,0);
cp[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);
classCPathPlan:
publicCFixedMap
public:
intpath[MAX];
//存放最后一个点
doubledist[MAX];
//存放路径距离
intv0;
//起始点
introute[40];
//路径
intrnum;
//路径顶点数
Coordinaterpoints[MAX];
//路径点集
voidMaptoGraph();
voidDijstra();
voidPutpath();
voidCPathPlan:
MaptoGraph()
rnum=0;
inta,b,x,y;
for(intj=0;
j<
j++)
{
if(i==j)
{
mMatrix[i][j]=0;
}
else
mMatrix[i][j]=maxD;
}
if(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);
Dijstra()
输入起点:
v0;
v0--;
ints[MAX];
intv;
inti;
intj;
intw;
doublemin;
for(v=0;
v<
v++)//初始化S,dist,path
s[v]=0;
//0表示未求出最短路径
dist[v]=mMatrix[v0][v];
//开始时假定为最短路径
if(dist[v]<
maxD&
&
v!
=v0)
path[v]=v0;
//直达情况
elsepath[v]=-1;
//无直达路径
dist[v0]=0;
//初始时v0属于s集,v0到v0路径最短
s[v0]=1;
for(i=1;
i++)//假设由一个中转点到达会近些,验证。
再假设由两个中转点到达会近些,验证。
穷举
min=maxD;
for(w=0;
w<
w++)//找一个最近到的点,下标装入v
if(s[w]==0&
dist[w]<
min)//点w不属于s集且离v0更近
v=w;
//经点w中转
min=dist[w];
s[v]=1;
//将v并入S,由v0到达v点最短距离为min,假设由v0到v再由v到其余各点,更新当前最后一个点及距离
for(j=0;
if(s[j]==0&
(min+mMatrix[v][j]<
dist[j]))//如果多经过一个点v到点j的距离更短,更新
{
dist[j]=min+mMatrix[v][j];
path[j]=v;
//点的序号
}
Putpath()
intopp[20];
intz;
inti=0;
输入终点:
z;
z--;
intnext;
ofstreamfile2("
fops.txt"
);
if(dist[z]<
z!
=v0)//如果有路径
opp[i++]=mVexs[z].num;
//终点
next=path[z];
//第一个点
while(next!
opp[i++]=mVexs[next].num;
next=path[next];
//下一个点
opp[i]=mVexs[v0].num;
file2<
路径长度为:
dist[z]<
'
\n'
//起点v0和最短路径
elseif(z!
=v0)//无路径
mVexs[z].num<
--"
mVexs[v0].num<
nopath"
for(intj=0;
i+1;
route[j]=opp[i-j];
file2<
路径为:
for(j=0;
i;
route[j]<
-->
rnum=i+1;
route[i];
file2.close();
rnum;
rpoints[i].x=getx(route[i]);
rpoints[i].y=gety(route[i]);
rpoints[i].num=route[i];
classCAGV
intspeed;
//AGV速度
intwidth;
//AGV宽度
intlength;
//AGV长度
CAGV();
intgetl();
intgetw();
intgets();
CAGV:
CAGV()
是否自动设置AGV信息?
是,2:
speed=8;
width=6;
length=6;
输入AGV的长:
length;
输入AGV的宽:
width;
输入AGV的速度(1-10):
speed;
intCAGV:
getl()
returnlength;
getw()
returnwidth;
gets()
returnspeed;
classCAGVShow:
publicCPathPlan,publicCAGV
#definek(abs(y2-y1))/(abs(x1-x2))
inta,b,c,d;
intx1,x2,y1,y2;
inti,j;
intl,w,s;
voidshow();
voidCAGVShow:
show()
l=getl();
w=getw();
s=11-gets();
for(into=0;
o<
o++)
if(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;
x2-x1;
a=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<
y2<
y1)
x1-x2;
a=x1-j-l;
b=y1-j*k+w;
c=x1-j+l;
d=y1-j*k-w;
line(x1-j,y1-j*k,x2,y2);
line(x1,y1,x1-j,y1-j*k);
line(x1-j,y1+j*k,x2,y2);
line(x1,y1,x1-j,y1+j*k);
line(x1+j,y1-j*k,x2,y2);
line(x1,y1,x1+j,y1-j*k);
elseif(y1==y2)
x1)
(x2-x1);
rectangle(x1+j-l,y1+w,x1+j+l,y1-w);
clearrectangle(x1+j-l-1,y1+w,x1+j+l-1,y1-w);
line(x1+j,y1,x2,y2);
line(x1,y1,x1+j,y1);
setfillcolor(RGB(255,0,255));
(x1-x2);
rectangle(x1-j-l,y1+w,x1-j+l,y1-w);
clearrectangle(x1-j-l-1,y1+w,x1-j+l-1,y1-w);
line(x1-j,y1,x2,y2);
line(x1,y1,x1-j,y1);
elseif(x1==x2)
if(y2>
(y2-y1);
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);
line(x1,y1+j,x2,y2);
line(x1,y1,x1,y1+j);
if(y2<
(y1-y2);
rectangle(x1-l,y1-j+w,x1+l,y1-j-w);
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);
line(x1,y1-j,x2,y2);
line(x1,y1,x1,y1-j);
成功显示!
!
\n"
getch();
//按任意键继续
closegraph();
//关闭图形界面
voidmain()
CAGVShowa;
intpanju;
a.Input();
多次演示?
if(panju==1)
for(inti=0;
20;
a.ShowMap();
a.MaptoGraph();
a.Dijstra();
a.Putpath();
a.show();
panju=0;
cout<
是否结束?
结束)"
cin>
if(panju==1)
break;
else
a.ShowMap();
a.MaptoGraph();
a.Dijstra();
a.Putpath();
a.show();
相关文件
//map2.txt
点的个数(输入所有数据前请换行):
16
连线条数:
26
依次输入所有点的编号,x,y坐标(用空格隔开):
150502250503550504750505501506250150755015087501509503501025035011550350127503501350550142505501555055016750550
输入所有互相连通的点的编号:
122334566791010111112131414151516155991361010