From ecd30e10663cd7dd7b542d35ba3c6e3076012e2b Mon Sep 17 00:00:00 2001 From: Robbe Clerckx Date: Fri, 20 May 2022 16:11:28 +0200 Subject: [PATCH 1/2] fix: pointsToAvoid are not walkable To prevent corner cutting through obstacles --- bin/easystar-0.4.4.js | 4 ++-- bin/easystar-0.4.4.min.js | 2 +- src/easystar.js | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/bin/easystar-0.4.4.js b/bin/easystar-0.4.4.js index ba4d9b5..a9ff8e3 100644 --- a/bin/easystar-0.4.4.js +++ b/bin/easystar-0.4.4.js @@ -272,7 +272,7 @@ if(0!==instance.openList.size()){var searchNode=instance.openList.pop();// Handl if(instance.endX!==searchNode.x||instance.endY!==searchNode.y)searchNode.list=0,searchNode.y>0&&checkAdjacentNode(instance,searchNode,0,-1,1*getTileCost(searchNode.x,searchNode.y-1)),searchNode.x0&&checkAdjacentNode(instance,searchNode,-1,0,1*getTileCost(searchNode.x-1,searchNode.y)),diagonalsEnabled&&(searchNode.x>0&&searchNode.y>0&&(allowCornerCutting||isTileWalkable(collisionGrid,acceptableTiles,searchNode.x,searchNode.y-1,searchNode)&&isTileWalkable(collisionGrid,acceptableTiles,searchNode.x-1,searchNode.y,searchNode))&&checkAdjacentNode(instance,searchNode,-1,-1,1.4*getTileCost(searchNode.x-1,searchNode.y-1)),searchNode.x0&&(allowCornerCutting||isTileWalkable(collisionGrid,acceptableTiles,searchNode.x,searchNode.y-1,searchNode)&&isTileWalkable(collisionGrid,acceptableTiles,searchNode.x+1,searchNode.y,searchNode))&&checkAdjacentNode(instance,searchNode,1,-1,1.4*getTileCost(searchNode.x+1,searchNode.y-1)),searchNode.x>0&&searchNode.y_ref;0<=_ref?_j++:_j--)_results1.push(_j);return _results1}.apply(this).reverse()).length;_i<_len;_i++)i=_ref1[_i],_results.push(_siftup(array,i,cmp));return _results}, +heapify=function(array,cmp){var i,_i,_len,_ref1,_results,_results1;for(null==cmp&&(cmp=defaultCmp),_ref1=function(){_results1=[];for(var _j=0,_ref=floor(array.length/2);0<=_ref?_j<_ref:_j>_ref;0<=_ref?_j++:_j--)_results1.push(_j);return _results1}.apply(this).reverse(),_results=[],_i=0,_len=_ref1.length;_i<_len;_i++)i=_ref1[_i],_results.push(_siftup(array,i,cmp));return _results}, /* Update the position of the given item in the heap. This function should be called every time the item is being modified. diff --git a/bin/easystar-0.4.4.min.js b/bin/easystar-0.4.4.min.js index 281537c..0886757 100644 --- a/bin/easystar-0.4.4.min.js +++ b/bin/easystar-0.4.4.min.js @@ -22,4 +22,4 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -var EasyStar=function(e){var o={};function r(t){if(o[t])return o[t].exports;var n=o[t]={i:t,l:!1,exports:{}};return e[t].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=e,r.c=o,r.d=function(t,n,e){r.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:e})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(n,t){if(1&t&&(n=r(n)),8&t)return n;if(4&t&&"object"==typeof n&&n&&n.__esModule)return n;var e=Object.create(null);if(r.r(e),Object.defineProperty(e,"default",{enumerable:!0,value:n}),2&t&&"string"!=typeof n)for(var o in n)r.d(e,o,function(t){return n[t]}.bind(null,o));return e},r.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(n,"a",n),n},r.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},r.p="/bin/",r(r.s=0)}([function(t,n,e){var P={},M=e(1),_=e(2),A=e(3);t.exports=P;var E=1;P.js=function(){var c,i,f,s=1.4,p=!1,u={},o={},r={},l={},a=!0,h={},d=[],y=Number.MAX_VALUE,v=!1;this.setAcceptableTiles=function(t){t instanceof Array?f=t:!isNaN(parseFloat(t))&&isFinite(t)&&(f=[t])},this.enableSync=function(){p=!0},this.disableSync=function(){p=!1},this.enableDiagonals=function(){v=!0},this.disableDiagonals=function(){v=!1},this.setGrid=function(t){c=t;for(var n=0;nc[0].length-1||n>c.length-1||e>c[0].length-1||o>c.length-1)throw new Error("Your start or end point is outside the scope of your grid.");if(t!==e||n!==o){for(var s=c[o][e],u=!1,l=0;l>1])<0;)t[e]=i,e=s;return t[e]=r},f=function(t,n,e){var o,r,i,s,u;for(null==e&&(e=p),r=t.length,i=t[u=n],o=2*n+1;of[0].length-1||n>f.length-1||e>f[0].length-1||o>f.length-1)throw new Error("Your start or end point is outside the scope of your grid.");if(t===e&&n===o)i([]);else{for(var s,u=f[o][e],l=!1,a=0;a>1])<0;)t[e]=i,e=s;return t[e]=r},c=function(t,n,e){var o,r,i,s,u;for(null==e&&(e=p),r=t.length,i=t[u=n],o=2*n+1;o Date: Sat, 28 May 2022 09:50:31 +0200 Subject: [PATCH 2/2] test: disable corner cutting of `pointsToAvoid` --- test/easystartest.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/easystartest.js b/test/easystartest.js index 9209b34..ef12e43 100644 --- a/test/easystartest.js +++ b/test/easystartest.js @@ -348,4 +348,28 @@ describe("EasyStar.js", function() { easyStar.calculate(); }) + + it("It should not cut corners of `pointsToAvoid`.", function(done) { + var easyStar = new EasyStar.js(); + easyStar.enableDiagonals(); + var map = [[1,1], + [1,1]]; + + easyStar.setGrid(map); + + easyStar.disableCornerCutting(); + + easyStar.setAcceptableTiles([1]); + easyStar.avoidAdditionalPoint(1, 0); + easyStar.avoidAdditionalPoint(0, 1); + + easyStar.findPath(0,0,1,1,onPathFound); + + easyStar.calculate(); + + function onPathFound(path) { + expect(path).toBeNull(); + done(); + } + }); });