UNPKG

@evilkiwi/astar

Version:

Synchronous A* pathfinding for TypeScript

3 lines (2 loc) 2.5 kB
var n=Object.freeze({__proto__:null,diagonal:(n,t)=>{const r=Math.abs(t[0]-n[0]),o=Math.abs(t[1]-n[1]);return 1*(r+o)+(Math.sqrt(2)-2)*Math.min(r,o)},manhattan:(n,t)=>Math.abs(t[0]-n[0])+Math.abs(t[1]-n[1])});function t(n){const t=n.heuristic??"diagonal",l=n.cutCorners??!0,a=n.stepHeight??1,c=n.diagonal??!1,f=[e(n.from)],s=e(n.to);let h=null,d=[];if(!Array.isArray(n.grid))throw Error("non-array grid provided");if(!n.grid.length||!Array.isArray(n.grid[0]))throw Error("2 dimensional grid array required");const g=n.grid[0].length,M=n.grid.length,p={};function v(t){const r=e(t);if(p[r])return p[r];const o=n.grid[t[1]]?.[t[0]];if(void 0===o)throw Error("Grid value is undefined");let i;return i="number"==typeof o?{elevation:Math.max(0,o),isLegal:-1!==o}:{...o,isLegal:o.isLegal??-1!==o.elevation},p[r]=i,i}function y([n,t],r){return!_(n,r)&&-1===f.indexOf(e(n))&&(null===t||l||!_(t[0],r,0)&&!_(t[1],r,0))}function _(t,r,o=a){return 0>t[0]||0>t[1]||t[0]>=g||t[1]>=M||!v(t).isLegal&&(!0!==v(t).validAsDestination||t[0]!==n.to[0]||t[1]!==n.to[1])||!(r[0]===n.from[0]&&r[1]===n.from[1]&&!v(n.from).isLegal&&!v(n.from).validAsDestination)&&(v(t).elevation-v(r).elevation>o||v(t).elevation-v(r).elevation<-o)}function m(r){const{tiles:l,total:a}=o(r[0],c);for(let o=0;a>o;o++){const u=l[o];if(!u)continue;const a=e(u[0]);if(y(u,r[0])){const o=d.find(n=>e(n[0])===a),l=i({current:u[0],parent:r,goal:n.to,heuristic:t});if(o&&o[1].f>l.f){const n=e(o[0]);d=d.map(t=>(e(t[0])===n&&(t[1]=l,t[2]=r),t))}else o||d.push([u[0],l,r])}}d=d.sort((n,t)=>u(n[1].f,t[1].f))}for(m([n.from,{g:0,h:0,f:0},null]);d.length>0;){const n=d.shift();if(n){const[t]=n,o=e(t);if(f.push(o),o===s){h=r(n),d=[];continue}m(n)}}return h}function r(n){let t=n;const r=[];for(;null!==t;)r.push(t[0]),t=t[2];return r.reverse(),r}function o(n,t=!1){const r=[];return r.push([[n[0]-1,n[1]],null]),r.push([[n[0]+1,n[1]],null]),r.push([[n[0],n[1]-1],null]),r.push([[n[0],n[1]+1],null]),t&&(r.push([[n[0]-1,n[1]-1],[[n[0],n[1]-1],[n[0]-1,n[1]]]]),r.push([[n[0]+1,n[1]+1],[[n[0],n[1]+1],[n[0]+1,n[1]]]]),r.push([[n[0]+1,n[1]-1],[[n[0],n[1]-1],[n[0]+1,n[1]]]]),r.push([[n[0]-1,n[1]+1],[[n[0],n[1]+1],[n[0]-1,n[1]]]])),{tiles:r,total:r.length}}function i(t){const r=t.parent[1].g+1,o=n[t.heuristic](t.current,t.goal);return{g:r,h:o,f:r+o}}function e(n){return`${n[0]},${n[1]}`}function u(n,t){return n>t?1:t>n?-1:0}export{u as asc,r as calculatePath,o as neighbors,i as score,t as search,e as vectorId}; //# sourceMappingURL=index.esm.min.js.map