使用寻路算法写的一个小项目

用寻路算法写的一个小项目

地址

https://a1115040996.github.io/arithmetic/html/寻路应用.html

没来得及仔细优化,后面再优化

代码如下

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<link rel="stylesheet" type="text/css" href="../css/way-finding.css"/>
	</head>
	<body>
		<ul id="ul-table">
		</ul>
		<script src="../js/plugin/jquery-2.1.0.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
		/*************************************
		 * 估价函数
		 * f(n) = g(n) + h(n)
		 * g(n) 起始点距离目标点的距离
		 * h(n) 结束点距离目标点的距离
		 * f(n) 估价   最小距离为最优解决方案
		 *
		 *
		 * 创建矩阵
		 * 1. 起点
		 * 2. 终点
		 * 3. 障碍
		 * 4. 移动路径
		**************************************/
			var sizeGrid = 25;// 点的长宽
			var startLocation;// 起点
			var endLocation;// 终点
			var openArr = [];// 开始点
			var closeArr = [];// 结束点结果
			var rocksArr = []; //障碍物
			var canClose = true; // 是否已经找到路径
			var mList = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
						 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
						 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
						 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
						 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
						 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
						 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
						 0,0,0,3,3,0,0,0,0,3,0,0,0,0,3,3,0,0,0,0,
						 0,0,0,1,3,0,0,0,0,3,0,0,0,0,3,3,0,0,0,0,
						 0,0,0,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,
						 0,0,0,3,3,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,
						 0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,
						 0,0,0,0,3,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,
						 0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,
						 0,0,0,0,0,0,0,0,0,3,0,3,3,3,0,0,0,0,0,0,
						 0,0,0,0,0,0,0,0,0,3,0,3,0,0,0,0,0,0,0,0,
						 0,0,0,3,3,3,3,3,3,3,0,3,3,3,0,0,0,0,0,0,
						 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
						 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
						 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
			function createList(list){
				$("#ul-table").width(sizeGrid*20+1+1)
				var fragment = document.createDocumentFragment()
				for (var i=0;len = list.length,i<len;i++) {
					var _li = $(‘<li uid=‘+(i+1)+‘ x=‘+(i % 20 + 1)+‘ y=‘+(Math.floor(i / 20)+1)+‘></li>‘).css({‘width‘: sizeGrid,‘height‘:sizeGrid})
					if(list[i] === 1){ // 起始点
						startLocation = _li
						openArr.push(_li)
						_li.addClass(‘start‘)
					}else if(list[i] === 2){ // 结束点
						endLocation = _li
						_li.addClass(‘end‘)
						//closeArr.push(_li)
					}else if(list[i] === 3){ // 障碍
						closeArr.push(_li)
						rocksArr.push(_li)
						_li.addClass(‘remora‘)
					}else if(list[i] === 4){ // 移动点
						_li.addClass(‘move‘)
					}
					fragment.appendChild(_li[0])
				}
				return fragment
			}
			$("#ul-table").append(createList(mList))

			// 寻迹算法
			function f(nodeGrid){
				return g(nodeGrid) + h(nodeGrid)
			}

			// 目标点 距离起始点的距离
			function g(nodeGrid){
				var a = nodeGrid.offset().left - startLocation.offset().left
				var b = nodeGrid.offset().top - startLocation.offset().top
				return Math.sqrt(a*a + b*b)
			}

			// 目标点距离结束点的距离
			function h(nodeGrid){
				var a = nodeGrid.offset().left - endLocation.offset().left
				var b = nodeGrid.offset().top - endLocation.offset().top
				return Math.sqrt(a*a + b*b)
			}

			// 获取可能的落脚点
			function findNextStepList(){
				var result = [];// 存储结果集
				var preStep = openArr.shift()
				var startX = +preStep.attr(‘x‘)
				var startY = +preStep.attr(‘y‘)
				closeArr.push(preStep)

				getPossibleGrid(startX, startY)
				// 获取可能的落脚点
				function getPossibleGrid(x,y){
					var _startX = (x-1) > 1 ? (x-1) : x;
					var _startY = (y-1) > 1 ? (y-1) : y;

					var _endX = (x+1) <= 20 ? (x+1) : x;
					var _endY = (y+1) <= 20 ? (y+1) : y;

					for(var i=_startX;i<=_endX;i++){
						for (var j=_startY;j<=_endY;j++) {
							if(!(i===startX&&j===startY)){
								if(locationFilter(i,j)){
									console.log()
									$(‘li[x=‘+i+‘][y=‘+j+‘]‘)[0].par = preStep
									$(‘li[x=‘+i+‘][y=‘+j+‘]‘)[0].distance = f($(‘li[x=‘+i+‘][y=‘+j+‘]‘))
									openArr.push($(‘li[x=‘+i+‘][y=‘+j+‘]‘))
									if(endLocation.attr(‘x‘)==i&&endLocation.attr(‘y‘)==j){
										canClose = false
									}
								}
							}
						}
					}

					// 排序
					openArr.sort(function(v1, v2){
						return v1[0].distance - v2[0].distance
					})

					// 从数据中去除关闭的 和 已经设置父级指针的
					function locationFilter(x,y){
						for (var i=0;i<closeArr.length;i++) {
							if(+closeArr[i].attr(‘x‘) === x && +closeArr[i].attr(‘y‘) === y){
								return false
							}
						}

						for (var i=0;i<openArr.length;i++) {
							if(+openArr[i].attr(‘x‘) === x && +openArr[i].attr(‘y‘) === y){
								return false
							}
						}
						return true
					}

				}

			}

		 	// 寻路
		 	function findLocationLoop(){
	 			while(canClose){
	 				findNextStepList()
	 			}
		 	}

		 	function getRecallLocation(){
		 		var result = []
		 		function getRecall(dom){
		 			if($(dom).attr(‘x‘)==startLocation.attr(‘x‘)&&$(dom).attr(‘y‘)==startLocation.attr(‘y‘)){
		 				return result
		 			}else{
		 				result.push(dom)
		 				getRecall(dom[0].par)
		 			}
		 		}
		 		getRecall(closeArr.pop())
		 		return result
		 	}

			//findLocationLoop()
			/*$("#startFind").click(function(){
				findLocationLoop()
				var result = getRecallLocation()
				result.forEach(function(v,i){
					v.addClass(‘move‘)
				})
			})
			*/

			$("li").click(function(){
				if(this.className!==‘remora‘){
					$("li").removeClass(‘end‘).removeClass(‘move‘)
					$(this).addClass(‘end‘)
					endLocation = $("li[uid="+($(this).index()+1)+"]")
					openArr = [startLocation]
					closeArr = [...rocksArr]
					canClose = true
					findLocationLoop()
					console.log(openArr)
					var result = getRecallLocation().reverse()
					result.push(endLocation)
					console.log(result)
					result.forEach(function(v,i){
						var timer = setTimeout(function(){
							$("li").removeClass(‘start‘)
							v.addClass(‘start‘)
							if(i>=result.length-1){
								startLocation = v
								$("li.end").removeClass(‘end‘)
							}
						},120*i)
					})
				}

			})

		</script>
	</body>
</html>

  

原文地址:https://www.cnblogs.com/MainActivity/p/10342315.html

时间: 2024-11-10 03:00:01

使用寻路算法写的一个小项目的相关文章

用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量.<s:iterator>标签有一个value属性,用来存放在Action类的方法中存数据的list集合,还有一个id,好像是说指定集合的索引的意思,就是给list集合遍历出来的每个对象加上一个数字标签,反正我是这么理解的,没用过.还有一个很重要,就是var变量,我在s:iterator按ctr

基于netty4的tcp消息转发服务--外包接的一个小项目

git地址 https://git.oschina.net/cggxx/CubeBox.git 分包 tcp分包采用的格式是 消息类型两个字节 | 内容长度两个字节 | 内容 长连接 tcp长连接使用心跳保证连接 连接验证 和客户端约定验证算法,具体看代码. 这是个人接的一个小项目,现在已经上线,连接物联网用的,由于交了代码后,没拿到钱,于是就当小项目开源了.本来打算用zookeeper建立集群的,后来懒,整了一半没弄完,以后再加

ACCESS(VBA)上的一个小项目 —— 2、读取ACCESS表数据到TreeView和ListView

有人问我能不能做一个程序的时候,我第一反应都说“能”. --这次在ACCESS中,借助TreeView和ListView做了一个数据联动的模型. 简析过程: 1)从网上找了一份TreeView学习教程<三小时学会树控件>,了解了TreeView的建立以及节点的使用方法: 2)把数据表中的某列按一定规则生成的数据再按一种规则解析成TreeView中的树结构(VPPS): 3)通过遍历TreeView中节点的折叠状态,通过上述一定规则生成的数据(唯一性)把数据表中的内容读取到ListView中:

我要开始一个小项目

这是我开始完全独立自己做的一个小项目,做之前我想到的好多,框架,数据库,缓存.....还有我应该怎么能够成功,我怕我不能成功的完成这些,因为我一直没有独立的自己去想做一个项目,所以我很犹豫,以前基本都是别人做好了基本的框架,其他都不用考虑,我现在自己独立的做,非常的迷茫,不知道从何入手.想要开始一个项目,所以想它的框架,决定用springMVC+spring_mybatis,数据库我用的是mysql,前台是bootstrarp,差不多就这样了,我喜欢有点成就感,所以我想有个可以让我的小项目可以展

原生JS写了一个小demo,根据输入的数字生成不同背景颜色的小方块儿~

昨天练习写了这个小demo,个人觉得通过设置定位元素left和top的值,来实现换行的功能,这种方法很巧妙~ 另外,如下代码中的随机颜色的获取,还请各位前辈多多指教:需要改进的地方:或者有没有更好的方法. 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 <style type="text

一个小项目中需要注意的几个地方

嘿嘿,今天来的比较晚的啦,没有其他的原因,就是今天在学校回来的比较晚,前两天学习的一个实际中的注册页面,就是当我们注册时间一般需要非空验证,还有就是是否已经注册,否则就可以发送邮箱进行激活验证然后成为会员,这个是我们现在在登陆网站必备的选择,而刚开始写这个其实还是不熟练的哦,感觉写起来代码蛮乱的,虽然都是写过了方法注释,但是比起来以往的一个类几行代码当然现在的小项目的页面代码也是满满的,可以说收获很大,但是也不得不说也在努力中···嘿嘿,下面就来总结一下在注册中我需要注意的地方. 一.model

js 利用throw 写的一个小程序

在下边的小程序中比较特殊的是使用isNaN()函数判断一个参数是不是数字, 1 <!DOCTYPE html> 2 <!DOCTYPE html> 3 <html> 4 <head> 5 <title></title> 6 7 <script type="text/javascript"> 8 function myFunction() { 9 10 var str = document.getElem

Winform窗体用对象数组做一个小项目

首先我我们看一下需求:我们要做的是显示员工信息,实现项目经理给员工评分的功能! 首先项目经理是评分的人所以没有用,因为我们自己写,评分的就是我们自己.所以我们要做的是先在vs也就是我们的环境里建一个项目,在建一个Windows窗体应用程序,然后把控件拖好! 左边是查看员工的信息窗体,右边是给员工评分的窗体: 1.我们现在开始代码部分 我们首先需要一个辅助类,在辅助类里我们要做什么呢?我们要写这些东西. public int id;        public int age;        pu

shell写的一个小脚本

想用shell脚本实现对一个文件夹里所有的图片的像素转换 这里错误的几个地方: 1.定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名的命名须遵循如下规则: 首个字符必须为字母(a-z,A-Z). 中间不能有空格,可以使用下划线(_). 不能使用标点符号. 不能使用bash里的关键字(可用help命令查看保留关键字). 2.使用一个定义过的变量,只要在变量名前面加美元