From cd62502f3796141c08e6c0e67180156d3e836cba Mon Sep 17 00:00:00 2001 From: joachimschmidt557 Date: Sat, 23 Mar 2019 18:29:14 +0100 Subject: [PATCH] Better graph connection algorithm --- Projektgruppe_175/src/base/Graph.java | 8 ++- Projektgruppe_175/src/game/map/GameMap.java | 64 +++++++++++++++++++-- 2 files changed, 65 insertions(+), 7 deletions(-) diff --git a/Projektgruppe_175/src/base/Graph.java b/Projektgruppe_175/src/base/Graph.java index c833bb4..dd98ac3 100644 --- a/Projektgruppe_175/src/base/Graph.java +++ b/Projektgruppe_175/src/base/Graph.java @@ -19,6 +19,8 @@ import game.map.Castle; */ public class Graph { + final static boolean DEBUG = true; + private List> edges; private List> nodes; @@ -166,8 +168,10 @@ public class Graph { } - System.out.println(allVisitedNodes.size()); - System.out.println(nodes.size()); + if (DEBUG) { + System.out.println(allVisitedNodes.size()); + System.out.println(nodes.size()); + } return allVisitedNodes.size() == nodes.size(); diff --git a/Projektgruppe_175/src/game/map/GameMap.java b/Projektgruppe_175/src/game/map/GameMap.java index 66da120..6622ba0 100644 --- a/Projektgruppe_175/src/game/map/GameMap.java +++ b/Projektgruppe_175/src/game/map/GameMap.java @@ -7,7 +7,9 @@ import gui.Resources; import java.awt.*; import java.awt.image.BufferedImage; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -155,20 +157,32 @@ public class GameMap { List> castleNodes = castleGraph.getNodes(); - if (castleNodes.isEmpty()) + if (castleNodes.size() < 2) return; // Stage 1 List> remainingCastles = new ArrayList>(castleNodes); + List> connectedCastles = new ArrayList>(); + Node castleToConnect = remainingCastles.remove(0); + connectedCastles.add(castleToConnect); + while (!remainingCastles.isEmpty()) { - Node nearestCastle = nearestCastle(castleToConnect, remainingCastles); + //Node nearestCastle = nearestCastle(castleToConnect, remainingCastles); - castleGraph.addEdge(castleToConnect, nearestCastle); + //castleGraph.addEdge(castleToConnect, nearestCastle); - castleToConnect = nearestCastle; - remainingCastles.remove(castleToConnect); + //castleToConnect = nearestCastle; + //remainingCastles.remove(castleToConnect); + + Map.Entry, Node> conn = + nearestCastle(connectedCastles, remainingCastles); + + castleGraph.addEdge(conn.getKey(), conn.getValue()); + + remainingCastles.remove(conn.getValue()); + connectedCastles.add(conn.getValue()); } @@ -182,6 +196,12 @@ public class GameMap { } + /** + * Returns the nearest castle + * @param castle The castle + * @param allCastles The castles to choose from + * @return The nearest castle + */ private Node nearestCastle(Node castle, List> allCastles) { return allCastles.stream() @@ -192,6 +212,40 @@ public class GameMap { } + /** + * Returns the nearest castle that we can access from a list (1) of castles + * @param castles (1) The castles which should connect to the castle + * @param allCastles (2) The castles to choose from + * @return An edge from a castle from list (1) to the nearest + * castle from list (2) + */ + private Map.Entry, Node> nearestCastle(List> castles, List> allCastles) { + + // First get all nearest castles one by one + HashMap, Node> nearestCastles = new HashMap, Node>(); + + for (Node castle : castles) { + nearestCastles.put(castle, nearestCastle(castle, allCastles)); + } + + // Return the pair with the minimal distance + return + nearestCastles.entrySet().stream() + .min((x, y) -> Double.compare( + x.getValue().getValue().distance(x.getKey().getValue()), + y.getValue().getValue().distance(y.getKey().getValue()))) + .get(); + + } + + /** + * Returns a list of all castles in a predefined + * radius + * @param castle The castle + * @param allCastles The possible castles + * @param r The radius + * @return All castles in that radius + */ private List> allCastlesInRadius(Node castle, List> allCastles, double r) { return allCastles.stream()