簡體   English   中英

隨機化頂點位置

[英]Randomizing Vertex Locations JUNG

我創建了一個Java程序,該程序以1個頂點開始,從那里開始,每個周期增加一個頂點和2條邊。 它使用靜態布局

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

這聽起來像是非技術性的,但是圖表看起來不夠隨機,基本上,我的意思是,每次運行時,它們似乎總是在整個邊緣聚集很多圖,而很少有人到達中心附近。 我的程序通常使用100個生成的verty,最終我會在中間放置六打,其余的都圍繞邊緣。

以下是我剛剛創建的一個隨機示例。

也許有人可以確認這實際上是隨機的,或者不是可以解決這個問題的方法,還是我設置了錯誤的方法。 我希望節點盡可能地隨機。

任何幫助,將不勝感激。 謝謝

隨機例子

以下是與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);
    }
}

我沒有得出關於它是否隨機的結論。 因此,當我創建每個頂點時,我決定使用layout.setLocation(v1, x, y)設置頂點的特定坐標,並使用math.random()將x和y乘以x的寬度和高度我的小程序

因此,我現在知道它是隨機的。


編輯

這實際上似乎可行,但是實際上卻沒有,我不得不刪除了FRLayout。 事實證明,由於算法的作用,FRLayout不允許您設置自己的位置。

FRLayout是一種受力控制的Layout,它將根據圖形的拓撲重新定位頂點。

因此,我因此將FRLayout更改為StaticLayout,刪除了一些僅適用於FRLayout的東西,並且現在可以正常使用。

圖不是隨機的原因可能是由於您將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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM