2011-11-27 6 views
11

私は、C#で企業の構造ツリー(家系のような)を描く必要があります。すべての補助コードはそこにあります。それは色付けされ、インタラクティブで、派手です。唯一の問題は、実際に各ノードをどこに置くかを決めるアルゴリズムで、私に多くの悲しみを与えていることです。木を効率的に描画するためのアルゴリズムですか?

今のところ、ボックスのサイズは100x50です。特定のx、y座標のスタッフメンバーを表すStaffNodeというクラスがあります。

アルゴリズムでは、適切なxとyを使用してList<StaffNode>を作成するだけで済みます。

これは信じられないほどトリッキーです。

基本的に、アルゴリズムは企業構造に沿って再帰的です(ツリーに沿って左→右、上→下)。 2つのノードが互いに重なっていると明らかに悪いことです。

私はこのような何かを生み出す可能性があるいくつかのアルゴリズムを考えることができ

  * 
    o   O 
o o o o o  O 
o   O O O O O 
       O 

ツリーが非常に大きく、スペースが非常に限られているので、このようなものは、より良いでしょうに対し:

 * 
    o  O 
o o o o o O 
o  O O O O O 
      O 

これまでのようなツリーを描かなければならなかった人はいますか?もしあなたが私が持っている多くのハードルに出会ったと確信しています。任意のヒント?これまで私は一日を費やしてきました。

+0

を最適解を見つけることができませんできますか?それは、マイクロソフトのVisioや何かで行われるべきではない? – DrStrangeLove

+0

テトリスソルバーを取る... – Dialecticus

+0

@DrStrangeLoveいいえ、私はインタラクティブな視覚化を書いています。 – user1002358

答えて

12

ツリーを描画するためのアルゴリズムは数多くあり、それぞれツリーのさまざまな特性を示しています。階層を表示する場合は、this code for WPF that draws hierarchiesがあります。グラフや木を描く方法のより一般的な議論については、these lecture slidesを参照して検討することを検討してください。同様の素材をカバーするthese excellent slidesもあります。

希望すると便利です。

+2

それは絶対に完璧です!ちょうど私が必要なもの。これはReingold-Tilfordアルゴリズムを使用します。 – user1002358

+1

@ user1002358このコメントをいただきありがとうございます。私は、ここで挙げた答えからアルゴリズムを理解するのに困っていましたが、 "Reingold-Tilfordアルゴリズム"のグーグルでは私がより有用であると分かった[この質問](http://stackoverflow.com/q/13128750/302677)につながりました。私はまた、他の誰かが簡単な説明を探している場合に、アルゴリズム[ここ](http://rachel53461.wordpress.com/2014/04/20/algorithm-for-drawing-trees/)をコーディングするための手順を要約しました – Rachel

1

繰り返しアプローチを使用できます。上で使用した最初の例のようなものを使ってツリーをレイアウトします。次に、制約が違反していないことを確認しながら、ノードまたはサブツリーを互いにより近くに移動させます(たとえば、ノードは重複できず、子ノードは親ノードの下になければなりません)。

長所:

  • 単純なアルゴリズム。
  • 十分な解決策を得ます。
  • 変化するツリーに連続して適用できます。
  • 涼しく見せることができます。

短所:

  • 良く見えるように多くの反復が必要な場合があります。
  • あなたが何をすべきかをしようとしている(局所的な最大値に引っ掛かり)
+0

1回の繰り返しでこれを行うことができます。 –

+0

合意されていますが、単一パスアルゴリズムが多数のノードに対して計算的に実行不可能である場合には、反復最適化アプローチが有用な場合があります。 – geofftnz

関連する問題