Поиск пути (волновой)
- // class Pathfinder
- import java.util.Vector;
- /**
- * @author dzanis
- * @version 1.0
- */
- public class Pathfinder {
- /**
- * Волновой метод для поиска кратчайшего пути от одной точки к другой, учитывая препятствия на пути
- * @version 1.0
- * @param startX x стартовой точки
- * @param startY y стартовой точки
- * @param endX x конечной точки
- * @param endY y конечной точки
- * @param map карта,двухмерный массив в котором 0 считается свободной клеткой
- * @return Vector path рассчитанный путь
- */
- public Vector getPath (int startX, int startY, int endX, int endY, int[][] map ) {
- Vector openList = new Vector();
- Vector closeList = new Vector();
- Node startNode = new Node(endX, endY);
- openList.add(startNode);
- while (openList.size() > 0) {
- Node n = (Node) openList.elementAt(0);
- openList.removeElementAt(0);
- closeList.add(n);
- if(n.x == startX && n.y == startY) {
- Node curr = n;
- Vector path = new Vector();
- while(curr != null) {
- path.add(curr);
- curr = curr.parent;
- }
- return path;
- }
- for (int x = n.x - 1; x <= n.x + 1; x++) {
- for (int y = n.y - 1; y <= n.y + 1; y++) {
- if (x >= 0 && y >= 0 && x < map[0].length && y < map.length) {
- if (map[y][x] == 0 && !contains(closeList, x, y) ) {
- if ( !contains(openList, x, y) ) {
- Node neighbor = new Node(x, y);
- neighbor.parent = n;
- openList.add(neighbor);
- }
- }
- }
- }
- }
- }
- return null;
- }
- /** Метод проверяет находится ли уже узел с координатами x и y в списке
- * @param list список
- * @param x
- * @param y
- * @return boolean возвращает true если есть
- */
- boolean contains(Vector list, int x, int y) {
- for (int i = 0; i < list.size(); i++) {
- Node n = (Node) list.get(i);
- if (n.x == x && n.y == y) return true;
- }
- return false;
- }
- }
- // class Node
- /**
- * @author dzanis
- * @version 1.0
- * Класс для узла. Каждый узел имеет координаты x и y и его родителя Node parent
- */
- public class Node {
- public int x;
- public int y;
- Node parent = null;
- Node(int x, int y) {
- this.x = x;
- this.y = y;
- }
- }
Пример использования:
Недостатки:
ищет дольше чем AStar, местами ищет по диагонали, требует больше памяти чем AstarРаботает и на JavaSE, на ней и тестирую. Потом из него буду делать Astar поиск.
Пример и исходник: https://www.dropbox.com/s/y26ttahdoro4u9b/pathfinder-test.jar
- Pathfinder pf = new Pathfinder();
- Vector path = pf.getPath(0, 0, 10, 10, map);
- for (int i = 0; i < path.size(); i++) {
- Node n = (Node) path.elementAt(i);
- g.drawRect(n.x * 4, n.y * 4, 4, 4);//рисую найденный путь
- }
Недостатки:
ищет дольше чем AStar, местами ищет по диагонали, требует больше памяти чем AstarРаботает и на JavaSE, на ней и тестирую. Потом из него буду делать Astar поиск.
Пример и исходник: https://www.dropbox.com/s/y26ttahdoro4u9b/pathfinder-test.jar