PathFinding.js 寻路类神器
最近有打算写个迷宫玩玩,无意中发下了这个库,很强大!又是开源在github的,并且有一个相当酷的demo。这个库不仅支持浏览器端的运行,而且可以运行在node.js上。怎么用到服务器上这里就不涉及了,主要还是翻译一下官方的demo。
一、基本应用
首先我们要定义一个二维的图
var grid = new PF.Grid(width, height); //这里的两个参数定义了图的长和宽
然后我们可以设置这个图中一些不能走的节点,用setWalkableAt函数
grid.setWalkableAt(0, 1, false);
这段代码的意思是设置(0,1)这个点不能走。
当然这样的话如果图非常大,不能走的点很多就很复杂了,不过还有一种方法可以让我们直接用矩阵定义图,用0,1表示能否到达
var matrix = [
[0, 0, 0, 1, 0],
[1, 0, 0, 0, 1],
[0, 0, 1, 0, 0],
];
var grid = new PF.Grid(5, 3, matrix);
图建好了之后我们就可以开始最激动人心的地方了,那就是这个库为我们提供的九种寻路函数。要知道这个要是自己实现还是有不少的困难的。这九中算法分别是:
AStarFinder
*BreadthFirstFinder
*BestFirstFinder
DijkstraFinder
*BiAStarFinder
BiBestFirstFinder
BiDijkstraFinder
*BiBreadthFirstFinder
*JumpPointFinder
*
这九个函数中尾部加了星号的是保证能找到最短路的,从第五个开始四个前缀bi的则是双向搜索的意思。
要使用这些函数需要首先建立一个查找的对象,一第一种查找为例:
var finder = new PF.AStarFinder();
然后我们用它查找所建立的图上两点的路径:
var path = finder.findPath(1, 2, 4, 2, grid);//表示搜索(1,2)到(4,2)的最短路,运行后path=[ [ 1, 2 ], [ 1, 1 ], [ 2, 1 ], [ 3, 1 ], [ 3, 2 ], [ 4, 2 ] ]
当然它这个算法的实现貌似是直接在原图上操作的,所以各种算法运行后图就变了,所以你要多次应用的话就要先复制一份,就像:
var gridBackup = grid.clone();
二、高级应用
1、你可以设置是否允许走斜线:
var finder = new PF.AStarFinder({
allowDiagonal: true
});
然后再走斜线的基础上,你可以设置是否允许从不能走的方块角上过去:
var finder = new PF.AStarFinder({
allowDiagonal: true,
dontCrossCorners: true
});
2、我们知道很影响寻路算法的速度的就是他们的启发函数,在PathFinding中也允许我们定义自己的启发函数
对于 AStarFinder
, BestFirstFinder
以及他们加了 Bi
前缀,我们就可以设置他的启发函数,本身提供了三个备选的
1、PF.Heuristic.manhattan (默认值)
2、PF.Heuristic.chebyshev
3、PF.Heuristic.euclidean
如果要修改启发函数:
var finder = new PF.AStarFinder({
heuristic: PF.Heuristic.chebyshev
});
或者是定义自己的启发函数
var finder = new PF.BestFirstFinder({
allowDiagonal: true,
heuristic: function(dx, dy) {
return Math.min(dx, dy);
}
});
三、由于返回的路径是路径话说那个的每个点,你也可以只返回那些标志点:
var newPath = PF.Util.smoothenPath(grid, path);
这样如果原来的path是[[0, 1], [0, 2], [0, 3], [0, 4]]
那么修改之后就是 [[0, 1], [0, 4]]
这样,有了这个库歇一歇类似寻路的游戏就不用担心算法问题啦(当然你追求速度要自己弄个高档的启发函数就另说啦),实在是很方便啊!
PathFinding.js 寻路类神器的更多相关文章
- 一个重构的js分页类
// JavaScript Document /**//** * js分页类 * @param iAbsolute 每页显示记录数 * @param sTableId 分页表格属性ID值,为Strin ...
- 分享非常好用的前端分页js工具类 灵活 简单易懂
分享自己封装的前端分页js工具类 下面是默认样式效果截图 可以随意更改js及css 很灵活 /** * pageSize, 每页显示数 * pageIndex, 当前页数 * pageCount 总 ...
- JS常用类
JS常用类 一.Number 1.常用数字 整数:10 小数:3.14 科学计数法:1e5 | 1e-5 正负无穷:Infinity | -Infinity 2.常用进制 二进制:0b1010 八进制 ...
- JS创建类的方法--简单易懂有实例
版权声明:本文为博主原创文章,转载请注明出处 Javascript是一种基于对象的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有Class. ...
- Vue.js的类Class 与属性 Style如何绑定
Vue.js的类Class 与属性 Style如何绑定 一.总结 一句话总结:数据绑定一个常见需求是操作元素的 class 列表和它的内联样式.因为它们都是属性,我们可以用 v-bind 处理它们:我 ...
- js构建类的方法
Javascript是一种基于对象的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有Class.(不过,ES6引入了Class这个概念,作为对 ...
- JS实现 类的 1.判断 2.添加 3.删除 4切换
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- JS定义类的六种方式详解
转载自: http://www.jb51.net/article/84089.htm 在前端开发中,经常需要定义JS类.那么在JavaScript中,定义类的方式有几种,分别是什么呢?本文就JS定义类 ...
- 【原创】JS文件替换神器--Chrome ReRes插件
本文仅供学习交流使用,如侵立删! JS文件替换神器--Chrome ReRes插件 ReRes插件安装配置 ReRes项目官方地址:https://github.com/annnhan/ReRes 谷 ...
随机推荐
- ASC47B borderless
题目描述 border集合为{NULL,str}的串str称为borderless串. border即KMP里的那个. 字符集{'a','b'},给定长度n,求第k(给定)小的borderless串. ...
- MFCC可视化
大多数文章和博客介绍都是MFCC的算法流程,物理意义,这里仅仅从数据分布可视化的角度,清晰 观察MFCC特征在空间中的分布情况,加深理解. MFCC处理流程: MFCC参数的提取包括以下几个步骤: 1 ...
- 【架构】Google的大规模集群管理工具Borg
参考资料: http://www.cnblogs.com/YaoDD/p/5374393.html http://www.cnblogs.com/YaoDD/p/5351589.html
- leetcode Add and Search Word - Data structure design
我要在这里装个逼啦 class WordDictionary(object): def __init__(self): """ initialize your data ...
- ACM/ICPC 之 最长公共子序列计数及其回溯算法(51Nod-1006(最长公共子序列))
这道题被51Nod定为基础题(这要求有点高啊),我感觉应该可以算作一级或者二级题目,主要原因不是动态规划的状态转移方程的问题,而是需要理解最后的回溯算法. 题目大意:找到两个字符串中最长的子序列,子序 ...
- java 入门 第三季1
异常和异常体系 java异常体系 throwable:error:线程死锁,内存溢出 excepiton:rumtimeException运行时异常:非检查异常 检查异常:文件异常IOExceptio ...
- codeforces 449B Jzzhu and Cities (Dij+堆优化)
输入一个无向图<V,E> V<=1e5, E<=3e5 现在另外给k条边(u=1,v=s[k],w=y[k]) 问在不影响从结点1出发到所有结点的最短路的前提下,最多可以 ...
- BestCoder36 1002.Gunner 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5199 题目意思:给出鸟在树上的高度,以及射击到的高度,问每次射击能射中鸟的数量 用 vector 里面 ...
- ajax传值方式为数组
js: function responseJson1(){ var array=[1001,1002]; var str=""; //获取table对象 ...
- 【剑指offer】题目20 顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出 ...