2009-07-29 25 views
3

私はツリー構造でいくつかのデータを持っていますが、私はそれらをグラフィカルな方法で表現したいと思います。ルートノードはステージの真ん中にあり、子供たちは周囲の円で動いています。すべての子供のために、その親の周りに。 ノードを重複させたくないので、最適な方法でスペースを配置する方法が問題です。 多かれ少なかれalt text(Googleで見つけました)ツリー構造の円表示

このようなことを実現するためにはどのようなアルゴリズムが必要ですか?

答えて

2

をしようとしてradial layout 。この例は、あなたが望むものを正確に見ていませんが、必要なレイアウトです。また、そこには多くの研究論文があって、それがどのように行われているかについてのいくつかのアイデアがあります。がんばろう!

this paperを環状構造に拡張するのが簡単に分かります。

+1

彼は彼が探しているレイアウト(http://www.yworks.com/en/products_yed_about.html) –

1

グラフの平面表示を描画しようとしています。 Find some buzzwords and perhaps a resource here And in wikipedia

ああ、私は忘れてしまった:あなたがこの勢力とニュートンの方法行うことができます。 単にすべてのノードに反発の可能性を与えます。互いを押しのけるすべてのプロトンを作ります。エッジにニュートンスプリングの性質を与え、一緒に引っ張る力を発揮し、あなたはすべて設定されます。 そのような素晴らしいアニメーションを作成することもできます。 これはグラフの公式な描画方法ですが、名前はわかりません。

2

各ツリーノードが他のすべてのノード(親を除く)から可能な限り距離を保つようにシステムを設定することで、緊急の方法で実行できますが、それが維持しなければならない最小限の距離まで)。そのアルゴリズムを安定させるまで各ノードに対して繰り返し実行すると、記述したような配列になります。私はあなたにできる最適化がたくさんあると確信していますが、これが最も簡単なアプローチになると確信しています。 graphviz年代を見てみましょうそして、あなたはどのように行うのについてを気にしませんが、あなたは、データを視覚化しているだけのことをした場合...前までのすべてのレイアウトは非常に複雑になる計算する

+0

+1これは本質的に私が提案しようとしていたものです。 –

+0

これは役立つかもしれません:http://en.wikipedia.org/wiki/Force-based_algorithms –

1

最小の無駄なスペースと短い接続でツリーを描画したい場合は、計算コストの高いソリューションです。まともなサイズのツリー上でこれをリアルタイムにするのは難しいでしょう。ツリーに小さな変更を加えると根本的に異なる平衡が生じるかもしれません。

もう1つのアプローチは、物理シミュレーションを放棄し、反復的に構築することです。私は先週同様のことをしたことがありますが、私の木はおそらくあなたよりもはるかに少ないです。

このツリーレイアウトでは、各ノードオブジェクトに角度とオフセットを格納する必要があります。これらの2つの数字は、グラフィックサーフェス上のどこに終わるかを制御します。

1)あなたの全体の木のデータの上に再帰し、すべてのリーフノードを見つける:

は、ここに私の基本的なアルゴリズムです。 2)これをやっている間は、各分岐構造の長さを測定して、どれが最長かを知るようにしてください。 3)すべての葉ノードを取得したら、それらを同心円上に均等に分配します。サークル全体を使用することも、アングルドメインの一部だけを使用することもできます。 4)すべてのリーフノードが解決されたら、ツリーの上を外に出て、再び上に戻ります。葉ノードではない遭遇する各ノードはレイアウトを必要としています。本質的には、ここからのすべてのノードは、それがすべての子ノードの平均である角度を持ち、オフセットはgraph_radius *(depth_of_node/maximum_depth)です。

これは私が非常にまともで、画面の使用に関して非常に効率的ではありません。ツリーディスプレイのアニメーションをここにアップロードしました:GIF anim