当前位置: 首页 > news >正文

js寻路算法

f()=g()+h();    //g为每个节点到起点得距离;h为每个节点到终点得距离。两个距离通过勾股定理可以算出;

以下代码基本的解释和注释都有。不懂得可以留言哦

css

<style>
        ul{
            list-style: none;
            margin: 0; padding: 0; border: 1px solid #f5f5f5; border-right: none; border-bottom: none; margin: 100px auto; } ul li{ float: left; border: solid 1px #f5f5f5; border-left: none; border-top: none; display: inline-block; background: black; } .start{ background: skyblue; } .end{ background: green; } .usual{ background: pink; } </style>

 

 html

<body>
    <ul id="map-ul"></ul> <input id="btn" type="button" value="开始" /> </body>

js

<script>
    var oUl = document.getElementById("map-ul");
    var startBtn = document.getElementById("btn");
    var Li = oUl.getElementsByTagName("li"); var beginLi = document.getElementsByClassName("start"); var endLi = document.getElementsByClassName("end"); var map = [ 1,1,1,1,1,1,1,1,1,1,//0为起点;2为障碍物,3为终点 1,1,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,2,2,2,1,1, 1,1,1,1,1,2,1,1,1,1, 1,1,1,1,1,2,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,3, 1,1,1,1,1,1,1,1,1,1 ]; var openArr = [];//可能要走的路线 var closeArr = [];//已经关闭的路线 var cols = Math.sqrt(map.length) var sizeBox = 20; //初始化  init() function init(){ creatMap();//初始化地图 startBtn.onclick = function(){ openFn(); } } function creatMap(){ oUl.style.width = cols * (sizeBox + 1) + 1 + "px"; oUl.style.height = cols * (sizeBox + 1) + 1 + "px"; for (var i=0;i<map.length;i++) { var oLi = document.createElement("li"); oLi.style.width = sizeBox + "px"; oLi.style.height = sizeBox + "px"; oUl.appendChild(oLi) if (map[i] == 2) { oLi.className = "usual" closeArr.push(oLi)//障碍物添加到关闭得线路 } else if(map[i] == 0){ oLi.className = "start" openArr.push(oLi)//起始点添加到要走得线路 }else if(map[i] == 3){ oLi.className = "end" } } } function f(nodeLi){//nodeLi每个li节点 return g(nodeLi) + h(nodeLi);//g为节点到初始位置的距离,h为节点到结束位置的距离  } function g(nodeLi){ //勾股定理算出距离 var x = beginLi[0].offsetLeft - nodeLi.offsetLeft; var y = beginLi[0].offsetTop - nodeLi.offsetTop; return Math.sqrt(x*x+y*y); } function h(nodeLi){ var x = endLi[0].offsetLeft - nodeLi.offsetLeft; var y = endLi[0].offsetTop - nodeLi.offsetTop; return Math.sqrt(x*x+y*y); } function openFn(){ //以起始位置为可能要走的第一个Li var nowLi = openArr.shift(); if(nowLi == endLi[0]){ showLine(); return; } closeFn(nowLi);//将找过得节点添加到关闭的路线 findLi(nowLi);//寻找第一个Li周围的可能要走的Li openArr.sort(function(li1,li2){//将可能走得线路得节点通过距离从下到大排序。当下次循环得时候可以直接拿到上个最近得节点, return li1.num - li2.num; }) openFn(); } function findLi(nowLi){ var result = [];//所有没走过的路线。去除closeArr里存在的路线 for (var i=0;i<Li.length;i++) { if( filter(Li[i])){ result.push(Li[i]) } } function filter(Li){//如果closeArr里没有就添加到队列 for (var i=0;i<closeArr.length;i++) { if(closeArr[i] == Li){ return false; } } for (var i=0;i<openArr.length;i++) { if(openArr[i] == Li){ return false; } } return true; } //在所有没走过的节点找到与当前节点相邻的8个方向的节点 for(var i=0;i<result.length;i++){ if(Math.abs(nowLi.offsetLeft - result[i].offsetLeft)<=21&&Math.abs(nowLi.offsetTop - result[i].offsetTop)<=21){ result[i].num = f(result[i]); result[i].parent = nowLi;//设置指针  openArr.push(result[i]) } } } function showLine(){ var result = []; var lastLi = closeArr.pop(); var iNow = 0; findParent(lastLi); function findParent(li){ result.unshift(li); if( li.parent == beginLi[0] ){ return; } findParent(li.parent);//通过指针递归  console.log(li.parent) } for (var i=0;i<result.length;i++) { result[i].style.backgroundColor = "plum"; } } function closeFn(nowLi){ closeArr.push(nowLi); } </script>

 

    

 

转载于:https://www.cnblogs.com/fangling/p/9210906.html

相关文章:

  • C++公有继承、保护继承和私有继承
  • jmeter3.0+ant1.10+jenkins实现接口自动化并发送邮件
  • malloc(0)分配多少内存?(译文)
  • MATLAB生成正弦波
  • SPOJ VLATTICE
  • Anaconda快速入门安装学习笔记
  • Java多线程基础
  • 剑指offer 面试46题
  • Django 在 view 中使用 Paginator分页插件
  • 前后端分离,get请求导出
  • SQL server数据库压缩空间
  • audio之点击图标切换音频播放状态以及替换当前图标
  • python_面向对象,类名称空间,对象名称空间,组合
  • 用position: fixed;做个遮罩,怎么能让后面的View禁止滑动
  • 利用h5来进行定位当前位置
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • C语言笔记(第一章:C语言编程)
  • ECMAScript入门(七)--Module语法
  • es6(二):字符串的扩展
  • interface和setter,getter
  • Koa2 之文件上传下载
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • MySQL的数据类型
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 翻译:Hystrix - How To Use
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 开源地图数据可视化库——mapnik
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 试着探索高并发下的系统架构面貌
  • zabbix3.2监控linux磁盘IO
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #100天计划# 2013年9月29日
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (八)c52学习之旅-中断实验
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (三)模仿学习-Action数据的模仿
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .net 4.0发布后不能正常显示图片问题
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET Remoting学习笔记(三)信道
  • .Net Web项目创建比较不错的参考文章
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .pop ----remove 删除
  • @angular/cli项目构建--Dynamic.Form
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [04]Web前端进阶—JS伪数组
  • [1204 寻找子串位置] 解题报告
  • [20180224]expdp query 写法问题.txt
  • [Android]一个简单使用Handler做Timer的例子
  • [BJDCTF 2020]easy_md5
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解