自动图形布局弹簧理论

时间:2009-08-25 04:06:29

标签: silverlight graph graph-theory

我正试图将实体视觉化,以显示彼此之间的关系。它看起来像自动图形布局,弹簧算法将满足我的需要。我想使用c#在silverlight中实现它,所以我正在寻找代码示例,或者链接到理论的良好解释。任何帮助表示赞赏

2 个答案:

答案 0 :(得分: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;
        }

根据您希望图表收敛的速度选择两个常量。我用过这些:

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

该代码非常明显,但随时可以询问您是否需要任何内容​​。基本上,在循环中调用UpdateNodes()函数,您的图形将收敛于其最小能量状态。

答案 1 :(得分:1)

我没有使用过任何这些例子,但我相信它们会对你有用。

此处还有一个类似的(重复?)问题:Graph visualisation in Silverlight