LayoutFlow について

グラフ描画アルゴリズム一式

LayoutFlowは4つのレイアウトコンポーネントのコレクションであり、概観を定めるいくつかのルールに従って、グラフあるいはフローチャートを自動的に表示します。そこに組み込まれるコンポーネントは、HFlow(階層)、SFlow(対称)、TFlow(ツリー)、OFlow(直交)となります。これらのコントロールは、AddFlowの拡張版です。それぞれのコントロールが、AddFlowコントロールを含むフォーム上で、その頂点(ノードとも呼ばれる)とエッジ(リンクとも呼ばれる)の、自動的なグラフレイアウトを実現します。

LayoutFlowは、以下の4つのコンポーネントのセットになります。

  • HFlow(階層的なレイアウト)
  • OFlow(直交的なレイアウト)
  • SFlow(symmetric force directed layout)
  • TFlow(ツリーおよび放射状のレイアウト)

それぞれの製品に関するデモンストレーションは、AddFlowを用いて実現されるLayoutDemoサンプルで提供されています。

HFlowおよび、OFlow、SFlowとTFlowは、AddFlowの拡張版であり、使用するためにはAddFlowが必要となります。一般的には、それぞれのノードに対して最初に、任意あるいは(0,0)ポジションを与え、また、AddFlowAPIを用いることでAddFlow内にノードとリンクが作成されます。続いて、選択したグラフレイアウトコントロールの、レイアウトメソッドをコールします。このメソッドは、選択されたコントロール(HFlowによる階層や、SFlowによる対称、OFlowによる直交など)に依存する一定の外観に従うことで、AddFlowコントロール内のノードとリンクを合理的な手法により配置します。

AddFlowコントロールの頂点とエッジだけが、このレイアウトに関係しています。それにより、ユーザーは重要な頂点に対してのみ、レイアウトを適用することが可能になります。たとえば、そのLogicalプロパティをfalseに設定することで、ラベルを表示するために使われるノードを除外することが可能になります。

1) HFlow

HFlowレイアウトアルゴリズムは、水平な階層で頂点を調整するためのものです。 その頂点の並びは、交差点の数が小さくなるように選択されます。HFlowによるソリューションは、最適を目指すものではなく、まさに合理性を考えたものとなります。

2) OFlow

OFlowレイアウトアルゴリズムは、グラフ上で直交するレイアウトを実現します。このレイアウトが直交となる理由は、それぞれのエッジが水平と垂直に交互に接続する多角形として描画する場合に、直交の描画が生成されるためです。OFlowは、グラフ間の接続の有無にかかわらず機能します。描画の結果として、最大で4度以内のグラフになる場合には、それぞれのノードが同じ大きさを持つことになります。もしノードの角度が4度以上なら、ノードの高さは拡大されることになります。

3) SFlow

SFlowレイアウトアルゴリズムは、グラフ上で対称的なレイアウトを実現します。対称的なレイアウトは、正確な対称を生み出しますが、特に、エッジの方向が重要ではない無向性のグラフにとって有効なものになります。多くの場合において、結果として生じるレイアウトは良好です。 しかし、膨大な計算上のリソースが必要とされるため、小さいグラフ(300以下のノード数)に対して使用すべきです。アニメーションモードを使うことで、SFlowの機能する様子を確認できます。

4) TFlow

TFlowレイアウトのアルゴリズムは、グラフ上でツリーレイアウトを実現します。ツリーレイアウトは、ルーティングされたツリーである、グラフ内の特定のサブセットだけに適用されます。このようなグラフにおいて、複数の親を持つ頂点はありません。ツリーの描画は、一定の美観を満たす一方で、ごく限られた領域だけしか占有しません。

DrawingStyleプロパティの値が「Layered」なら:

  • ツリー上の同じレベルの頂点は、同一線上に配置されます。
  • 親ノードは、その子供たちの中心に配置されます。

DrawingStyleプロパティの値が「Radial」なら:

  • ルートは、もとの位置に配置されます。
  • 階層は、元の位置を中心とした同心円で配置されます。