2009-08-25 8 views
6

私はエンティティをビジュアルに配置して、互いの関係を表示しようとしています。自動グラフレイアウトのように見えますが、春のアルゴリズムは私のニーズに合っています。私はこれをSilverlightでC#を使用して実装したいので、コードサンプルを探しています。または、理論の説明にリンクしています。何か助けていただきありがとうございます自動グラフレイアウトスプリング理論

答えて

6

は、私は、動的に実行するためにしばらく前にいくつかのコードを書きましたC#とXNAを使用したグラフレイアウト(要求に応じてフルソースが利用可能)。

 public void UpdateNodes() 
     { 
      for (int i = 0; i < nodes.Count; i++) 
      { 
       Vector2 netForce = Vector2.Zero; 
       foreach (Node otherNode in nodes) 
       { 
        if (otherNode != nodes[i]) 
        { 
         netForce += CoulombRepulsion(nodes[i], otherNode); //calculate repulsion for all nodes 
         if (nodes[i].links.Contains(otherNode)) 
         { 
          netForce += HookeAttraction(nodes[i], otherNode); //only calc attraction for linked nodes 
         } 
        } 
       } 
       nodes[i].Velocity += netForce; 
       nodes[i].Velocity *= .99f; 
       nodes[i].Position += nodes[i].Velocity; 
      } 
     } 


     public Vector2 HookeAttraction(Node node1, Node node2) //ON node1 BY node2 
     { 
      Vector2 direction = Vector2.Subtract(node2.Position, node1.Position); 
      direction.Normalize(); 

      return hookeConst* node2.Mass * Vector2.Distance(node1.Position, node2.Position) * direction; 
     } 

     public Vector2 GravAttraction(Node node1, Node node2) //ON node1 BY node2 
     { 
      Vector2 direction = Vector2.Subtract(node2.Position, node1.Position); 
      direction.Normalize(); 

      return gravConst * node2.Mass * Vector2.DistanceSquared(node1.Position, node2.Position) * direction; 
     } 

あなたはグラフが収束したいどのくらいの速に基づいて2つの定数を選択:

は、ここで重要な機能の一部です。私はこれらを使用しました:

 private const float hookeConst = .000005f; 
     private const float gravConst = .00000001f; 

このコードはかなりわかりやすいですが、何か必要があればお気軽にお問い合わせください。基本的に、UpdateNodes()関数をループで呼び出すと、グラフは最小エネルギー状態に収束します。

+0

ちょうど注記: "nodes [i] .Velocity * = .99f;"グラフをより簡単に収束させるための減衰定数です。その値を小さくして「弾力性」を低下させます。 –

+0

私はソースをしたいと思っています... [email protected] –

+0

確かに、ここは(zip形式のプロジェクトとして):http://staff.arson-media.com/preetum/uploads/springForceV0.zip 私はかなり前にこのコードを書きましたので、(更新ループに "mouseStuff"と記された領域のような)不必要に難読化された領域がいくつかあります。 しかし、すべての重要なコンポーネントが存在し、機能しています。 (マウスとのやりとりもあります) –