Wenn Sie den Baum mit minimalem Platzverschwendung und kurzen Verbindungen zeichnen möchten, dann steht Ihnen eine rechnerisch aufwendige Lösung bevor. Es wird schwierig sein, dies in Echtzeit bei einem Baum von anständiger Größe zu erreichen, ganz zu schweigen davon, dass kleine Änderungen am Baum zu einem radikal anderen Gleichgewicht führen können.
Ein anderer Ansatz wäre, die physikalische Simulation aufzugeben und sie einfach iterativ aufzubauen. Ich habe letzte Woche etwas Ähnliches gemacht, aber meine Bäume sind wahrscheinlich bei weitem nicht so kompliziert wie Ihre.
Für dieses Baumlayout muss jedes Knotenobjekt einen Winkel und einen Offset speichern. Diese beiden Zahlen steuern, wo sie auf der Grafikfläche landen.
Hier ist mein Grundalgorithmus:
1) Gehen Sie über Ihre gesamten Baumdaten und finden Sie alle Blattknoten. 2) Während Sie dies tun, messen Sie die Länge jeder Verzweigung, damit Sie wissen, welche die längste ist. 3) Sobald Sie alle Blattknoten haben, verteilen Sie sie gleichmäßig über einen konzentrischen Kreis. Sie können entweder den gesamten Kreis verwenden oder nur einen Teil des Winkelbereichs. 4) Sobald alle Blattknoten gelöst sind, gehen Sie erneut über den Baum und gehen von außen nach innen vor. Jeder Knoten, auf den Sie treffen, der kein Blattknoten ist, benötigt ein Layout. Im Grunde genommen hat von hier an jeder Knoten einen Winkel, der der Durchschnitt aller seiner Kindknoten ist, und der Offset beträgt der graph_radius * (depth_of_node / maximum_depth)
Ich fand heraus, dass dies mir eine sehr ordentliche und menschenlesbare Verteilung bietet, wenn auch nicht sehr effizient in Bezug auf die Bildschirmnutzung. Ich habe eine Animation meiner Baumdarstellung hier hochgeladen: GIF-Animation