zoukankan      html  css  js  c++  java
  • PathFinding.js 寻路类神器

      最近有打算写个迷宫玩玩,无意中发下了这个库,很强大!又是开源在github的,并且有一个相当酷的demo。这个库不仅支持浏览器端的运行,而且可以运行在node.js上。怎么用到服务器上这里就不涉及了,主要还是翻译一下官方的demo。

    一、基本应用

      首先我们要定义一个二维的图

    var grid = new PF.Grid(width, height); //这里的两个参数定义了图的长和宽

    然后我们可以设置这个图中一些不能走的节点,用setWalkableAt函数

    grid.setWalkableAt(0, 1, false);

    这段代码的意思是设置(0,1)这个点不能走。

    当然这样的话如果图非常大,不能走的点很多就很复杂了,不过还有一种方法可以让我们直接用矩阵定义图,用0,1表示能否到达

    1 var matrix = [
    2     [0, 0, 0, 1, 0],
    3     [1, 0, 0, 0, 1],
    4     [0, 0, 1, 0, 0],
    5 ];
    6 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]] 

     这样,有了这个库歇一歇类似寻路的游戏就不用担心算法问题啦(当然你追求速度要自己弄个高档的启发函数就另说啦),实在是很方便啊!

    如果你觉得内容对你有帮助,请点个赞

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。
  • 相关阅读:
    log4net 发布到生产环境不写日志的解决方法--使用 NLog日志
    centos 下Supervisor 守护进程基本配置
    centos 7 下安装Nginx
    Haproxy+asp.net +RedisSessionStateProvider 完美实现负载均衡,并且session保持
    centos之Haproxy 负载均衡学习笔记
    改进初学者的PID-介绍
    实现Modbus TCP多网段客户端应用
    有一种亲切是手机
    实现Modbus ASCII多主站应用
    爱好
  • 原文地址:https://www.cnblogs.com/MrLJC/p/3434687.html
Copyright © 2011-2022 走看看