私はエンティティをビジュアルに配置して、互いの関係を表示しようとしています。自動グラフレイアウトのように見えますが、春のアルゴリズムは私のニーズに合っています。私はこれをSilverlightでC#を使用して実装したいので、コードサンプルを探しています。または、理論の説明にリンクしています。何か助けていただきありがとうございます自動グラフレイアウトスプリング理論
6
A
答えて
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()関数をループで呼び出すと、グラフは最小エネルギー状態に収束します。
1
私はこれらの例を一切使用していませんが、私はあなたに役立つと思います。
- Silverlight diagramming with spring embedder layout [demo]
- Silverlight Bag of tricks
- A Silverlight graph visualizer (updated)
ここに似た(複製?)疑問もあります:Graph visualisation in Silverlight
関連する問題
- 1. テスト自動化の理論的フレームワーク
- 2. 自然な三元論理?
- 3. 自動型推論
- 4. 自動ログアウトは、非アクティブの15分(セッション経営管理論)
- 5. 論理名の列を自動検索できません。
- 6. 自動協会と集約経営管理論
- 7. 論理チェック後のリアクションで自動リフレッシュする方法
- 8. 文脈自由文法 - 計算理論
- 9. 述語論理の自然減算
- 10. ハンドルバーテンプレート内の論理論理
- 11. 自動議論の引数に
- 12. Java論理XOR( "^")と論理NOT( "!")
- 13. PHP動的ページ区切り論理エラー
- 14. python動的ファジー論理結合
- 15. ウィザードの論理的な動作
- 16. Lucene:論理和を論理和と論理和のみに変換する
- 17. 論理ANDステートメント
- 18. 理論コンピュータグラフィックス - レイキャスティングアルゴリズム
- 19. RXJava論理マップチェーン
- 20. ブール論理エラー
- 21. 論理式ルール
- 22. HashSet()論理エラー
- 23. ゲームデータベースの理論
- 24. バブルソート論理エラー?
- 25. ブール論理
- 26. 論理ブレークポイント
- 27. PHPコンテスト論理
- 28. Fortran - 論理インデックス
- 29. ||の論理エラーオペレーター?
- 30. 論理エラーゲームプログラム
ちょうど注記: "nodes [i] .Velocity * = .99f;"グラフをより簡単に収束させるための減衰定数です。その値を小さくして「弾力性」を低下させます。 –
私はソースをしたいと思っています... [email protected] –
確かに、ここは(zip形式のプロジェクトとして):http://staff.arson-media.com/preetum/uploads/springForceV0.zip 私はかなり前にこのコードを書きましたので、(更新ループに "mouseStuff"と記された領域のような)不必要に難読化された領域がいくつかあります。 しかし、すべての重要なコンポーネントが存在し、機能しています。 (マウスとのやりとりもあります) –