Inkrementeller Modus mit dem hierarchischen Layout

In manchen Situationen müssen Sie möglicherweise eine Folge von Layouts auf denselben Graphen anwenden. Beispiel:
  • Sie arbeiten mit Graphen, die veraltet sind, und müssen den Graphen erweitern. Wenn Sie ein Layout für den erweiterten Graphen ausführen, möchten Sie wahrscheinlich die Teile identifizieren, die bereits im ursprünglichen Graphen angelegt wurden. Das Layout soll sich im Vergleich mit dem Layout des ursprünglichen Graphen nicht viel verändern.
  • Das erste Layout führt zu einer Zeichnung mit geringfügigen Mängeln. Sie möchten diese Mängel manuell beheben und ein zweites Layout ausführen, um die Zeichnung zu bereinigen. Das zweite Layout soll wahrscheinlich die Teile des Graphen, die bereits nach dem ersten Layout akzeptabel waren, nicht großartig verändern.
Das hierarchische Layout arbeitet normalerweise inkrementell. Es erstellt ein ganz neues Layout und verschiebt alle Knoten an die neuen Positionen und leitet alle Links um. Die vorherigen Positionen der Knoten haben keinen Einfluss auf das Ergebnis des Layouts. Somit kann auch eine geringfügige Änderung einen großen Effekt auf das nächste Layout haben.
Das hierarchische Layout unterstützt aber auch inkrementelle Folgen von Layouts, die "sich nicht wesentlich ändern". Es kann die Knoten nah an ihren vorherigen Positionen platzieren, so dass Sie die Teile, die bereits im ursprünglichen Graphen angelegt wurden, einfacher identifizieren können. Im inkrementellen Modus werden die vorherigen Positionen der Knoten berücksichtigt. In diesem Modus behält der Algorithmus die relative Reihenfolge der Ebenen und der Knoten innerhalb der Ebenen im nachfolgenden Layout bei. Er behält nicht die absoluten Positionen der Knoten bei, versucht aber, die Struktur des vorherigen Layouts durch Überprüfung der Knotenkoordinaten zu erkennen. Wenn sich beispielsweise zwei Knoten auf derselben Ebene befinden, bleiben sie nach einem inkrementellen Layout auf derselben Ebene. Befindet sich ein Knoten auf einer höheren Ebene als ein anderer Knoten, bleibt er auf der höheren Ebene.
Die folgende Abbildung veranschaulicht den Unterschied zwischen einem inkrementellen und einem nicht inkrementellen Layout.
Abbildung hierarchischer Layouts, die den Effekt des inkrementellen Modus
veranschaulicht
Inkrementelles und nicht inkrementelles Layout
Der inkrementelle Modus ist standardmäßig inaktiviert.
Gehen Sie zum Aktivieren des inkrementellen Modus wie folgt vor:
Verwenden Sie die Methode setIncrementalMode. Beispiel:
layout.setIncrementalMode(true);

Phasen des inkrementellen Modus

Der Layoutalgorithmus analysiert die Zeichnung im inkrementellen Modus wie folgt:
  1. Zuerst bestimmt er anhand der Knotenkoordinaten, welche Knoten zu derselben Ebene gehören müssen. Wenn die Arbeitsrichtung beispielsweise nach unten verläuft, versucht er, horizontale Referenzlinien an den vertikalen Positionen zu erkennen, an denen viele Knoten entlang der Linie platziert sind. Das angegebene vertikale Knotenoffset hilft ihm, diese Linien zu erkennen, weil die horizontalen Referenzlinien ungefähr um das vertikale Knotenoffset entfernt liegen müssen. Sehen Sie sich die folgende Abbildung an.
  2. Alle Knoten, die dieselbe Referenzlinie berühren, sind derselben Ebene zugeordnet.
  3. Er bestimmt die Reihenfolge der Knoten innerhalb jeder Ebene, indem er ermittelt, wo der Knoten die Referenzlinie berührt. Wenn die Arbeitsrichtung beispielsweise nach unten verläuft, bestimmt er anhand der X-Koordinate der Knoten, wie sie innerhalb der Ebenen angeordnet sind.
  4. Wenn lange Links mehrere Ebenen umspannen, kann der Algorithmus die Form eines langen Links beibehalten. Er bestimmt den Punkt, an dem ein Link die Referenzlinie der Ebene kreuzt. Er erstellt einen Kurvenpunkt für den langen Link innerhalb der Ebene. Er versucht, die Reihenfolge der Kurvenpunkte in jeder Ebene beizubehalten. Wenn bei einer Arbeitsrichtung, die nach unten verläuft, ein langer Link beispielsweise einen anderen Knoten auf der rechten Seite umgeht, versucht das inkrementelle Layout, eine ähnlich Linkform zu finden, die den Knoten auf der rechten Seite umgeht. Sehen Sie sich die folgende Abbildung an.
  5. Abschließend versucht das Layout, die absoluten Positionen der Knoten zu berechnen, die die Ebenen und die Reihenfolge innerhalb der Ebenen berücksichtigen. Es wird versucht, die Knotenpositionen gleichmäßig zu verteilen. Es wird jedoch auch versucht, jeden Knoten nah an seiner vorherigen Position zu platzieren. Beide Kriterien stehen häufig in Konkurrenz zueinander, weil Knoten manchmal weit weg von ihren ursprünglichen Positionen verschoben werden müssen, um ein perfektes Gleichgewicht zu erhalten. Das hierarchische Layout enthält ein parametrisiertes heuristisches Verfahren, um beide Kriterien zu erfüllen.
Die folgende Abbildung zeigt das Ergebnis der inkrementellen Phasen.
Abbildung, die die
Layoutphasen im inkrementellen Modus veranschaulicht
Phasen des inkrementellen Layouts

Expertenparameter des inkrementellen Modus

Jede Phase des inkrementellen Modus kann parametrisiert werden. Diese Layoutparameter sind nur effektiv, wenn der inkrementelle Modus aktiviert ist.

Kreuzungen langer Links minimieren

Das inkrementelle Layout versucht, die Form langer Links, die mehrere Ebenen kreuzen, zu bewahren. Dies impliziert, dass Linkkreuzungen zwischen langen Links nicht aufgelöst werden. Wenn Kreuzungen langer Links nicht erwünscht sind, kann es besser sein, lange Links ganz von vorn umzuleiten. Die folgende Abbildung zeigt vier Hierarchiebäume, wobei sich das ursprüngliche Layout oben links befindet. Unten rechts sehen Sie das Ergebnis, wenn lange Links umgeleitet werden, und oben rechts sehen Sie das Ergebnis, wenn die Form langer Links beibehalten wird.
Abbildung hierarchischer Layouts, die
den Effekt des inkrementellen Modus mit Reduktion von Kreuzungen langer Links veranschaulicht
Reduktion von Kreuzungen bei inkrementellen Layouts
Damit lange Links ganz von von umgeleitet werden, müssen Sie den Mechanismus für die Reduktion von Kreuzungen für lange Links aktivieren:
Verwenden Sie die Methode setLongLinkCrossingReductionDuringIncremental. Beispiel:
layout.setLongLinkCrossingReductionDuringIncremental(true);
Der Mechanismus für die Reduktion von Kreuzungen langer Links bestimmt nur die Form der Links. Er hat keinen Einfluss auf die Reihenfolge der anderen Knoten innerhalb der Ebenen.

Kreuzungen aller Links minimieren

Optional können Sie einen Mechanismus für die Reduktion von Kreuzungen auf alle Knoten innerhalb einer Ebene anwenden. In diesem Fall bestimmt das inkrementelle Layout anhand der Knotenkoordinaten, welche Knoten zu derselben Ebene gehören, kann aber die Knoten innerhalb der Ebenen vollständig neu anordnen, um Linkkreuzungen zu verhindern. In diesem Fall werden auch die langen Links neu angeordnet. Das Ergebnis ist in der vorherigen Abbildung unten links gezeigt. Beachten Sie, dass sich die Reihenfolge der Knoten F, G und H geändert hat, um die Linkkreuzungen aufzuheben.
Gehen Sie wie folgt vor, um den Mechanismus für die Reduktion von Kreuzungen für alle Knoten zu aktivieren:
Verwenden Sie die Methode setCrossingReductionDuringIncremental:
layout.setCrossingReductionDuringIncremental(true);

Absolute Positionierung der Ebenen festlegen

Das inkrementelle Layout versucht, die Knoten an absoluten Positionen zu platzieren, die nah an den vorherigen Positionen liegen. Es wird versucht, Knoten weit weg zu verschieben, weil selbst bei unveränderter relativer Reihenfolge der Knoten innerhalb der Ebenen, große Abstände für Benutzer verwirrend sein können. Es ist viel einfacher, sich das Diagramm zu merken, wenn die Knoten nah an den vorherigen Positionen bleiben.
Die folgende Abbildung veranschaulicht die Neupositionierung von Knoten mit und ohne Berücksichtigung der vorherigen Knotenpositionen. Das inkrementelle Layout des ursprünglichen Graphen (oben links) ergibt den Graphen oben rechts, der einfacher als derselbe Graph wiederzuerkennen als der Graph, der unten gezeigt wird.
Das Merkmal für die absolute Ebenenpositionierung ist zwar standardmäßig aktiviert, kann aber inaktiviert werden.
Gehen Sie wie folgt vor, um das Merkmal für die absolute Ebenenpositionierung zu inaktivieren:
Verwenden Sie die Methode setIncrementalAbsoluteLevelPositioning. Beispiel:
layout.setIncrementalAbsoluteLevelPositioning(false);
Mit dieser Anweisung versucht das Layout nicht, die Knoten nah an den vorherigen Positionen zu platzieren. Es platziert die Knoten so, dass das Layout gleichmäßig ist. Um jedoch eine perfekte Gleichmäßigkeit zu erhalten, muss das Layout unter Umständen einige Knoten so weit weg bewegen, dass Sie das Diagramm nicht mehr erkennen (siehe die folgende Abbildung unten).
Abbildung
hierarchischer Layouts, die den Effekt des inkrementellen Modus mit absoluter Ebenenpositionierung veranschaulicht
Absolute Positionierung bei inkrementellen Layouts

Bereich und Tendenz für absolute Ebenenpositionierung festlegen

Wenn die absolute Ebenenpositionierung aktiviert ist, steht diese mit den ästhetischen Kriterien für das Erstellen eines gleichmäßigen Layouts in Konkurrenz. Da Knoten nah an ihren vorherigen Positionen bleiben müssen, kann das Diagramm nach einem inkrementellen Layout ungleichmäßig und unsymmetrisch erscheinen. Der Algorithmus für hierarchisches Layout verwendet ein heuristisches Verfahren, das Sie mit zwei Parametern beeinflussen können: dem Bereich und der Tendenz für die absolute Ebenenpositionierung.
Das Merkmal für die absolute Ebenenpositionierung ist zwar standardmäßig aktiviert, kann aber inaktiviert werden.
Gehen Sie wie folgt vor, um das Merkmal für die absolute Ebenenpositionierung zu inaktivieren:
Verwenden Sie die Methode setIncrementalAbsoluteLevelPositionRange. Beispiel:
layout.setIncrementalAbsoluteLevelPositionRange(100);
Diese Anweisung gibt an, dass im Bereich von 100 Koordinateneinheiten ab der alten Position des Knotens die Gleichmäßigkeit das einzige Kriterium für die Platzierung ist. Das bedeutet, dass ein Knoten, dessen optimale Position weniger als 100 Koordinateneinheiten von seiner vorherigen Position entfernt ist, exakt an seiner optimalen Position platziert wird. Knoten, deren optimale Position weiter weg ist, werden an einer Position platziert, die ein Kompromiss zwischen vorheriger Position und optimaler Position ist. Sehen Sie sich die folgende Abbildung rechts an.
Gehen Sie zum Festlegen der Tendenz für die absolute Ebenenpositionierung wie folgt vor:
Verwenden Sie die Methode setIncrementalAbsoluteLevelPositionTendency. Beispiel:
layout.setIncrementalAbsoluteLevelPositionTendency(70);
Diese Anweisung gibt an, dass in dem Fall, dass die optimale Position eines Knotens zu weit von der vorherigen Position entfernt ist, die Position des Knotens mit 70 % durch die vorherige Position und mit 30 % durch die optimale Position beeinflusst ist. Stellen Sie sich, eine dehnbare Linie vor, die versucht einen Knoten an seine vorherige Position zu ziehen, und eine andere dehnbare Linie, versucht, denselben Knoten an seine optimale Position im Bezug auf die Gleichmäßigkeit zu ziehen. Die Tendenz 70 für die Ebenenpositionierung bedeutet, dass eine dehnbare Linie mit 70 % der Kraft in Richtung der vorherigen Position zieht und die andere mit 30 % in Richtung der optimalen Position. Eine Erhöhung der Tendenz bedeutet, dass der Knoten näher an seiner alten Position bleibt, eine Verringerung, dass der Knoten näher an seine optimale Position verschoben wird. Wenn Sie die Tendenz auf 0 % setzen, hat dies denselben Effekt, als inaktivierten Sie die inkrementelle absolute Ebenenpositionierung (siehe die folgende Abbildung).
Abbildung
hierarchischer Layouts, die den Effekt des inkrementellen Modus mit Tendenz für die absolute Ebenenpositionierung veranschaulicht
Absolute Positionierung bei inkrementellen Layouts

Knoten für inkrementelles Layout markieren

Beim inkrementellen Layout werden normalerweise alle Knoten und Links der Zeichnung gleich behandelt. Sie haben der Zeichnung jedoch möglicherweise über das Programm Knoten und Links hinzugefügt, und die neuen Knoten und Links haben noch keine aussagefähigen Koordinaten. Vielleicht haben Sie sie alle am Ursprung (0,0) der an Zufallskoordinaten platziert. In diesem Fall benötigen Sie ein inkrementelles Layout, das die Koordinaten alle Knoten berücksichtigt, die bereits angelegt wurden, während die Koordinaten der neuen Knoten ignoriert werden.
Der inkrementelle Modus des hierarchischen Layouts ermöglicht Ihnen, mit der folgenden Methode die Knoten anzugeben, die nicht inkrementell angelegt werden können:
layout.markForIncremental(nodeOrLink);
Wenn Sie diese Anweisung aufrufen, wird der Knoten bzw. Link so markiert, dass seine Koordinaten beim nächsten inkrementellen Layout ignoriert werden. Die Positionen markierter Knoten und Links werden ganz neu berechnet. Die Markierung ist nur bis zum nächsten Layout gültig und wird danach automatisch entfernt.