随机化顶点位置JUNG

时间:2013-10-31 14:28:54

标签: java graph jung

我创建了一个以1个顶点开头的java程序,并从那里每个循环添加一个顶点和2个边。它使用静态布局

Layout<Number, Number> staticLayout = new StaticLayout<Number, Number>(g, layout);
vv = new VisualizationViewer<Number, Number>(staticLayout, new Dimension(550, 550));

这听起来非常不合情理,但图表看起来并不是随机的,基本上我的意思是,每次它运行时,它们似乎总是聚集在一起在图表的边缘附近,而很少有人到达中心附近的任何地方。我的程序通常使用100个生成的顶点,我最终会在中心有六个,其他的都在边缘。

下面是我刚刚创建的随机示例。

也许如果有人可以确认这实际上是随机的,或者如果没有办法解决这个问题或者我设置了错误的话。因为我希望节点尽可能随机。

任何帮助将不胜感激。 感谢

Random Example

以下是applet的相关代码。涉及其设置。

public class AnimatingAddNodeDemo extends JApplet {

        //create a graph
        Graph<Number, Number> ig = Graphs.synchronizedUndirectedGraph(new UndirectedSparseMultigraph<Number, Number>());

        ObservableGraph<Number, Number> og = new ObservableGraph<Number, Number>(ig);
        og.addGraphEventListener(new GraphEventListener<Number, Number>() {

            public void handleGraphEvent(GraphEvent<Number, Number> evt) {
                //System.err.println("got " + evt);
            }
        });
        this.g = og;
        //create a graphdraw
        layout = new FRLayout<Number, Number>(g);
        layout.setSize(new Dimension(600, 600));
        setSize(700, 700);
        Relaxer relaxer = new VisRunner((IterativeContext) layout);
        relaxer.stop();
        relaxer.prerelax();

        Layout<Number, Number> staticLayout = new StaticLayout<Number, Number>(g, layout);
        vv = new VisualizationViewer<Number, Number>(staticLayout, new Dimension(550, 550));

        JRootPane rp = this.getRootPane();
        rp.putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE);

        getContentPane().setLayout(new BorderLayout());
    }

    Integer v_prev = null;

    public void process() {

        vv.getRenderContext().getPickedVertexState().clear();
        vv.getRenderContext().getPickedEdgeState().clear();
        try {
            if (g.getVertexCount() < 100) {
                //add a vertex

                Integer v1 = nodeCount;
                g.addVertex(v1);
                nodeCount++;
                System.out.println("adding vertex " + v1);
                vv.getRenderContext().getPickedVertexState().pick(v1, true);
                j.setText(myText);

                // wire it to some edges
                if (v_prev != null) {
                    Integer edge = edgeCount;
                    //vv.getRenderContext().getPickedEdgeState().pick(edge, true);

                    // let's connect to a random vertex, too!

                    int rand = (int) (Math.random() * (edgeCount-1)); // because there is a 0 node
                    while (v1.equals(rand)) {
                        System.out.println("avoided connecting to myself");
                        rand = (int) (Math.random() * (edgeCount-1)); // because there is a 0 node
                    }

                    edgeCount++;
                    g.addEdge(edge, rand, v1);  //add an edge called var1, between the nodes var2 and var3
                    vv.getRenderContext().getPickedEdgeState().pick(edge, true);
                    System.out.println("Adding edge " + edge + " between " + rand + " & " + v1 + "()");
                }

                v_prev = v1;
                layout.initialize();

                Relaxer relaxer = new VisRunner((IterativeContext) layout);
                relaxer.stop();
                relaxer.prerelax();
                vv.getRenderContext().getMultiLayerTransformer().setToIdentity();
                vv.repaint();

            } else {
                done = true;
            }

        } catch (Exception e) {
            System.out.println(e);
        }
    }


    public static void main(String[] args) {
        AnimatingAddNodeDemo and = new AnimatingAddNodeDemo();
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(and);

        and.init();
        and.start();
        frame.pack();
        //frame.setVisible(true);
    }
}

2 个答案:

答案 0 :(得分:1)

我没有得出关于它是否是随机的结论。因此,当我创建每个顶点时,我决定使用layout.setLocation(v1, x, y)设置顶点的特定坐标 使用math.random()制作x和y并将其乘以我的小程序的宽度和高度。

因此我现在知道它是随机的。


修改

这实际上似乎有效,但事实上并没有,我不得不删除FRLayout。 事实证明,由于算法的作用,FRLayout不会让你设置自己的位置。

  

FRLayout是一个强制定向的布局,用于重新定位顶点   根据图的拓扑结构。

所以我因此将FRLayout更改为StaticLayout,删除了一些仅适用于FRLayout的内容,现在它可以正常工作。

答案 1 :(得分:1)

您的图表不是随机的原因可能源于您将FRLayout传递给构造函数。

layout = new FRLayout<Number, Number>(g);
// ...
Layout<Number, Number> staticLayout = new StaticLayout<Number, Number>(g, layout);

您可以通过扩展AbstractLayout来制作自己的随机布局类。但是,根据JavaDoc,如果排除第二个构造函数参数,StaticLayout将随机布局节点。

Layout<Number, Number> staticLayout = new StaticLayout(Number, Number>(g);