Skip to content

Commit 6d38bf2

Browse files
committed
perf: Circle search algorithm to replace bfs
1 parent 81b9c54 commit 6d38bf2

File tree

4 files changed

+45
-8
lines changed

4 files changed

+45
-8
lines changed

src/core/execution/NukeExecution.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,14 @@ export class NukeExecution implements Execution {
5050
const tilesInRange = new Map<TileRef, number>();
5151
const magnitude = this.mg.config().nukeMagnitudes(this.nuke.type());
5252
const inner2 = magnitude.inner * magnitude.inner;
53-
const outer2 = magnitude.outer * magnitude.outer;
54-
this.mg.bfs(this.dst, (_, n: TileRef) => {
55-
const d2 = this.mg?.euclideanDistSquared(this.dst, n) ?? 0;
56-
if (d2 <= outer2) {
57-
tilesInRange.set(n, d2 <= inner2 ? 1 : 0.5);
53+
this.mg.circleSearch(
54+
this.dst,
55+
magnitude.outer,
56+
(t: TileRef, d2: number) => {
57+
tilesInRange.set(t, d2 <= inner2 ? 1 : 0.5);
5858
return true;
59-
}
60-
return false;
61-
});
59+
},
60+
);
6261
return tilesInRange;
6362
}
6463

src/core/game/GameImpl.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,13 @@ export class GameImpl implements Game {
882882
euclideanDistSquared(c1: TileRef, c2: TileRef): number {
883883
return this._map.euclideanDistSquared(c1, c2);
884884
}
885+
circleSearch(
886+
tile: TileRef,
887+
radius: number,
888+
filter?: (tile: TileRef, d2: number) => boolean,
889+
): Set<TileRef> {
890+
return this._map.circleSearch(tile, radius, filter);
891+
}
885892
bfs(
886893
tile: TileRef,
887894
filter: (gm: GameMap, tile: TileRef) => boolean,

src/core/game/GameMap.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ export interface GameMap {
3939

4040
manhattanDist(c1: TileRef, c2: TileRef): number;
4141
euclideanDistSquared(c1: TileRef, c2: TileRef): number;
42+
circleSearch(
43+
tile: TileRef,
44+
radius: number,
45+
filter?: (tile: TileRef, d2: number) => boolean,
46+
): Set<TileRef>;
4247
bfs(
4348
tile: TileRef,
4449
filter: (gm: GameMap, tile: TileRef) => boolean,
@@ -288,6 +293,25 @@ export class GameMapImpl implements GameMap {
288293
const y = this.y(c1) - this.y(c2);
289294
return x * x + y * y;
290295
}
296+
circleSearch(
297+
tile: TileRef,
298+
radius: number,
299+
filter?: (tile: TileRef, d2: number) => boolean,
300+
): Set<TileRef> {
301+
const center = { x: this.x(tile), y: this.y(tile) };
302+
const tiles: Set<TileRef> = new Set<TileRef>();
303+
for (let i = center.x - radius; i <= center.x + radius; ++i) {
304+
for (let j = center.y - radius; j <= center.y + radius; j++) {
305+
const t = this.ref(i, j);
306+
const d2 = this.euclideanDistSquared(tile, t);
307+
if (d2 > radius * radius) continue;
308+
if (!filter || filter(t, d2)) {
309+
tiles.add(t);
310+
}
311+
}
312+
}
313+
return tiles;
314+
}
291315
bfs(
292316
tile: TileRef,
293317
filter: (gm: GameMap, tile: TileRef) => boolean,

src/core/game/GameView.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,13 @@ export class GameView implements GameMap {
762762
euclideanDistSquared(c1: TileRef, c2: TileRef): number {
763763
return this._map.euclideanDistSquared(c1, c2);
764764
}
765+
circleSearch(
766+
tile: TileRef,
767+
radius: number,
768+
filter?: (tile: TileRef, d2: number) => boolean,
769+
): Set<TileRef> {
770+
return this._map.circleSearch(tile, radius, filter);
771+
}
765772
bfs(
766773
tile: TileRef,
767774
filter: (gm: GameMap, tile: TileRef) => boolean,

0 commit comments

Comments
 (0)