From d83abed27e297a18a720d6ac46d3db597ef6bfc1 Mon Sep 17 00:00:00 2001 From: pagoru Date: Sat, 27 Jul 2024 22:13:59 +0200 Subject: [PATCH 1/2] fix #22 --- preview/bundle.js | 63 ++++++++++++++++++---------------------------- preview/canvas.js | 8 +++--- src/grid/finder.ts | 2 +- 3 files changed, 29 insertions(+), 44 deletions(-) diff --git a/preview/bundle.js b/preview/bundle.js index 2a2df80..982598f 100644 --- a/preview/bundle.js +++ b/preview/bundle.js @@ -1,8 +1,9 @@ // src/utils/grid.utils.ts var makeSquare = (layout) => { const maxLength = Math.max(layout.length, ...layout.map((row) => row.length)); - const squareLayout = Array.from({ length: maxLength }, () => - Array(maxLength).fill(null), + const squareLayout = Array.from( + { length: maxLength }, + () => Array(maxLength).fill(null) ); for (let i = 0; i < layout.length; i++) { for (let j = 0; j < layout[i].length; j++) { @@ -13,8 +14,9 @@ var makeSquare = (layout) => { }; var transpose = (matrix) => { const maxCols = Math.max(...matrix.map((row) => row.length)); - const transposed = Array.from({ length: maxCols }, () => - Array(matrix.length).fill(null), + const transposed = Array.from( + { length: maxCols }, + () => Array(matrix.length).fill(null) ); for (let i = 0; i < matrix.length; i++) { for (let j = 0; j < matrix[i].length; j++) { @@ -92,6 +94,7 @@ var findPath = (startPoint, endPoint, grid, config) => { const orthogonalCostMultiplier = config.orthogonalCostMultiplier ?? 1; const maxJumpCost = config.maxJumpCost ?? 5; const maxIterations = config.maxIterations ?? 99999; + const fearOfJump = config.fearOfJump ?? 0.24; const index = (point) => { return point.y * grid.height + point.x; }; @@ -100,7 +103,7 @@ var findPath = (startPoint, endPoint, grid, config) => { const srcHeight = grid.getHeightAt(src) ?? NOT_REACHED_COST; const dstHeight = grid.getHeightAt(dst) ?? NOT_REACHED_COST; if (Math.abs(srcHeight - dstHeight) > MAX_JUMP_HEIGHT) return null; - return 1 + Math.abs(srcHeight - dstHeight); + return 1; }; const addOrthogonalJumps = (prevNode, src, srcCost, dirX, dirY) => { let jumpDistance = 1; @@ -109,7 +112,7 @@ var findPath = (startPoint, endPoint, grid, config) => { while (true) { const target = { x: src.x + dirX * jumpDistance, - y: src.y + dirY * jumpDistance, + y: src.y + dirY * jumpDistance }; if (!grid.isWalkable(target)) { break; @@ -124,7 +127,7 @@ var findPath = (startPoint, endPoint, grid, config) => { if (totalCost < visited[targetIndex]) { visited[targetIndex] = totalCost; queue.push( - new PathNode(target, prevNode, totalCost, heuristic(target)), + new PathNode(target, prevNode, totalCost, heuristic(target)) ); } prevPoint = target; @@ -136,21 +139,12 @@ var findPath = (startPoint, endPoint, grid, config) => { }; const addDiagonal = (prevNode, src, srcCost, dirX, dirY) => { const target = { x: src.x + dirX, y: src.y + dirY }; - const moveCost = - srcCost + - (getMoveCostAt(src, target) ?? NOT_REACHED_COST) * diagonalCostMultiplier; + const moveCost = srcCost + (getMoveCostAt(src, target) ?? NOT_REACHED_COST) * diagonalCostMultiplier; const targetHeight = grid.getHeightAt(target); const aux1 = { x: src.x, y: src.y + dirY }; const aux2 = { x: src.x + dirX, y: src.y }; const targetIndex = index(target); - if ( - grid.isWalkable(target) && - grid.isWalkable(aux1) && - grid.isWalkable(aux2) && - targetHeight == grid.getHeightAt(aux1) && - targetHeight == grid.getHeightAt(aux2) && - moveCost < visited[targetIndex] - ) { + if (grid.isWalkable(target) && grid.isWalkable(aux1) && grid.isWalkable(aux2) && targetHeight == grid.getHeightAt(aux1) && targetHeight == grid.getHeightAt(aux2) && moveCost < visited[targetIndex]) { visited[targetIndex] = moveCost; queue.push(new PathNode(target, prevNode, moveCost, heuristic(target))); } @@ -249,24 +243,15 @@ var Grid = class _Grid { return new _Grid( this.width, this.height, - new Float32Array(this.heightMatrix), + new Float32Array(this.heightMatrix) ); } inBounds(point) { - return ( - point.x >= 0 && - point.x < this.width && - point.y >= 0 && - point.y < this.height - ); + return point.x >= 0 && point.x < this.width && point.y >= 0 && point.y < this.height; } isWalkable(point) { const heightAt = this.getHeightAt(point); - return ( - this.inBounds(point) && - heightAt !== null && - heightAt !== NON_WALKABLE_HEIGHT - ); + return this.inBounds(point) && heightAt !== null && heightAt !== NON_WALKABLE_HEIGHT; } walkMatrix(callback) { for (let y = 0; y < this.height; y++) { @@ -287,15 +272,15 @@ var Grid = class _Grid { } return matrix; } - findPath( - startPoint, - endPoint, - config = { - maxJumpCost: 5, - travelCosts: void 0, - }, - ) { + findPath(startPoint, endPoint, config = { + maxJumpCost: 5, + travelCosts: void 0 + }) { return findPath(startPoint, endPoint, this, config); } }; -export { Grid, makeSquare, transpose }; +export { + Grid, + makeSquare, + transpose +}; diff --git a/preview/canvas.js b/preview/canvas.js index 811a381..0220347 100644 --- a/preview/canvas.js +++ b/preview/canvas.js @@ -3,19 +3,19 @@ import { Grid, transpose } from "./bundle.js"; const getPathFinding = (start, end) => { const original = [ [ - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], [ - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], [ - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], [ - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], [ diff --git a/src/grid/finder.ts b/src/grid/finder.ts index 67a0378..e77b57b 100644 --- a/src/grid/finder.ts +++ b/src/grid/finder.ts @@ -53,7 +53,7 @@ export const findPath = ( // Max jump if (Math.abs(srcHeight - dstHeight) > MAX_JUMP_HEIGHT) return null; - return 1 + Math.abs(srcHeight - dstHeight); + return 1; }; // Orthogonal jumps from JumpPoint From 529c7c27d3cea2e16db34200ec1be91430b45993 Mon Sep 17 00:00:00 2001 From: pagoru Date: Sat, 27 Jul 2024 22:15:20 +0200 Subject: [PATCH 2/2] fix #22 --- preview/bundle.js | 60 ++++++++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/preview/bundle.js b/preview/bundle.js index 982598f..1d89512 100644 --- a/preview/bundle.js +++ b/preview/bundle.js @@ -1,9 +1,8 @@ // src/utils/grid.utils.ts var makeSquare = (layout) => { const maxLength = Math.max(layout.length, ...layout.map((row) => row.length)); - const squareLayout = Array.from( - { length: maxLength }, - () => Array(maxLength).fill(null) + const squareLayout = Array.from({ length: maxLength }, () => + Array(maxLength).fill(null), ); for (let i = 0; i < layout.length; i++) { for (let j = 0; j < layout[i].length; j++) { @@ -14,9 +13,8 @@ var makeSquare = (layout) => { }; var transpose = (matrix) => { const maxCols = Math.max(...matrix.map((row) => row.length)); - const transposed = Array.from( - { length: maxCols }, - () => Array(matrix.length).fill(null) + const transposed = Array.from({ length: maxCols }, () => + Array(matrix.length).fill(null), ); for (let i = 0; i < matrix.length; i++) { for (let j = 0; j < matrix[i].length; j++) { @@ -112,7 +110,7 @@ var findPath = (startPoint, endPoint, grid, config) => { while (true) { const target = { x: src.x + dirX * jumpDistance, - y: src.y + dirY * jumpDistance + y: src.y + dirY * jumpDistance, }; if (!grid.isWalkable(target)) { break; @@ -127,7 +125,7 @@ var findPath = (startPoint, endPoint, grid, config) => { if (totalCost < visited[targetIndex]) { visited[targetIndex] = totalCost; queue.push( - new PathNode(target, prevNode, totalCost, heuristic(target)) + new PathNode(target, prevNode, totalCost, heuristic(target)), ); } prevPoint = target; @@ -139,12 +137,21 @@ var findPath = (startPoint, endPoint, grid, config) => { }; const addDiagonal = (prevNode, src, srcCost, dirX, dirY) => { const target = { x: src.x + dirX, y: src.y + dirY }; - const moveCost = srcCost + (getMoveCostAt(src, target) ?? NOT_REACHED_COST) * diagonalCostMultiplier; + const moveCost = + srcCost + + (getMoveCostAt(src, target) ?? NOT_REACHED_COST) * diagonalCostMultiplier; const targetHeight = grid.getHeightAt(target); const aux1 = { x: src.x, y: src.y + dirY }; const aux2 = { x: src.x + dirX, y: src.y }; const targetIndex = index(target); - if (grid.isWalkable(target) && grid.isWalkable(aux1) && grid.isWalkable(aux2) && targetHeight == grid.getHeightAt(aux1) && targetHeight == grid.getHeightAt(aux2) && moveCost < visited[targetIndex]) { + if ( + grid.isWalkable(target) && + grid.isWalkable(aux1) && + grid.isWalkable(aux2) && + targetHeight == grid.getHeightAt(aux1) && + targetHeight == grid.getHeightAt(aux2) && + moveCost < visited[targetIndex] + ) { visited[targetIndex] = moveCost; queue.push(new PathNode(target, prevNode, moveCost, heuristic(target))); } @@ -243,15 +250,24 @@ var Grid = class _Grid { return new _Grid( this.width, this.height, - new Float32Array(this.heightMatrix) + new Float32Array(this.heightMatrix), ); } inBounds(point) { - return point.x >= 0 && point.x < this.width && point.y >= 0 && point.y < this.height; + return ( + point.x >= 0 && + point.x < this.width && + point.y >= 0 && + point.y < this.height + ); } isWalkable(point) { const heightAt = this.getHeightAt(point); - return this.inBounds(point) && heightAt !== null && heightAt !== NON_WALKABLE_HEIGHT; + return ( + this.inBounds(point) && + heightAt !== null && + heightAt !== NON_WALKABLE_HEIGHT + ); } walkMatrix(callback) { for (let y = 0; y < this.height; y++) { @@ -272,15 +288,15 @@ var Grid = class _Grid { } return matrix; } - findPath(startPoint, endPoint, config = { - maxJumpCost: 5, - travelCosts: void 0 - }) { + findPath( + startPoint, + endPoint, + config = { + maxJumpCost: 5, + travelCosts: void 0, + }, + ) { return findPath(startPoint, endPoint, this, config); } }; -export { - Grid, - makeSquare, - transpose -}; +export { Grid, makeSquare, transpose };