1

我创建了一个 java 程序,它从 1 个顶点开始,然后从那里每个周期添加一个顶点和 2 条边。它使用静态布局

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

这听起来很不专业,但图表看起来不够随机,基本上我的意思是,每次运行时,它们似乎总是在边缘周围聚集很多图表,而很少有人到达中心附近。我的程序通常使用 100 个生成的顶点,我最终会在中心有六个顶点,而其他顶点则在边缘。

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

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

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

随机示例

下面是小程序的相关代码。涉及其设置。

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);
    }
}
4

2 回答 2

1

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

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


编辑

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

FRLayout 是一个力导向的布局,它将根据图形的拓扑重新定位顶点。

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

于 2013-10-31T16:10:01.533 回答
1

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

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

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

Layout<Number, Number> staticLayout = new StaticLayout(Number, Number>(g);
于 2013-10-31T17:37:49.087 回答