|
@@ -1,38 +1,99 @@
|
|
|
package me.hammerle.supersnuvi.gamelogic.pathfinding;
|
|
|
|
|
|
+import org.jgrapht.Graph;
|
|
|
+import org.jgrapht.GraphPath;
|
|
|
+import org.jgrapht.alg.shortestpath.ALTAdmissibleHeuristic;
|
|
|
+import org.jgrapht.alg.shortestpath.AStarShortestPath;
|
|
|
+import org.jgrapht.graph.DefaultUndirectedWeightedGraph;
|
|
|
+import org.jgrapht.graph.DefaultWeightedEdge;
|
|
|
+
|
|
|
+import java.util.HashMap;
|
|
|
import java.util.HashSet;
|
|
|
+import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
|
|
|
-/**
|
|
|
- * level representation as graph
|
|
|
- * used to apply path finding for entities
|
|
|
- */
|
|
|
-public class LevelGraph implements IGraph, IModifieableGraph {
|
|
|
+public class LevelGraph {
|
|
|
+
|
|
|
+ protected Map<String, LevelGraphVertex> vertices;
|
|
|
+ protected Graph<LevelGraphVertex, DefaultWeightedEdge> graph;
|
|
|
+
|
|
|
+ private LevelGraphVertexCalculator vertexCalculator;
|
|
|
+
|
|
|
+ public LevelGraph() {
|
|
|
+
|
|
|
+ vertices = new HashMap<>();
|
|
|
+ graph = new DefaultUndirectedWeightedGraph<>(DefaultWeightedEdge.class);
|
|
|
+
|
|
|
+ vertexCalculator = new LevelGraphVertexCalculator();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void addVertex(int x, int y){
|
|
|
+
|
|
|
+ String key = generateKeyForVertex(x, y);
|
|
|
+
|
|
|
+ if(!vertices.containsKey(key)){
|
|
|
+
|
|
|
+ LevelGraphVertex vertex = new LevelGraphVertex(x, y);
|
|
|
+
|
|
|
+ vertices.put(key, vertex);
|
|
|
|
|
|
- private Set<LevelGraphNode> nodes;
|
|
|
+ graph.addVertex(vertex);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+// public void removeVertex(int x, int y){
|
|
|
+//
|
|
|
+// String key = generateKeyForVertex(x, y);
|
|
|
+//
|
|
|
+// if(vertices.containsKey(key)){
|
|
|
+//
|
|
|
+// graph.removeVertex(vertices.get(key));
|
|
|
+// vertices.remove(key);
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+ private LevelGraphVertex getVertexAt(int x, int y){
|
|
|
|
|
|
- public LevelGraph(){
|
|
|
+ String key = generateKeyForVertex(x, y);
|
|
|
|
|
|
- nodes = new HashSet<>();
|
|
|
+ return vertices.getOrDefault(key, null);
|
|
|
}
|
|
|
|
|
|
+ public void addEdge(int startX, int startY, int endX, int endY){
|
|
|
|
|
|
- @Override
|
|
|
- public Set<LevelGraphNode> getNodes() {
|
|
|
- return nodes;
|
|
|
+ LevelGraphVertex start = getVertexAt(startX, startY);
|
|
|
+ LevelGraphVertex end = getVertexAt(endX, endY);
|
|
|
+
|
|
|
+ if(start != null && end != null){
|
|
|
+
|
|
|
+ DefaultWeightedEdge edge = graph.addEdge(start, end);
|
|
|
+ graph.setEdgeWeight(edge, vertexCalculator.calculateWeightBetween(start, end));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public void addNode(INode node) {
|
|
|
+ public Object doo() {
|
|
|
+
|
|
|
|
|
|
- if(node instanceof LevelGraphNode)
|
|
|
- nodes.add((LevelGraphNode) node);
|
|
|
+ Set<LevelGraphVertex> landmarks = new HashSet<>();
|
|
|
+
|
|
|
+ for(LevelGraphVertex vertex : vertices.values()){
|
|
|
+
|
|
|
+ landmarks.add(vertex);
|
|
|
+ }
|
|
|
+
|
|
|
+ ALTAdmissibleHeuristic<LevelGraphVertex, DefaultWeightedEdge> heuristic = new ALTAdmissibleHeuristic<>(graph, landmarks);
|
|
|
+ AStarShortestPath<LevelGraphVertex, DefaultWeightedEdge> astar = new AStarShortestPath<>(graph, heuristic);
|
|
|
+
|
|
|
+ GraphPath<LevelGraphVertex, DefaultWeightedEdge> path = astar.getPath(getVertexAt(36, 10), getVertexAt(32,13));
|
|
|
+
|
|
|
+ return path;
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public void removeNode(INode node) {
|
|
|
+ private String generateKeyForVertex(int x, int y){
|
|
|
+ return x + ":" + y;
|
|
|
+ }
|
|
|
|
|
|
- if(node instanceof LevelGraphNode)
|
|
|
- nodes.remove(node);
|
|
|
+ Graph<LevelGraphVertex, DefaultWeightedEdge> getGraph() {
|
|
|
+ return graph;
|
|
|
}
|
|
|
}
|