[Pathfinding] AStarSearch now avoids walls
This commit is contained in:
parent
937e72dfcc
commit
5cd6b6d938
@ -1,5 +1,7 @@
|
||||
package fr.uha.gasser.pathfinding.algorithm;
|
||||
|
||||
import fr.uha.gasser.pathfinding.model.Grid;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
@ -8,10 +10,12 @@ class AStarSearch {
|
||||
|
||||
private final Node start;
|
||||
private final Node goal;
|
||||
private final Grid grid;
|
||||
|
||||
AStarSearch(Node start, Node goal) {
|
||||
AStarSearch(Node start, Node goal, Grid grid) {
|
||||
this.start = start;
|
||||
this.goal = goal;
|
||||
this.grid = grid;
|
||||
}
|
||||
|
||||
|
||||
@ -57,15 +61,22 @@ class AStarSearch {
|
||||
private List<Node> getNeighbors(Node current) {
|
||||
LinkedList<Node> neighbors = new LinkedList<>();
|
||||
for (Direction direction : Direction.values()) {
|
||||
neighbors.add(getNeighbor(current, direction));
|
||||
final Node neighbor = getNeighbor(current, direction);
|
||||
// If neighbor is a wall or off the grid (null), don't add it to the list
|
||||
if (neighbor != null) neighbors.add(neighbor);
|
||||
}
|
||||
|
||||
return neighbors;
|
||||
}
|
||||
|
||||
private Node getNeighbor(Node current, Direction direction) {
|
||||
Node node = new Node(current);
|
||||
node.setLoc(new Point(current.loc.x + direction.x, current.loc.y + direction.y));
|
||||
final Dimension gridSize = grid.getSize();
|
||||
final Node node = new Node(current);
|
||||
final Point loc = new Point(current.loc.x + direction.x, current.loc.y + direction.y);
|
||||
if (grid.get(loc).isWall()) return null;
|
||||
// Don't overflow off the grid
|
||||
if (loc.x > gridSize.width || loc.y > gridSize.height) return null;
|
||||
node.setLoc(loc);
|
||||
return node;
|
||||
}
|
||||
|
||||
|
@ -1,12 +1,18 @@
|
||||
package fr.uha.gasser.pathfinding.algorithm;
|
||||
|
||||
import fr.uha.gasser.pathfinding.model.Grid;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class AStarWorker extends SwingWorker<List<Node>, List<Node>> {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(AStarWorker.class);
|
||||
|
||||
private final Node start;
|
||||
private final Node goal;
|
||||
private final Grid target;
|
||||
@ -20,7 +26,7 @@ public class AStarWorker extends SwingWorker<List<Node>, List<Node>> {
|
||||
|
||||
@Override
|
||||
protected List<Node> doInBackground() throws Exception {
|
||||
AStarSearch aStar = new AStarSearch(start, goal);
|
||||
AStarSearch aStar = new AStarSearch(start, goal, target);
|
||||
path = aStar.shortestPath();
|
||||
return path;
|
||||
}
|
||||
@ -28,6 +34,10 @@ public class AStarWorker extends SwingWorker<List<Node>, List<Node>> {
|
||||
@Override
|
||||
protected void done() {
|
||||
if (this.isCancelled()) return;
|
||||
if (path.equals(Collections.EMPTY_LIST)) {
|
||||
LOGGER.warn("There is no path between the nodes {} and {}.", start, goal);
|
||||
return;
|
||||
}
|
||||
path.forEach(node -> {
|
||||
if (! node.loc.equals(goal.loc)) target.setColor(node.loc, Color.BLUE);
|
||||
});
|
||||
|
@ -49,6 +49,10 @@ public class Grid implements Iterable<Cell> {
|
||||
return new Cell(INVALID, null);
|
||||
}
|
||||
|
||||
public final Dimension getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
public void setColor(Point loc, Color color) {
|
||||
final Cell c = cells.get(loc.x + size.width * loc.y);
|
||||
final JLabel content = c.getContent();
|
||||
|
Loading…
Reference in New Issue
Block a user