Jer*_*emy 6 silverlight graph-theory graph
我试图通过视觉定位实体来展示彼此之间的关系.看起来像自动图形布局,弹簧算法将满足我的需要.我想使用c#在silverlight中实现它,所以我正在寻找代码示例,或者链接到理论的良好解释.任何帮助赞赏
小智 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;
}
Run Code Online (Sandbox Code Playgroud)
根据您希望图表收敛的速度选择两个常量.我用过这些:
private const float hookeConst = .000005f;
private const float gravConst = .00000001f;
Run Code Online (Sandbox Code Playgroud)
该代码非常明显,但随时可以询问您是否需要任何内容.基本上,在循环中调用UpdateNodes()函数,您的图形将收敛于其最小能量状态.