一部の状況では、同じグラフでレイアウトを連続して使用する必要が生じる場合があります。次に例を示します。
- 古くなったグラフを処理して、グラフを拡張する必要が生じた場合。 拡張されたグラフに対してレイアウトを実行した場合、元のグラフで既にレイアウトされていた部分を識別する必要が恐らく生じます。 レイアウトは、元のグラフのレイアウトと比較してあまり変更されません。
- 最初のレイアウトの結果、小さな欠陥がある描画が作成された場合。 このような欠陥を手動で解決し、2 回目のレイアウトを実行して描画をクリーンアップする必要が生じます。 2 回目のレイアウトでは恐らく、最初のレイアウト後に既に許容できたグラフの部分をあまり変更する必要はありません。
階層型レイアウトは通常、非インクリメンタル方式で動作します。
レイアウトを初めから実行し、すべてのノードを新しい位置に移動して、すべてのリンクを経路変更します。
ノードの以前の位置は、レイアウトの結果に影響を与えません。
そのため、少しの変更でも、次回のレイアウトに大きな影響が生じる可能性があります。
ただし、階層型レイアウトは、「あまり変更しない」インクリメンタルなレイアウト・シーケンスもサポートします。
元のグラフで既にレイアウトされていた部分をより簡単に識別できるように、ノードを以前の位置に近い場所に配置できます。
インクリメンタル・モードは、ノードの以前の位置を考慮します。
このモードでは、アルゴリズムは、後続のレイアウトで、レベルおよびレベル内のノードの相対順序を保持します。ノードの絶対位置を保持するわけではありませんが、ノードの座標を調べることで、以前のレイアウトの構造を検出しようとします。
例えば、2 つのノードが同じレベル内にある場合、インクリメンタル・レイアウトの後にもこの
2 つのノードは引き続き同じレベル内に配置されます。
あるノードが別のノードよりも高いレベルにある場合は、引き続き高いレベルに配置されます。
以下の図で、インクリメンタル・レイアウトと非インクリメンタル・レイアウトの差異を示します。

インクリメンタル・レイアウトおよび非インクリメンタル・レイアウト
インクリメンタル・モードはデフォルトでは使用不可です。
インクリメンタル・モードを使用可能にするには、以下のようにします。
setIncrementalModeのメソッドを使用します。
次に例を示します。
layout.setIncrementalMode(true);
インクリメンタル・モードのフェーズ
レイアウト・アルゴリズムは、以下のように、インクリメンタル・モードで描画を分析します。
- まず、ノードの座標から、どのノードが同じレベルに属する必要があるかを判別します。 例えば、方向選択が下向きの場合は、多数のノードが線に沿って配置されている垂直位置で水平基準線を検出しようとします。 水平基準線の間隔は指定されている垂直ノード・オフセットとほぼ同一の距離でなければならないため、 水平基準線の検出には、この垂直ノード・オフセットが役立ちます。 次の図を参照してください。
- 同じ基準線に触れるすべてのノードは、同じレベルに割り当てられます。
- ノードが基準線に触れる場所を分析して、各レベル内のノードの順序を判別します。 例えば、方向選択が下向きの場合は、ノードの X 座標から、ノードがレベル内でどのように順序付けられているかを判別します。
- 長いリンクが複数のレベルにまたがる場合は、アルゴリズムは長いリンクの形状を保持できます。 リンクがレベル基準線をまたぐポイントを判別します。 レベル内部に長いリンクの曲折点を作成します。 各レベル内の曲折点の順序を保持しようとします。 例えば、方向選択が下向きで長いリンクが右側の別のノードをバイパスする場合は、 インクリメンタル・レイアウトは、右側のノードをバイパスするリンクの同じような形状を検出しようとします。次の図を参照してください。
- 最後に、レイアウトは、レベルおよびレベル内の順序付けを考慮したノードの絶対位置を計算しようとします。 ノードの位置のバランスを取ろうとします。 ただし、各ノードを以前の位置の近くに配置しようともします。 完全なバランスを取るためにノードを元の位置から離れた場所に移動する必要が生じることがあるため、多くの場合、両方の基準はお互いに競合します。 階層型レイアウトには、両方の基準を満たすためのパラメーター化されたヒューリスティックが含まれています。
以下の図に、インクリメンタル・フェーズの結果を示します。

インクリメンタル・レイアウト・フェーズ
インクリメンタル・モードのエキスパート・パラメーター
インクリメンタル・モードの各フェーズをパラメーター化できます。
これらのレイアウト・パラメーターは、インクリメンタル・モードが使用可能になっている場合にのみ有効です。
長いリンク交差の最小化
インクリメンタル・レイアウトは、複数のレベルをまたぐ長いリンクの形状を保持しようとします。
これは、長いリンク間のリンク交差は解決されないということを意味します。長いリンクの交差が望ましくない場合は、長いリンクを初めから経路変更する方がよい場合があります。
以下の図に、4 つの階層ツリーを示します
(元のレイアウトは左上)。
右下には、長いリンクが経路変更された場合の結果が示されており、右上には、長いリンクの形状が保持された場合の結果が示されています。

インクリメンタル・レイアウト時の交差低減
長いリンクを初めから経路変更するには、長いリンクの交差低減メカニズムを使用可能にする必要があります。
setLongLinkCrossingReductionDuringIncrementalのメソッドを使用します。
次に例を示します。
layout.setLongLinkCrossingReductionDuringIncremental(true);
長いリンクの交差低減はリンクの形状のみを判別します。
レベル内のその他のノードの順序には影響しません。
すべてのリンク交差の最小化
オプションとして、各レベル内のすべてのノードに交差低減を適用できます。
この場合、インクリメンタル・レイアウトは、ノードの座標から、同じレベルに属しているノードを判別しますが、
リンク交差を回避するためにレベル内のノードを完全に再順序付けする場合があります。また、この場合、長いリンクも再順序付けします。
前図の左下に結果が示されています。
リンク交差を解決するために、ノード「F」、「G」、および「H」の順序が変更されていることに注意してください。
すべてのノードの交差低減を使用可能にするには、以下のようにします。
メソッド setCrossingReductionDuringIncremental を使用します。
layout.setCrossingReductionDuringIncremental(true);
絶対レベル位置決めの設定
インクリメンタル・レイアウトは、以前の位置に近い絶対位置にノードを配置しようとします。
レベル内のノードの相対順序が変更されていない場合でも、距離が離れているとユーザーにとって分かりにくくなる可能性があるため、
ノードの移動距離が大きくならないようにします。
ノードが以前の位置に近いままであれば、ダイアグラムのメンタル・マップをはるかに保持しやすくなります。
以下の図に、以前の位置を考慮した場合と考慮しない場合のノードの位置変更を示します。
元のグラフ (左上) のインクリメンタル・レイアウトの結果は右上のグラフで、
これは下のグラフよりも同じグラフとして認識しやすくなっています。
絶対レベル位置決め機能はデフォルトでは使用可能になっていますが、使用不可にすることができます。
絶対レベル位置決め機能を使用不可にするには、以下のようにします。
setIncrementalAbsoluteLevelPositioningのメソッドを使用します。
次に例を示します。
layout.setIncrementalAbsoluteLevelPositioning(false);
このステートメントにより、レイアウトはノードを以前の位置の近くに配置しようとしなくなります。
レイアウトのバランスが取れるようにノードを配置します。
ただし、このレイアウトは完全なバランスにするため、少数のノードをダイアグラムが認識できなくなるほど離れた場所に移動させる必要が生じる場合があります
(以下の図の下部を参照)。

インクリメンタル・レイアウト時の絶対位置決め
絶対レベル位置の範囲および傾向の設定
絶対レベル位置決めが使用可能になっている場合は、バランスの取れたレイアウトを作成するための美的基準と競合します。
ノードを以前の位置の近くにとどめる必要があるため、インクリメンタル・レイアウト後のダイアグラムは、不平衡で非対称なものになる可能性があります。
階層型レイアウト・アルゴリズムは、2
つのパラメーター (絶対レベル位置の範囲および傾向)
で影響を与えることができるヒューリスティックを使用します。
絶対レベル位置決め機能はデフォルトでは使用可能になっていますが、使用不可にすることができます。
絶対レベル位置決め機能を使用不可にするには、以下のようにします。
setIncrementalAbsoluteLevelPositionRangeのメソッドを使用します。
次に例を示します。
layout.setIncrementalAbsoluteLevelPositionRange(100);
このステートメントは、ノードの旧位置から
100 座標単位の範囲内では、配置でバランスを唯一の基準にするように指定します。
これは、最適な位置と以前の位置との距離が
100 座標単位未満のノードは、その最適な位置にそのまま配置されることを意味します。
最適な位置がこの距離よりも離れているノードは、以前の位置と最適な位置との間の位置に配置されます。
以下の図の右側を参照してください。
絶対レベル位置の傾向を設定するには、以下のようにします。
setIncrementalAbsoluteLevelPositionTendencyのメソッドを使用します。
次に例を示します。
layout.setIncrementalAbsoluteLevelPositionTendency(70);
このステートメントは、ノードの最適な位置が以前の距離から遠い場合に、
その位置が、以前の位置から
70%、最適な位置から
30 % の割合で影響を受けることを指定します。
ノードを以前の位置に引っ張ろうとする輪ゴムと、同じノードを最適にバランスが取れた位置に引っ張ろうとするもう
1 つの輪ゴムを考えてみてください。
レベル位置の傾向
70
は、1 つの輪ゴムが以前の位置に向かって
70 % の力で引っ張り、
もう 1 つの輪ゴムが最適な位置に向かって
30% の力で引っ張ることを意味します。
傾向を大きくすると、ノードは旧位置に近づき、傾向を小さくするとノードは最適な位置に近づきます。
傾向を 0% に設定すると、インクリメンタル絶対レベル位置決めを使用不可にした場合と同じ効果になります
(以下の図を参照)。
インクリメンタル・レイアウト時の絶対位置決め
インクリメンタル・レイアウトでのノードのマーク付け
インクリメンタル・レイアウトは通常、描画のすべてのノードおよびリンクを同じように処理します。
ただし、ノードおよびリンクを描画にプログラムで追加していて、新しいノードおよびリンクがまだ適切な座標に配置されていない場合があります。例えば、それらをすべて原点
(0, 0) やランダムな座標に配置している場合です。
この場合、新しいノードの座標を無視する一方で、以前にレイアウトされているすべてのノードの座標を考慮するインクリメンタル・レイアウトが必要になります。
階層型レイアウトのインクリメンタル・モードでは、以下のメソッドを使用することで、インクリメンタル方式でレイアウトできないノードを指定できます。
layout.markForIncremental(nodeOrLink);
このステートメントを呼び出すと、ノードまたはリンクには、次回のインクリメンタル・レイアウトでその座標を無視するようにマークが付けられます。
マークが付けられたノードおよびリンクの位置は初めから計算されます。
マークは次回のレイアウトまでのみ有効で、その後は自動的に削除されます。