Ein Weg, dies zu tun ist, ein Pseudo-Physik-Modell zu verwenden. Ihre Objekte haben eine abstoßende Kraft und eine anziehende Kraft, wenn sie befestigt sind.
Sie bewegen die Objekte entsprechend der Summe der auf sie angewendeten Kräfte: Berechnen Sie bei jedem Schritt die Summe der Kräfte, die auf ein Objekt wirken, und verschieben Sie es in Richtung der Kraft.
In Pseudo-Code, würde eine Iteration sein:
for each object o1
force[o1] = 0
for each object o2
if o1 and o2 are linked
force[o1] += attraction_force(o1, o2)
else
force[o1] += repulsion_force(o1, o2)
for each object o1
move(o1, force[o1])
Und die Iterationen stoppen, wenn die Objekte einen stabilen Zustand erreicht haben.
Sie werden wahrscheinlich mit verschiedenen Kraftgesetze experimentieren müssen. Insbesondere möchten Sie benachbarte Objekte schnell in ein Gleichgewicht bringen. Ich würde wieder in die Ferne mit einer Kraftintensität linear experimentiert (wie eine Feder) oder quadratisch (gravition/elektrische Anziehung)
Auch werden wahrscheinlich müssen Sie die Objekte bewegen zufällig Teile des Graphen von stucked verbleibenden zu verhindern. Die Menge der zufälligen Bewegung sollte für die ersten Iterationen groß sein und mit der Zeit abnehmen.
Ich möchte eine Feinheit hinzufügen, die über die bereits gemachten hinausgeht: Wenn Objekte verbunden sind, sollte die gegenseitige Anziehung in einem bestimmten Abstand voneinander stehen. Wenn sie näher kommen, sollten sie sich gegenseitig abstoßen. Natürlich könnte dieses Verhalten in die "attraction_force" -Funktion integriert und als negative Anziehung modelliert werden. Auf diese Weise sucht das verknüpfte Objekt einen bestimmten Standardabstand voneinander. – Ideogram