From e93574bb3a4007c81c6548356663295ff76a0199 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 3 Jul 2014 14:08:55 -0700 Subject: [PATCH 1/4] -Add ability to enable diagonal per gridNode --- astar.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/astar.js b/astar.js index 240e744..3a9a3c9 100644 --- a/astar.js +++ b/astar.js @@ -88,7 +88,11 @@ var astar = { currentNode.closed = true; // Find all neighbors for the current node. Optionally find diagonal neighbors as well (false by default). - var neighbors = astar.neighbors(grid, currentNode, diagonal); + var diagonalThisNode = false; + if (diagonal == true) { + diagonalThisNode = (currentNode.options.diagonal != null) ? currentNode.options.diagonal : true; + } + var neighbors = astar.neighbors(grid, currentNode, diagonalThisNode); for(var i=0, il = neighbors.length; i < il; i++) { var neighbor = neighbors[i]; @@ -215,7 +219,7 @@ function Graph(grid) { nodes[x] = []; for (var y = 0, row = grid[x]; y < row.length; y++) { - nodes[x][y] = new GraphNode(x, y, row[y]); + nodes[x][y] = new GraphNode(x, y, row[y].cost, row[y].options); } } @@ -238,7 +242,7 @@ Graph.prototype.toString = function() { return graphString; }; -function GraphNode(x, y, type) { +function GraphNode(x, y, type, options) { this.data = { }; this.x = x; this.y = y; @@ -247,6 +251,7 @@ function GraphNode(x, y, type) { y: y }; this.type = type; + this.options = options || {}; } GraphNode.prototype.toString = function() { From 2028fcc6982773f1923412b49cdb3d70b4c94e63 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 4 Jul 2014 11:43:36 -0700 Subject: [PATCH 2/4] If diagonal is disabled and a tile has no non-diagonal neighbours, force allow diagonal as a fall-back --- astar.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/astar.js b/astar.js index 3a9a3c9..9792600 100644 --- a/astar.js +++ b/astar.js @@ -94,6 +94,22 @@ var astar = { } var neighbors = astar.neighbors(grid, currentNode, diagonalThisNode); + var validNeighborCount = 0; + for(var i in neighbors) { + var neighbor = neighbors[i]; + if (!neighbor.closed && !neighbor.isWall() && !beenVisited) { + validNeighborCount++; + } + } + + //This will help us find paths that are mostly not diagonal, but may have node that diagonal is the only option + if ((validNeighborCount == 0) && (diagonal == false)) { + diagonalThisNode = (currentNode.options.diagonal != null) ? currentNode.options.diagonal : true; + if (diagonalThisNode) { + neighbors = astar.neighbors(grid, currentNode, true); + } + } + for(var i=0, il = neighbors.length; i < il; i++) { var neighbor = neighbors[i]; From a3e5c009d2eb6c46d4d63067577786376d0ebb57 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 28 Jun 2016 12:25:50 -0700 Subject: [PATCH 3/4] Add ability to enable any direction per gridNode --- astar.js | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/astar.js b/astar.js index 9792600..a8fbbd0 100644 --- a/astar.js +++ b/astar.js @@ -88,11 +88,8 @@ var astar = { currentNode.closed = true; // Find all neighbors for the current node. Optionally find diagonal neighbors as well (false by default). - var diagonalThisNode = false; - if (diagonal == true) { - diagonalThisNode = (currentNode.options.diagonal != null) ? currentNode.options.diagonal : true; - } - var neighbors = astar.neighbors(grid, currentNode, diagonalThisNode); + var disabledDirections = (currentNode.options.disabledDirections != null) ? currentNode.options.disabledDirections : {}; + var neighbors = astar.neighbors(grid, currentNode, {diagonals:diagonal, disabledDirections:disabledDirections}); var validNeighborCount = 0; for(var i in neighbors) { @@ -104,10 +101,7 @@ var astar = { //This will help us find paths that are mostly not diagonal, but may have node that diagonal is the only option if ((validNeighborCount == 0) && (diagonal == false)) { - diagonalThisNode = (currentNode.options.diagonal != null) ? currentNode.options.diagonal : true; - if (diagonalThisNode) { - neighbors = astar.neighbors(grid, currentNode, true); - } + astar.neighbors(grid, currentNode, {diagonals:true, disabledDirections:disabledDirections}); } for(var i=0, il = neighbors.length; i < il; i++) { @@ -175,50 +169,58 @@ var astar = { var d2 = Math.abs (pos1.y - pos0.y); return (D * (d1 + d2)) + ((D2 - (2 * D)) * Math.min(d1, d2)); }, - neighbors: function(grid, node, diagonals) { + neighbors: function(grid, node, options) { var ret = []; var x = node.x; var y = node.y; + options = options || {}; + var diagonals = options.diagonals || false; + var dd = options.disabledDirections || {}; + + function IsDirectionEnabled(dir) { + return !dd[dir]; + } + // West - if(grid[x-1] && grid[x-1][y]) { + if(grid[x-1] && grid[x-1][y] && IsDirectionEnabled('w')) { ret.push(grid[x-1][y]); } // East - if(grid[x+1] && grid[x+1][y]) { + if(grid[x+1] && grid[x+1][y] && IsDirectionEnabled('e')) { ret.push(grid[x+1][y]); } // South - if(grid[x] && grid[x][y-1]) { + if(grid[x] && grid[x][y-1] && IsDirectionEnabled('s')) { ret.push(grid[x][y-1]); } // North - if(grid[x] && grid[x][y+1]) { + if(grid[x] && grid[x][y+1] && IsDirectionEnabled('n')) { ret.push(grid[x][y+1]); } if (diagonals) { // Southwest - if(grid[x-1] && grid[x-1][y-1]) { + if(grid[x-1] && grid[x-1][y-1] && IsDirectionEnabled('sw')) { ret.push(grid[x-1][y-1]); } // Southeast - if(grid[x+1] && grid[x+1][y-1]) { + if(grid[x+1] && grid[x+1][y-1] && IsDirectionEnabled('se')) { ret.push(grid[x+1][y-1]); } // Northwest - if(grid[x-1] && grid[x-1][y+1]) { + if(grid[x-1] && grid[x-1][y+1] && IsDirectionEnabled('nw')) { ret.push(grid[x-1][y+1]); } // Northeast - if(grid[x+1] && grid[x+1][y+1]) { + if(grid[x+1] && grid[x+1][y+1] && IsDirectionEnabled('ne')) { ret.push(grid[x+1][y+1]); } From 69c044e83ce5ae7bdf981340887c62313a106e59 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 29 Aug 2016 10:37:11 -0700 Subject: [PATCH 4/4] Add Portal support --- astar.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/astar.js b/astar.js index a8fbbd0..486dfd9 100644 --- a/astar.js +++ b/astar.js @@ -5,6 +5,8 @@ // Includes Binary Heap (with modifications) from Marijn Haverbeke. // http://eloquentjavascript.net/appendix2.html +"use strict"; + (function(definition) { if(typeof module === 'object' && typeof module.exports === 'object') { module.exports = definition(); @@ -52,6 +54,7 @@ var astar = { options = options || {}; var heuristic = options.heuristic || astar.manhattan; var diagonal = !!options.diagonal; + var portals = !!options.portals; var closest = options.closest || false; var openHeap = astar.heap(); @@ -89,7 +92,8 @@ var astar = { // Find all neighbors for the current node. Optionally find diagonal neighbors as well (false by default). var disabledDirections = (currentNode.options.disabledDirections != null) ? currentNode.options.disabledDirections : {}; - var neighbors = astar.neighbors(grid, currentNode, {diagonals:diagonal, disabledDirections:disabledDirections}); + var portalTargets = ((currentNode.options.portalTargets != null) && portals) ? currentNode.options.portalTargets : []; + var neighbors = astar.neighbors(grid, currentNode, {diagonals:diagonal, disabledDirections:disabledDirections, portalTargets:portalTargets}); var validNeighborCount = 0; for(var i in neighbors) { @@ -101,7 +105,7 @@ var astar = { //This will help us find paths that are mostly not diagonal, but may have node that diagonal is the only option if ((validNeighborCount == 0) && (diagonal == false)) { - astar.neighbors(grid, currentNode, {diagonals:true, disabledDirections:disabledDirections}); + astar.neighbors(grid, currentNode, {diagonals:true, disabledDirections:disabledDirections, portalTargets:portalTargets}); } for(var i=0, il = neighbors.length; i < il; i++) { @@ -177,11 +181,16 @@ var astar = { options = options || {}; var diagonals = options.diagonals || false; var dd = options.disabledDirections || {}; + var pt = options.portalTargets || []; function IsDirectionEnabled(dir) { return !dd[dir]; } + function PositionExists(px, py) { + return (grid[px] && grid[px][py]); + } + // West if(grid[x-1] && grid[x-1][y] && IsDirectionEnabled('w')) { ret.push(grid[x-1][y]); @@ -226,6 +235,13 @@ var astar = { } + for (var p=0; p