基于javascript实现获取最短路径算法代码实例
这篇文章主要介绍了基于javascript实现获取最短路径算法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
代码如下
//A算法自动寻路路径
classGetAutoPath{
constructor(id,map,sPos,ePos,mapArr){
//this.type=id.type;
this.id=id;
this.map=map;
this.sPos=sPos;
this.ePos=ePos;
this.mapArr=mapArr;
this.maxMach=10000;
this.openArr=[];
this.closeArr=[];
this.minPath=[];
if(!this.isPath(this.sPos.x,this.sPos.y)){this.sPos=this.getNewDot(sPos,ePos);}
if(!this.isPath(this.ePos.x,this.ePos.y)){this.ePos=this.getNewDot(ePos,sPos);}
//console.log(this.mapArr);
returnthis.run();
}
posts(txt,arr){//post消息
//letid=this.id,sPos=this.sPos,ePos=this.ePos,arrs=arr||[];
return{id:this.id,map:this.map,arr:arr||[],sPos:this.sPos,ePos:this.ePos,txt:txt}
}
isPath(x,y){//isPath=true合法路径=isBanPath===undefined
letisPath=false,ym=this.mapArr.get(y),xm;//console.log(ym);debugger;
if(ym!==undefined){
xm=ym.get(x);
if(xm!==undefined){
if(xm.isBanPath===undefined){isPath=true;}
}
}
//if(this.mapArr[y]!==undefined&&this.mapArr[y][x]!==undefined&&this.mapArr[y][x].isPath===1){isPath=true;}
returnisPath;
}
getEqual(arr,x,y){//获取目标数组相同的坐标
letisPos=false;
if(arr.length===0){
isPos=false;
}else{
isPos=arr.some(function(o){returno.x===x&&o.y===y;});
}
returnisPos;
}
getDot(x,y){//获取周围8个方向坐标
return[{x:x-1,y:y},{x:x+1,y:y},{x:x,y:y-1},{x:x,y:y+1},{x:x-1,y:y-1},{x:x+1,y:y+1},{x:x+1,y:y-1},{x:x-1,y:y+1}]
}
getNewDot(setPos,pos){//重定义起点或终点
letdot=setPos,pointDot,k,arr=[],arrs=[],g,end,maxMachT=0;
while(!end&&maxMachT0){end=true;}
}
dot={x:arr[0].x,y:arr[0].y,g:arr[0].g};arr=[];
}
if(!arrs[0].x||!arrs[0].y){returnthis.posts("没有符合的坐标");}
return{x:arrs[0].x,y:arrs[0].y};
}
run(){
if(this.sPos.x===undefined||this.ePos.x===undefined){returnthis.posts("没有符合的坐标");}
letsPos=this.sPos,ePos=this.ePos,point,key,i,newPoint,ger,gers,g,h,f,maxMachT=0;
this.openArr[0]={x:sPos.x,y:sPos.y,f:0,p:0,ger:0}
while(this.openArr.length>0){
maxMachT++;
point=this.openArr[0];this.closeArr.push(point);this.openArr.splice(0,1);
key=this.closeArr.length-1;//设置当前节点
newPoint=this.getDot(point.x,point.y);//获取周围点
for(iinnewPoint){//设置周围点
ger=Math.round(Math.sqrt(Math.abs(newPoint[i].x-point.x)+Math.abs(newPoint[i].y-point.y))*100)/100;//到当前节点的曼哈顿距离,保留两位小数点
gers=ger+point.ger;
g=Math.round(gers*100)/100;
h=Math.abs(newPoint[i].x-ePos.x)+Math.abs(newPoint[i].y-ePos.y);
f=g+h;
if(this.isPath(newPoint[i].x,newPoint[i].y)&&!this.getEqual(this.openArr,newPoint[i].x,newPoint[i].y)&&!this.getEqual(this.closeArr,newPoint[i].x,newPoint[i].y)){this.openArr.push({x:newPoint[i].x,y:newPoint[i].y,f:f,p:key,ger:ger});}
}
this.openArr.sort(function(a,b){returna.f-b.f;});//排序
if(this.getEqual(this.closeArr,ePos.x,ePos.y)||this.getEqual(this.openArr,ePos.x,ePos.y)){//end
this.minPath.unshift(this.closeArr[key]);
while(this.minPath.length>0){
if(this.minPath[0].p==0){returnthis.posts('success',this.minPath);}else{this.minPath.unshift(this.closeArr[this.minPath[0].p]);}
}
}elseif(maxMachT===this.maxMach){
returnthis.posts("没有符合的坐标");
}
}
returnthis.posts("没有符合的坐标");
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。