about summary refs log tree commit diff
path: root/docs/simulieren.tex
diff options
context:
space:
mode:
Diffstat (limited to 'docs/simulieren.tex')
-rw-r--r--docs/simulieren.tex595
1 files changed, 273 insertions, 322 deletions
diff --git a/docs/simulieren.tex b/docs/simulieren.tex
index 544346e..d3c128b 100644
--- a/docs/simulieren.tex
+++ b/docs/simulieren.tex
@@ -1,140 +1,233 @@
 \section{Simulieren}
 
 \subsection{Die Entstehung von Galaxien}
-``Eine Galaxie ist eine durch Gravitation gebundene große Ansammlung von
+\par ``Eine Galaxie ist eine durch Gravitation gebundene große Ansammlung von
 Sternen, Planetensystemen, Gasnebeln und sonstigen Stellaren Objekten.``
 \footnote{\url{https://de.wikipedia.org/wiki/Galaxie}}
 
-Demnach ist es relativ Einfach eine Galaxie zu generieren: es werden einfach
+\par Demnach ist es relativ Einfach eine Galaxie zu generieren: es werden einfach
 ganz viele Objekte in einen Raum geworfen. Das reicht jedoch nicht um die
 Objekte als Galaxie definieren zu können, da sie nicht ``durch Gravitation
 gebunden`` sind.
 
-Um dies zu tun muss die Kraft zwischen allen Objekten in der Galaxie berechnet
+\par Um dies zu tun muss die Kraft zwischen allen Objekten in der Galaxie berechnet
 werden um damit die Position der jeweiligen Objekte nach einer bestimmten Zeit
 bestimmen zu können.
 
-Dies reicht jedoch auch nicht um eine ``stabile`` Galaxie zu generieren:
+\par Tut man dies indem man zwischen allen Objekten die Kräfte berechnet kommt
+es zu Problemen: die Anzahl der Kraft Berechnungen die durchgeführt werden
+müssen steigen exponentiell: Die Anzahl der Kräfte die auf \(n\) Sterne wirken
+lassen sich mit der Formel \( n \cdot (n-1) \) berechnen. Für \( n=3 \) müssen
+demnach \( 6 \) Kräfte berechnet werden, für \( 100 \) Sterne dagegen \( 9900
+\) und für \( 1.000.000 \) Sterne \( \approx 9.99999 \cdot 10^{11} \). Die
+Anzahl der Kraft Berechnungen die durchgeführt werden müssen beim simulieren
+einer ''echten'' Galaxie mit \( >200 \cdot 10^6 \) Sternen ist demnach so groß,
+dass die Anzahl der Kräfte die berechnet werden müssen minimiert werden müssen
+um in einer sinnvollen Zeit an ein Ergebnis zu kommen.
+
+\par Dies reicht jedoch auch nicht um eine ``stabile`` Galaxie zu generieren:
 berechnet man nur die Kräfte die auf ruhende Objekte in einem Reibungsfreiem Raum
-wirken, würden alle Objekte zum Massenmittelpunkt gezogen werden und die Galaxie
+wirken, würden alle Objekte zum Massen Mittelpunkt gezogen werden und die Galaxie
 würde somit implodieren. Es ist also nötig auf die Sterne in der Galaxie
-Anfangs Kräfte zu wirken.  Diese Kräfte sind durch die Rotation der Galaxie um
-den Massenmittelpunkt der Galaxie definiert, man rotiert also die Galaxie und
-gleicht durch die Zentripetalkraft, die Kraft die Alle Sterne Richtung
-Massenmittelpunkt zieht aus. Rotiert man die Galaxie jedoch zu schnell,
-explodiert sie Förmlich, da die Sterne nicht mehr zusammengehalten werden und
+Anfangs Kräfte zu wirken. Diese Kräfte sind durch die Rotation der Galaxie um
+den Massen Mittelpunkt der Galaxie definiert, man rotiert also die Galaxie und
+gleicht durch die Zentripetalkraft die Kraft die Alle Sterne Richtung
+Massen Mittelpunkt zieht aus. Rotiert man die Galaxie jedoch zu schnell,
+explodiert sie förmlich, da die Sterne nicht mehr zusammengehalten werden und
 die Fliehkraft sie einfach auseinanderzieht.
 
-\subsection{Berechnung der Beschleunigungen}
-Um die Beschleunigung die auf einen Stern wirkt zu berechnen wird folgendes
-berechnet:
-
-\begin{equation} \label{eq:beschleunigung}
-    a = G \cdot \frac{\Delta{M_2}}{\Delta{r}^2}
-\end{equation}
-
-\( G \) steht hier für die Universelle Gravitationskraft, \( \Delta M \) für die
-Masse des Objektes das Umkreist wird und \( \Delta r \) für die Entfernung zum
-Mittelpunkt des Objektes das umkreist wird.
-Problem ist, dass kein Objekt umkreist wird sondern eine große Anzahl an Sternen.
-Es ist also nicht möglich mithilfe von herkömmlichen Methoden die Beschleunigung
-die auf einen Stern wirkt zu berechnen.
-
-TODO: und jetzt?
-
 \subsubsection{Die Kraft als Vektor}
-Um die Kraft als Vektor darzustellen, muss die Formel \ref{eq:beschleunigung}
-mithilfe von Vektoren wiefolgt neu aufgestellt werden:
+Um die Kraft als Vektor zu berechnen, welcher ein Stern B auf einen Stern A
+ausübt, wird die folgende Formel verwendet:
 
-\begin{equation} \vec{F}_{12} = \underbrace{-G \frac{m_1 m_2}{|r_{12}|^2}}_{Scalar}
-\cdot \underbrace{\frac{r_2 - r_1}{|r_2 - r_1|}}_{Vector} \end{equation}
+\begin{equation}
+    \vec{F}_{AB} = \underbrace{-G \frac{m_A m_B}{|r_{AB}|^2}}_{Scalar}
+    \cdot \underbrace{\frac{r_B - r_A}{|r_B - r_A|}}_{Vector}
+\end{equation}
 
 Die Summe der Kräfte die auf einen Stern wirken ist somit die Summe aller
 Kräfte die zwischen dem jeweiligen Stern \( a \) und allen anderen Sternen
 wirken:
 
-\begin{equation} F_{a} = \sum_{i=0}^{n-1} F_{ai} \end{equation}
-
-\subsubsection{Berechnung der Umlaufgeschwindigkeit}
-Die Umlaufgeschwindigkeit kann berechnet werden, indem die Kraft die die Sterne
-in die Mitte der Galaxie zieht \( \left( F = G \cdot \frac{m \cdot M}{r^2}
-\right) \) mit der Zentripetalkraft \( \left( F_z = \frac{m \cdot v^2}{r}
-\right)\) gleichgesetzt wird:
-
-\begin{equation}
-v = \sqrt{\frac{G \cdot M_E}{r}}
-\end{equation}
-
-\( M_E \) steht dabei für die Masse der Erde, \( G \) für die
-Gravitationskonstante und \( r \) für den Bahn Radius.  Da wir jedoch nicht in
-der Erdumlaufbahn, sondern in einer Galaxien Umlaufbahn hantieren, können wir
-nicht die Masse der Erde nutzen. Wir müssen daher eine andere Möglichkeit
-nutzen, die Größe der Masse, die den Stern in Richtung Massenmittelpunkt zieht zu
-berechnen.
-
-\subsubsection{Ellipsen und die Geschwindigkeit der Sterne}
-Da die Sterne nicht auf perfekten Kreisbahnen um den Mittelpunkt der Galaxie
-fliegen muss in betracht gezogen werden wie die Sterne auf Elliptischen Bahnen
-orbitieren.  Wichtigt ist dabei die Geschwindigkeit, diese muss zwischen der
-ersten Kosmischen Geschwindigkeit \( v_k \) und der zweiten Kosmischen
-Geschwindigkeit \( v_P \) liegen. Die beiden Kosmischen Geschwindigkeiten sind
-folgendermaßen definiert:
-
-\begin{equation}
-v_{k1} = \sqrt{\frac{GM}{r}}
-\end{equation}
 \begin{equation}
-v_{k2} = \sqrt{\frac{2GM}{r}}
+    F_{a} = \sum_{\substack{i=0 \\ i\neq a}}^{n-1} F_{ai}
 \end{equation}
 
-Die Tatsache das die Sterne auf Elliptischen Bahnen unterwegs sind ist für die
-Berechnung irrelevant, da eh für jeden Zeitschritt \( t \) eine neue Kraft
-berechnet wird aus der eine Beschleunigung berechnet wird die wiederum die neue
-Position des Sternes ergibt.  Hält man die Geschwindigkeit der Sterne somit im
-Intervall \( (v_{k1} ; v_{k2}) \), dann ergibt sich (in der Theorie) von
-alleine eine elliptische Bahn.
-
-\subsection{Entwicklung der nötigen Software}
-Die Software ist komplett in Golang geschrieben was die Nutzung von mehreren
-Threads mithilfe von Go-Methoden stark vereinfacht. Um den Barnes-Hut
-Algorithmus anzuwenden muss die Galaxie in einen Octree unterteilt werden.
-Dabei wird eine Zelle definiert die alle Sterne beinhaltet welche anschließen
-solange unterteilt, bis eine der drei End Bedingungen eintrifft.
+\subsection{Konzepte}
+%Die Software ist komplett in Golang geschrieben was die Nutzung von mehreren
+%Threads mithilfe von Go-Methoden stark vereinfacht. Um den Barnes-Hut
+%Algorithmus anzuwenden muss die Galaxie in einen Octree unterteilt werden.
+%Dabei wird eine Zelle definiert die alle Sterne beinhaltet welche anschließen
+%solange unterteilt, bis eine der drei end- Bedingungen eintrifft.
 
 \subsubsection{Zu lösende Probleme}
-Ein Problem das auftritt wenn die Kräfte zwischen allen Sternen berechnet
-werden ist, dass der Rechenaufwand \( O(n \cdot n-1) \approx O(n^2) \) beträgt.
-
-Es kommt zu Problemen, wenn der mittlere Fehler, der bei der Berechnung der Kraft
-entsteht größer als die wirkende Kraft wird. Dies passiert unter anderem dann,
-wenn der Abstand zwischen den Sternen so groß wird, das die wirkende Kraft so gering ist
-das sie mithilfe von Computern nicht mehr sinnvoll dargestellt wird.
-Statt nun mit Rundungsfehlern zu rechnen, können diese Sterne, die sehr weit entfernt vom
-Stern dessen Kräfte berechnet werden sollen, einfach nicht mehr beachtet werden,
-da sie nicht sinnvoll beitragen.
-Um dieses Problem zu lösen wird der Barnes-Hut Algorithmus verwenden. Dieser Algorithmus
-unterteilt einen Bereich in variabel große Zellen und mindert die Laufzeit von \( O(n^2) \) auf
-\( O(n \log(n) \).
-
-\subsubsection{Generierung von Quadtrees und die Nutzung des Barnes-Hut
-Algorithmus}
-
-Um nun einen Quadtree (einen k-nären Baum mit jeweils vier Kindern) zu
-generieren die die komplette Galaxie umfasst, muss erstmal definiert werden wie
-groß die Galaxie überhaupt ist. Dazu werden, falls bereits Sterne vorliegen,
-die jeweiligen Extrempunkte (minimales x, minimales y, maximales x und
-maximales y) bestimmt und die Wurzel Zelle mithilfe diese Werte entsprechend
-skaliert.  Falls jedoch noch nicht bekannt ist wie groß die Galaxie sein wird,
-muss abgeschätzt werden wir groß sie werden könnte, d.h.: es wird bei der
-Generierung geschaut in was für einem Bereich die Sterne Generiert werden. 
+Wie bereits beschrieben ist eines der Probleme das Auftritt die Anzahl der
+nötigen Kraft Berechnungen wodurch der Rechenaufwand Quadratisch in Relation zu
+der Anzahl der Sterne steigt und somit in \( O(n \cdot (n - 1)) \in O(n^2) \)
+liegt.
+
+\par Es kommt zu Problemen, wenn der mittlere Fehler, der bei der Berechnung
+der Kraft entsteht größer als die wirkende Kraft wird. Dies passiert unter
+anderem dann, wenn der Abstand zwischen den Sternen so groß wird, das die
+wirkende Kraft so gering ist das sie mithilfe von Computern nicht mehr sinnvoll
+dargestellt werden kann.  Statt nun mit Rundungsfehlern zu rechnen, können
+diese Sterne, die sehr weit entfernt vom Stern dessen Kräfte berechnet werden
+sollen, einfach nicht mehr beachtet werden, da sie nicht sinnvoll beitragen. Um
+diese Sterne jedoch nicht komplett aus der Berechnung auszunehmen, können
+kleine Cluster an Sternen welche weit genug vom Stern auf den die Kräfte
+berechnet werden sollen weg sind und klein genug sind zu einem Pseudo- Stern
+zusammengefasst werden welcher durch den Masse Mittelpunkt der Sterne die er
+repräsentiert definiert ist. Das Konzept wurde 1986 von Josch Barnes und Piet Hut
+veröffentlicht und erlaubt es die Anzahl an Kräften die berechnet werden müssen
+von \( O(n^2) \) auf \( O(n log(n)) \) zu reduzieren.
+
+\subsubsection{Generierung von Quadtrees und entsprechende Bäume}
+
+Um Sterne clustern zu können muss die Galaxie in der sich die Sterne befinden
+in Zellen unterteilt werden. Dazu wird ein Quadtree bzw. Octree (ein k-närer
+Baum mit 4 bzw. 8 Kindern) aufgebaut indem die Sterne eingefügt werden. Damit
+die Stern-cluster gebildet werden können müssen die Sterne sich in den Blättern
+des Baumes befinden. Die Knoten des Baumes indem sich die Sterne befinden
+dürfen somit keine weiteren Kinder besitzen.
+
+\par Ein Galaxie wie in Abbildung \ref{fig:cells} dargestellt wird demnach
+Stern für Stern in einen anfangs leeren Baum eingefügt. Die Größe der ersten
+Zelle die nach dem einfügen aller Sterne alle Sterne beinhaltet kann falls
+bekannt ist in was für einem Intervall die Koordinaten der Sterne sich befinden
+direkt genutzt werden um die Größe der Zelle zu definieren, andernfalls muss
+diese erst ermittelt werden indem die minimal und maximal Koordinaten in der
+liste an Sternen gesucht werden. Beim einfügen kann es jedoch wie in Abbildung
+\ref{fig:insertwithexisting} zu sehen zu Problemen kommen. Im falle das der
+Knoten indem ein Stern eingefügt werden soll bereits durch einen anderen Stern
+belegt ist müssen für den jeweiligen Knoten Kinder-Knoten erzeugt werden in den
+die beiden Sterne eingefügt werden müssen. Dies wird so lange fortgeführt bis
+sich alle Knoten in den Blättern des Baums befinden.
+
+\par Eine Zelle ist durch ihren Mittelpunkt und ihrer Breite definiert, daher
+verschiebt sich eine Zelle welche sich eine Ebene ''tiefer'' befinden um ein
+viertel ihre Breite und die Breite der neuen Zelle ist im Relation zu der
+Ursprünglichen Zelle gesehen halbiert.
+
+\par Nachdem alle Sterne in einen Baum eingefügt wurden und sich in den
+Blättern des Baumes befinden, wird der Baum rekursiv durchlaufen und es wird
+für jeden inneren Knoten (Knoten welche keine Blätter sind) die gesamt Masse
+ihrer Kinder berechnet und der Massen Mittelpunkt.
+
+\subsubsection{Funktion des Barnes-Hut Algorithmus}
+
+Um nun zu definierten welche Cluster zusammengefasst werden und welche nicht
+wird der Barnes-Hut Algorithmus (\ref{eq:barnes_hut}) verwendet. Dieser
+berechnet einen Wert \( \theta \) welcher als Referenz dafür genommen werden
+kann, wie die Relation zwischen der Entfernung zu einem Cluster und der Größe
+des Clusters ist. Um nun Cluster welche weit genug von einem Stern weg sind und
+gleichzeitig klein genug sind zu erkennen und herauszufiltern kann der
+Algorithmus in Kombination mit einem vordefinierten Grenzwert genutzt werden.
+
+\begin{figure}[!h]
+\centering
+\subfloat[Ein Cluster auf mehreren Sternen]{
+    \centering
+    \begin{tikzpicture}
+        \tikzstyle{circlestyle}=[shape=circle,thick,fill,draw, inner sep=0cm]
+        \node at (0, 0) {};
+        \node at (9, 0) {};
+
+        % Random seed for RNG
+        \pgfmathsetseed{7};
+
+        \foreach \x in {1,...,40}
+        {
+          % Find random numbers
+          \pgfmathrandominteger{\a}{10}{390}
+          \pgfmathrandominteger{\b}{10}{390}
+
+          % Scale numbers nicely
+          \pgfmathparse{0.005*\a}\let\a\pgfmathresult;
+          \pgfmathparse{0.005*\b}\let\b\pgfmathresult;
+
+          % draw the circle
+          \fill (\a, \b) circle (0.03);
+        };
+
+        % draw a box around the star cluster
+        \draw[] (0,0) rectangle (2, 2);
+        \node[] at (1, 1) (A1) {};
+        \draw[arrows=<->] (0,-0.2) -- node[midway, align=center, below] {\(d\)} (2,-0.2);
+
+        % draw a star in the far right of the image
+        \node[circlestyle, minimum size=2pt, label=above:\(s_1\)] at (8, 1) (A2) {};
+
+        % draw a line in between the box and the far right of the image
+        \draw[dashed, arrows=<->] (A1) -- node[midway, align=center, above] {\(r\)} (A2);
+    \end{tikzpicture}
+    \label{subfig:ungrouped}
+}
+\hfill
+\subfloat[Die abstraction des obigen Clusters]{
+    \centering
+    \begin{tikzpicture}
+        \tikzstyle{circlestyle}=[shape=circle,thick,fill,draw, inner sep=0cm]
+        \node at (0, 0) {};
+        \node at (9, 0) {};
+
+        % draw a big star in the far left of the image
+        \node[circlestyle, minimum size=2pt, label=above:\(q_1\)] at (1, 0) (B1) {};
+
+        % draw the right star
+        \node[circlestyle, minimum size=2pt, label=above:\(s_1\)] at (8, 0) (B2) {};
+        
+        % draw a line in between the far left star and the right star
+        \draw[dashed, arrows=<->] (B1) -- node[midway, align=center, above] {\(r\)} (B2);
+    \end{tikzpicture}
+    \label{subfig:grouped}
+}
+\caption{Visuelle Darstellung der Funktionsweise des Barnes-Hut Algorithmuses.
+Das Stern Cluster aus \ref{subfig:ungrouped} wird in \ref{subfig:grouped} zu einem
+Stern abstrahiert.}
+\end{figure}
 
 \begin{equation}
-    \text{Wurzel Knoten} = (0, 0), \text{Breite}=b
+    \label{eq:barnes_hut} \theta = \frac{d}{r}
 \end{equation}
 
+Ist das Verhältnis zwischen Entfernung \( r \) und Breite \( b \) des Clusters
+kleiner als der vorher definierte Grenzwert, kann das Cluster zu einem
+Pseudostern zusammengefasst werden.  
+
+\subsection{Kraft-Berechnungen}
+
+\subsubsection{Berechnung der auf einen Stern wirkenden Kraft}
+
+\par Um die Kraft, welche auf einen bestimmten Stern wirkt, zu berechnen, wird der
+Baum von der Wurzel aus rekursiv durchlaufen. Es wird für jeden Knoten das
+jeweilige \( \theta \) berechnet und mit dem vorher definierten Grenzwert
+verglichen. Ist das berechnete \( \theta \) kleiner als der vorher definierte
+Grenzwert wird die Rekursion nicht weiter in den Baum gehen sondern den
+jeweiligen Teilbaum zusammenfassen.
+
+\par Es ist somit durch den Grenzwert somit eine end-Bedingung gegeben, welche
+verhindert das zu weit in den Baum vorgedrungen wird und somit auch verhindert,
+dass Sterne die in einer zu großen Entfernung zu dem Ursprungs Stern liegen und
+dicht genug gruppiert sind in die Berechnung miteinbezogen werden.
+
+\par Möchte man die Kraft auf den Stern \( F \) in Abbildung \ref{fig:cells}
+berechnen berechnet man das \( \theta \) zwischen \( F \) und dem Wurzel-Knoten. Ist
+das berechnete \( \theta \) größer als der vorher definierte Grenzwert kann statt
+weiter in den Baum hineinzugehen und weitere Kräfte zu berechnen die Kraft
+zwischen \( F \) und dem Pseudostern der durch den Wurzel-knoten dargestellt wird 
+direkt berechnet werden. Andernfalls wird weiter in den Baum hineingegangen und
+auf der nächsten Baum-Ebene das Entsprechende \( \theta \) zwischen den Sternen
+berechnet werden.
+
+\par Betrachtet man Abbildung \ref{fig:cells} fällt auf das die Zelle in der
+sich die Sterne \( C \) und \( D \) befinden sehr klein ist und die Entfernung
+zu dem Stern \( F \) vergleichsweise hoch ist. Es kann also angenommen werden,
+dass das Theta zwischen \( F \) und der Zelle in der sich \( C \) und \( B \)
+befinden sehr klein ist. Die Sterne können demnach zusammengefasst werden.
+
 \bigskip
 
-\begin{figure}
+\begin{figure} 
 \hspace{1.5cm}
 \begin{minipage}{0.45\textwidth}
 \begin{tikzpicture}[level 1/.style={level distance=1.5cm}]
@@ -175,6 +268,7 @@ Generierung geschaut in was für einem Bereich die Sterne Generiert werden.
 \end{figure}
 
 \begin{figure}
+\centering
 \begin{forest}
     for tree={circle,draw, s sep+=0.25em}
     [
@@ -203,284 +297,141 @@ Generierung geschaut in was für einem Bereich die Sterne Generiert werden.
 dargestellt}
 \end{figure}
 
-Um die Kraft die auf einen bestimmten Stern wirkt zu berechnen, wird der Baum
-von der Wurzel aus nach unten durchlaufen.  Beispiel: Berechnung der Kraft die
-auf den Stern A wirkt. Der 'Quadtree' wird von oben nach unten durchgegangen,
-also wird das Verhältnis zwischen der Entfernung des Massemittelpunktes zu dem
-Stern A (\(\approx 42\)) und der Breite der jeweiligen Zelle (100) berechnet
-(Formel \ref{eq:barnes_hut}): \( \frac{100}{43} \not> \theta = 0.5\).
-
-\begin{equation} \label{eq:barnes_hut} \theta = \frac{d}{r} \end{equation}
-
-Ist das Verhältnis größer als ein im vorhinein definierter Grenzwert \( \theta
-\), dann wird weiter in den Quadtree ineingegangen und eine Ebene tiefer
-rekursiv weitergeprüft.
-
-Hierbei ist es wichtig, dass die Sterne richtig in den Baum eingefügt wurden,
-d.h.: Die eigentlichen Sterne müssen in den Blättern liegen. Um dies zu
-erreichen, müssen die Sterne beim einfügen immer in der Blätter verschoben
-werden.
 
 \begin{figure}
-\subfigure[Anfangszustand. Der Stern B soll in den Baum, indem sich bereits A befindet, eingefügt werden.]{
+\subfloat[Anfangszustand. Der Stern B soll in den Baum, indem sich bereits A befindet, eingefügt werden.]{
     \begin{forest}
         for tree={circle,draw, s sep+=0.25em}
         [,phantom
             [B]
             [
                 A
-                []
-                []
-                []
             ]
         ]
     \end{forest}
 }
-\quad
-\subfigure[Stern B kann nicht eingefügt werden, da der Slot durch A belegt ist, also wird A weiter in den Baum versickert.]{
+\;
+\subfloat[Stern B kann nicht eingefügt werden, da der Slot durch A belegt ist, also wird A weiter in den Baum versickert.]{
     \begin{forest}
         for tree={circle,draw, s sep+=0.25em}
         [,phantom
             [B]
             [
-                [A
-                    []
-                    []
-                    []
-                ]
+                [A]
+                []
                 []
                 []
             ]
         ]
     \end{forest}
 }
-\quad
-\subfigure[B wird nun eingefügt, da sich B jedoch nicht in einem Blatt befinden, muss B weiter versickert werden.]{
+\;
+\subfloat[B wird nun eingefügt, da sich B jedoch nicht in einem Blatt befinden, muss B weiter versickert werden.]{
     \begin{forest}
         for tree={circle,draw, s sep+=0.25em}
         [,phantom
             [B
-                [A
-                    []
-                    []
-                    []
-                ]
+                [A]
+                []
                 []
                 []
             ]
         ]
     \end{forest}\quad\\[2ex]
 }
-\quad
-\subfigure[Damit B versickert werden kann, wird der Platz der durch A besetzt wird freigemacht, indem A weiter versickert wird.]{
+\;
+\subfloat[Damit B versickert werden kann, wird der Platz der durch A besetzt wird freigemacht, indem A weiter versickert wird.]{
     \begin{forest}
         for tree={circle,draw, s sep+=0.25em}
          [B
              [
-                 [A
-                     []
-                     []
-                     []
-                 ]
+                 [A]
+                 []
+                 []
                  []
-                 [
-                     []
-                     []
-                     []
-                 ]
              ]
              []
              []
+             []
          ]
     \end{forest}\quad
 }
-\quad
-\subfigure[B kann jetzt in den Baum versickert werden und ist nun ein Blatt.]{
+\;
+\subfloat[B kann jetzt in den Baum versickert werden und ist nun ein Blatt.]{
     \begin{forest}
         for tree={circle,draw, s sep+=0.25em}
          [
              [
-                 [A
-                     []
-                     []
-                     []
-                 ]
+                 [A]
+                 []
+                 [B]
                  []
-                 [B
-                     []
-                     []
-                     []
-                 ]
              ]
              []
              []
+             []
          ]
     \end{forest}\quad
 }
 
-\caption{Schrittweises einfügen des Sternes B in einen Baum, indem sich bereits ein Stern (A) befindet.} \label{fig:insertwithexisting}
+\caption{Schrittweises einfügen des Sternes B in einen Baum, indem sich bereits ein Stern (A) befindet.}
+\label{fig:insertwithexisting}
 \end{figure}
 
-\begin{lstlisting}
-if node.hasstar() {
-
-}
-\end{lstlisting}
-
-Wie in Abbildung \ref{fig:insertwithexisting} zu sehen ist, wird erst der
-bereits existierende Stern weiter in den Baum versickert, der Stern welcher
-eingefügt werden soll wird danach ebenfalls in den Baum Versickert bis er sich
-in einem der Blätter befindet.
-
-Die Koordinate des Massenmittelpunktes \( \varsigma \) des jeweiligen Knotens
-kann wie in Formel (\ref{eq:mean_mass}) beschrieben berechnet werden:
-
-\begin{equation} \label{eq:mean_mass}
-\varsigma = \left( \dfrac{ \displaystyle \sum_{i=0}^{n} x_i \cdot m_i }{
-\displaystyle \sum_{i=0}^{n} m_i } , \frac{ \displaystyle \sum_{i=0}^{n} y_i
-\cdot m_i }{ \displaystyle \sum_{i=0}^{n} m_i } \right)
-\end{equation}
-
-Es ist somit durch \( \theta \) eine End Bedingung gegeben, welche verhindert
-das zu weit in den Baum vorgedrungen wird und somit auch verhindert, dass
-Sterne die in einer zu großen Entfernung zu dem ursprungssten liegen und dicht
-genug grupiert sind zusammengefasst werden.
-
-\subsubsection{Implementierung des Quadtrees}
-Um generell irgendwas zu tun muss in fast allen fällen etwas definiert werden.
-Zur Simulation von Galaxien brauchen wir vor allem eine Methode, Sterne
-einheitlich zu definieren. Der unten definierte Vec2-typ kann einen Vektor oder
-eine Koordinate darstellen was ihn in der Anwendung zu einem praktischen
-Hilfsmittel macht.  Er speichert die X und Y Komponente der jeweiligen Struktur
-die er darstellen soll als float64-typ.
-
-\begin{lstlisting}
-type Vec struct {
-        X               float64
-        Y               float64
-        Z               float64
-}
-
-method (Vec2) insert() {...}
-method (Vec2) insideOf() bool {...}
-func newVec2() Vec2 {...}
-\end{lstlisting}
-
-Mithilfe des Vec2-typens kann ein Kompletter Stern definiert werden. Dabei wird
-ein Stern mithilfe seine Position \( C \), seiner Geschwindigkeit \( V \), und
-seiner Masse \( M \) beschrieben.
-
-\begin{lstlisting}
-type Star struct {
-        C               Vec
-        V               Vec
-        Mass            float64
-}
-
-method (Vec2) insideOf() bool {...}
-\end{lstlisting}
-
-Um einen sogennanten quadtree bzw. octree aufzubauen wird erstmal eine
-Räumliche Begrenzung benötigt, die einem Raum beschriebt indem die Sterne
-enthalten sind oder nicht.  Diese grenze ist als `Boundary` definiert, es wird
-dabei der Mittelpunkt der Begrenzung und die kürzeste Entfernung zwischen
-mittelpunkt und äußerer Begrenzung genutzt um den Raum zu definieren.
-
-\begin{lstlisting}
-type Boundary struct {
-        Center          Vec
-        HalfDimension   float64
-}
-
-function newBoundary() {...}
-\end{lstlisting}
-
-Der eigentliche QuadTree bzw. Octree beinhaltet einige Informationen: Die
-Anzahl in ihm enthaltene Sterne, die Räumliche Ausbereitung, die eigentlichen
-Sterne als Star2D definiert und die Rekursionstiefe als integer. Die Definition
-des Quadtrees der Unten zu sehen ist enthält Zeiger zu den Kindern des
-Quadtrees und ist somit rekursiv definiert was es einfach macht neue Kinder zu
-erstellen, da diese eine Kopie ihre Eltern mit einer anderen Begrenzung
-darstellen wodurch die in ihnen enthaltenen Sterne weniger werden.
-
-\begin{lstlisting}
-type QuadTree struct {
-        StarCount       int
-        Boundary        Boundary
-        Star            []Vec2
-
-        NorthWest       *QuadTree
-        NorthEast       *QuadTree
-        SouthWest       *QuadTree
-        SouthEast       *QuadTree
-
-        ReccursionDepth int
-}
-method (QuadTree) insert(Star) bool {...}
-method (QuadTree) subdivide() {...}
-\end{lstlisting}
-
-\subsubsection{Benchmarking}
-
-Um den Geschwindigkeit Vorteil darzustellen, kann die Kraft zwischen \(n\)
-homogen verteilten Sternen berechnet werden. Einmal mit der Brute-Force Methode
-und einmal mit der im Barnes-Hut Algorithmus beschriebenen Methode.
-
-\subsubsection{Runge-Kutta Methoden}
-Die Runge-Kutta Methode wird genutzt, um die Position eines Objektes nach einer
-Beliebigen Zeit zu approximieren. Dabei kann, bei Nutzung eines möglich kleinen
-Zeit Schrittes, ein sehr genaues Ergebnis erzielt werden.  In unserem Fall
-haben wir einen Stern auf den eine Kraft wirkt. Wir wollen die Position des
-Sterns nach einem Zeit schritt berechnen, jedoch auch eine andere Kraft mit
-einbringen um die Sterne auf eine Elliptische Bahn um die Mitte der Galaxie zu
-bringen.  Die Geschwindigkeit die der Stern dabei annimmt kann mit der
-folgenden Formel berechnet werden:
-
-\begin{equation}
-    v = \sqrt{ar}
-\end{equation}
-
-\subsubsection{Goroutines}
-Die Nutzung von mehreren sogenannten Go-Methoden ist unglaublich effektiv, da
-es die Zeit die gebraucht wird das Programm auszuführen drastisch verringert.
-Die Implementation ist ebenfalls unglaublich einfach, es recht
-
-\subsection{Netzwerk}
-
-Damit das Projekt so gut wie möglich skaliert, wird die Anwendung in mehrere
-kleine Dienste aufgeteilt die jeweils eine Funktion übernehmen und
-untereinander kommunizieren. Dabei läuft jede Anwendung in einem eigenen
-Container (siehe \ref{subsubsec:Docker}) und kann somit in falle eines
-Nadelöhrs mehrfach gestartet werden und über einen Reverse-http-Proxy (siehe
-\ref{subsubsec:Traefik}) mit Daten versorgt werden.
-
-\subsubsection{Die verschiedenen Dienste}
-Um die Generierung der Punkt Wolken und die anschließende Simulation der Wolke
-in einzelne Micro Services aufzuspalten muss erstmal definiert werden für welche
-Dienste es überhaupt Sinn macht sie in einzelne Instanzen abhängig bzw.
-unabhängig von einander agieren.
-
-\subsubsection{Docker} \label{subsubsec:Docker}
-\begin{quote}
-\begin{minipage}{\linewidth}
-\stepcounter{footnote}
-\renewcommand\thempfootnote{\arabic{footnote}}
-``Docker vereinfacht die Bereitstellung von Anwendungen, weil sich Container,
-die alle nötigen Pakete enthalten, leicht als Dateien transportieren und
-installieren lassen. Container gewährleisten die Trennung und Verwaltung der
-auf einem Rechner genutzten Ressourcen. Das beinhaltet laut Aussage der
-Entwickler: Code, Laufzeit Modul, System Werkzeuge, Systembibliotheken – alles
-was auf einem Rechner installiert werden kann.``~\footnote{\url{https://de.wikipedia.org/wiki/Docker_(Software)}}
-\end{minipage}
-\end{quote}
+\subsection{Datenbanken}
+
+\subsubsection{Speichern der Sterne}
+
+Die Sterne werden in einer Tabelle in Datenbank \mbox{PostgreSQL} gespeichert.
+Die Tabelle ist folgendermaßen aufgebaut:
+
+\begin{figure}[h!]
+\centering
+\begin{tabular} {l | l | l | l | l | l}
+star\_id & \(x\) & \(y\) & \(vx\) & \(vy\) & \(m\) \\ \hline\hline
+1        & -300 & 300 & 0  & 0  & 1000 \\ \hline
+2        & -200 & -200 & 0  & 0  & 1000 \\ \hline
+\dots   & \dots & \dots & \dots & \dots & \dots \\ \hline
+n       & \(x_n\) & \(y_n\) & \(vx_n\)& \(vy_n\) & \(m_n\) \\ \hline
+\end{tabular}
+\caption{Darstellung der Tabelle in der die Sterne gespeichert werden. Die
+star\_id spalte beinhaltet eine global einmalige ID wodurch jeder Stern
+identifiziert werden kann.}
+\end{figure}
 
-\subsubsection{Docker-compose}
-Damit nicht alle Container per Hand auf jedem System gestartet werden müssen
-wird eine sogenannte Docker-compose Datei erstellt, diese ermöglicht es einem
-die komplette Docker Konfiguration in einer Datei zu bündeln und somit auch die
-jeweiligen Netzwerke einfacher zu konfigurieren.
+Dadurch das jeder Stern eine einmalige ID besitzt kann diese verwendet werden
+um einfach auf Sterne zu verweisen. Dies ist im Kontext des Einfügens sehr
+hilfreich da die Verschiebung eines Sternes durch ändern der Stern-ID vollzogen
+werden kann.
+
+\subsubsection{Speichern von Bäumen}
+
+Um die Bäume in einer Datenbank zu speichern muss eine einheitliche Struktur
+definiert werden um Probleme in der Zukunft zu verhindern. Die Nutzung von
+speziellen Graphen Datenbanken bietet sich natürlich an, jedoch wird diese
+starke Spezialisierung schnell zu einem Hindernis. Um nach dem KISS
+Prinzip\footnote{"Das KISS-Prinzip (englisch Keep it simple, stupid) fordert,
+zu einem Problem eine möglichst einfache Lösung anzustreben."
+\url{https://de.wikipedia.org/wiki/KISS-Prinzip}} eine möglichst einfache
+Lösung zu nutzen werden die Bäume in einer Relationalen Datenbank gespeichert.
+Jeder Knoten wird dabei in einer Zeile der Datenbank gespeichert und erhält
+eine global einzigartige ID. Die Kinder in andrem Knoten hängen werden anhand
+ihrer ID in der Zeile gespeichert sodass es einfach möglich ist einfach auf
+diese zuzugreifen und beim rekursiven durchsuchen des Baumes auf diese
+zuzugreifen.
+
+
+\begin{figure*}[ht]
+\begin{tabular} {l | l | l | l | l | l | l | l | l | l}
+node\_id & box\_width & total\_mass & depth & star\_id & root\_id & isleaf & box\_center & center\_of\_mass & subnodes  \\ 
+bigint & numeric & numeric & numeric & bigint & bigint & boolean & numeric[] & numeric[] & numeric[]  \\ \hline\hline
+2921847 & 1000 & 2000 & 0 & 0 & 1 & False & \{0, 0\}       & \{0, 0\}       & \{ \(\dots\) \}  \\ \hline
+2921848 & 500  & 1000 & 1 & 1 & 1 & True  & \{-500, 500\}  & \{-300, 300\}  & \{ \(\dots\) \}  \\ \hline
+2921849 & 500  & 0    & 1 & 0 & 1 & True  & \{500, 500\}   & \{0, 0\}       & \{ \(\dots\) \}  \\ \hline
+2921850 & 500  & 1000 & 1 & 2 & 1 & True  & \{-500, -500\} & \{-200, -200\} & \{ \(\dots\) \}  \\ \hline
+2921851 & 500  & 0    & 1 & 0 & 1 & True  & \{500, -500\}  & \{0, 0\}       & \{ \(\dots\) \}  \\ \hline
+\end{tabular}
+\caption{Darstellung der Tabelle in der ein Baum definiert ist }
+\end{figure*}
 
-\subsubsection{Traefik} \label{subsubsec:Traefik}
-\subsubsection{Kubernetes}
-\subsubsection{Grafana}