-
Notifications
You must be signed in to change notification settings - Fork 0
/
Pathfinder.ts
77 lines (71 loc) · 2.21 KB
/
Pathfinder.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import * as PF from 'pathfinding';
import Cell = require('./proto/Cell');
/**
* @author Kolly Florian
* @version 1.0 - initial
* @classdesc Classe gérant la recherche de chemin dans une grille
*/
class Pathfinder {
/** Finder de PathFinding.js */
private finder: PF.Finder;
/** Grid de PathFinding.js */
private grid: PF.Grid;
/**
* @method constructor
*/
public constructor() {}
/**
* Initialise l'objet de recherche avec l'algorithme spécifié.
* Ne supporte que A*, BFS et Dijkstra
* @method initiateGridFinder
* @param algorithm l'algorithme à utiliser
*/
public initiateGridFinder(algorithm: string): void {
switch(algorithm) {
case 'astar':
this.finder = new PF.AStarFinder();
break;
case 'bfs':
this.finder = new PF.BreadthFirstFinder();
break;
case 'dijkstra':
this.finder = new PF.DijkstraFinder();
break;
default:
this.finder = undefined;
break;
}
}
/**
* Indique la grille dans laquelle effectuer la recherche
* @method setGrid
* @param cells le tableau de cellules
* @param width la largeur de la grille
* @param height la hauteur de la grille
*/
public setGrid(cells: Array<Cell>, width: number, height: number): void {
this.grid = new PF.Grid(width, height);
for(let cell of cells) {
if(cell.isWall()) {
this.grid.setWalkableAt(cell.getX() / cell.getSideX(), cell.getY() / cell.getSideY(), false);
}
}
}
/**
* Lance la recherche pour trouver le chemin optimal
* @method runFinder
* @param start la cellule de départ
* @param end la cellule d'arrivée
* @return Un tableau 2D avec les position X et Y des cellules du parcours optimal.
* Si le tableau est vide, il n'y a pas de chemin
*/
public runFinder(start: Cell, end: Cell): Array<Array<number>> {
if(this.finder) {
const savedGrid = this.grid.clone();
const path = this.finder.findPath(start.getX() / start.getSideX(), start.getY() / start.getSideX(), end.getX() / end.getSideX(), end.getY() / end.getSideY(), this.grid);
this.grid = savedGrid;
return path;
}
}
}
export = Pathfinder;