Finish 3.1.2
This commit is contained in:
parent
526d15f2c7
commit
6102da73fa
2 changed files with 63 additions and 15 deletions
|
|
@ -154,15 +154,26 @@ public class GameMap {
|
||||||
private void generateEdges() {
|
private void generateEdges() {
|
||||||
|
|
||||||
List<Node<Castle>> castleNodes = castleGraph.getNodes();
|
List<Node<Castle>> castleNodes = castleGraph.getNodes();
|
||||||
/*
|
|
||||||
for (int i = 0; i < castleNodes.size(); i++) {
|
if (castleNodes.isEmpty())
|
||||||
if (i == castleNodes.size() - 1)
|
return;
|
||||||
castleGraph.addEdge(castleNodes.get(i), castleNodes.get(0));
|
|
||||||
else
|
// Stage 1
|
||||||
castleGraph.addEdge(castleNodes.get(i), castleNodes.get(i+1));
|
List<Node<Castle>> remainingCastles = new ArrayList<Node<Castle>>(castleNodes);
|
||||||
}*/
|
Node<Castle> castleToConnect = remainingCastles.remove(0);
|
||||||
|
while (!remainingCastles.isEmpty()) {
|
||||||
|
|
||||||
|
Node<Castle> nearestCastle = nearestCastle(castleToConnect, remainingCastles);
|
||||||
|
|
||||||
|
castleGraph.addEdge(castleToConnect, nearestCastle);
|
||||||
|
|
||||||
|
castleToConnect = nearestCastle;
|
||||||
|
remainingCastles.remove(castleToConnect);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
final double radius = 300.0;
|
// Stage 2
|
||||||
|
final double radius = 170.0;
|
||||||
|
|
||||||
for (Node<Castle> cast : castleNodes) {
|
for (Node<Castle> cast : castleNodes) {
|
||||||
for (Node<Castle> c : allCastlesInRadius(cast, castleNodes, radius))
|
for (Node<Castle> c : allCastlesInRadius(cast, castleNodes, radius))
|
||||||
|
|
@ -171,6 +182,16 @@ public class GameMap {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Node<Castle> nearestCastle(Node<Castle> castle, List<Node<Castle>> allCastles) {
|
||||||
|
|
||||||
|
return allCastles.stream()
|
||||||
|
.min((x, y) -> Double.compare(
|
||||||
|
castle.getValue().distance(x.getValue()),
|
||||||
|
castle.getValue().distance(y.getValue())))
|
||||||
|
.get();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private List<Node<Castle>> allCastlesInRadius(Node<Castle> castle, List<Node<Castle>> allCastles, double r) {
|
private List<Node<Castle>> allCastlesInRadius(Node<Castle> castle, List<Node<Castle>> allCastles, double r) {
|
||||||
|
|
||||||
return allCastles.stream()
|
return allCastles.stream()
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,25 @@
|
||||||
\end{algorithm}
|
\end{algorithm}
|
||||||
|
|
||||||
% Erklärung des Algorithmus
|
% Erklärung des Algorithmus
|
||||||
|
Der Algorithmus ist in zwei Schritte aufgeteilt:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Minimale Verbindung von allen Burgen
|
||||||
|
\item Ästhetische Verbesserung der Kanten
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Die minimale Verbindung aller Burgen erfolgt, indem
|
||||||
|
sichergestellt wird, dass jede Burg mit einer anderen
|
||||||
|
verbunden ist und dass alle Burgen in einer gemeinsamen
|
||||||
|
Verbindung zusammenhängen. Der Algorithmus fängt bei
|
||||||
|
einer bestimmten Start-Burg an und verbindet diese Burg
|
||||||
|
mit der nächstliegenden Burg, die noch nicht verbunden
|
||||||
|
wurde. Daraufhin wird das gleiche mit der nächsten,
|
||||||
|
übernächsten, usw. Burg getan, bis die letzte Burg erreicht
|
||||||
|
wurde. Zu diesem Zeitpunkt sind alle Burgen durch eine
|
||||||
|
Linie verbunden.
|
||||||
|
|
||||||
|
Die Ästhetische Verbesserung erfolgt, indem alle Burgen
|
||||||
|
im Umkreis einer Burg durch eine Kante verbunden werden.
|
||||||
|
|
||||||
\subsection{Überprüfung der Erreichbarkeit aller Knoten}
|
\subsection{Überprüfung der Erreichbarkeit aller Knoten}
|
||||||
|
|
||||||
|
|
@ -68,21 +86,30 @@
|
||||||
\end{algorithmic}
|
\end{algorithmic}
|
||||||
\end{algorithm}
|
\end{algorithm}
|
||||||
|
|
||||||
|
Der Algorithmus verwendet zwei unterschiedliche Datentypen:
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item HashSet wird verwendet, um die bisher
|
||||||
|
besuchten Knoten zu speichern.
|
||||||
|
\item ArrayDeque wird verwendet, um die nächsten
|
||||||
|
Knoten, die besucht werden, zu speichern.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
Der Algorithmus sammelt sozusagen alle Knoten, die
|
Der Algorithmus sammelt sozusagen alle Knoten, die
|
||||||
aufgrund von momentanen Erkenntnissen erreichbar
|
aufgrund von momentanen Erkenntnissen erreichbar
|
||||||
sind, in der Liste \texttt{nextVisitNodes}. Hingegen sind
|
sind, in der ArrayDeque \texttt{nextVisitNodes}. Hingegen sind
|
||||||
alle Knoten, die schon erreicht worden sind, in der Liste
|
alle Knoten, die schon erreicht worden sind, in dem HashSet
|
||||||
\texttt{allVisitedNodes} gespeichert.
|
\texttt{allVisitedNodes} gespeichert.
|
||||||
|
|
||||||
Der Algorithmus geht die Liste \texttt{nextVisitNodes}
|
Der Algorithmus geht die ArrayDeque \texttt{nextVisitNodes}
|
||||||
solange durch, bis diese leer ist. In jeder Iteration wird
|
solange durch, bis diese leer ist. In jeder Iteration wird
|
||||||
das erste Element der Liste aus der Liste entfernt.
|
das erste Element der Liste aus der Liste entfernt.
|
||||||
Zunächst wird dieses Element der Liste \texttt{allVisitedNodes}
|
Zunächst wird dieses Element dem HashSet \texttt{allVisitedNodes}
|
||||||
hinzugefügt. Daraufhin
|
hinzugefügt. Daraufhin
|
||||||
werden die Nachbarn dieses Elements herausgefunden. Diejenigen
|
werden die Nachbarn dieses Elements herausgefunden. Diejenigen
|
||||||
Nachbarn, die schon in der Liste \texttt{allVisitedNodes}
|
Nachbarn, die schon in dem HashSet \texttt{allVisitedNodes}
|
||||||
vorhanden sind, werden verworfen. Die restlichen Nachbarn
|
vorhanden sind, werden verworfen. Die restlichen Nachbarn
|
||||||
werden der Liste \texttt{nextVisitNodes} hinzugefügt.
|
werden der ArrayDeque \texttt{nextVisitNodes} hinzugefügt.
|
||||||
|
|
||||||
\subsection{Wege finden}
|
\subsection{Wege finden}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue