2013-10-31 85 views
1

我創建了一個java程序,該程序以1個頂點開始,從那裏它每個週期添加一個頂點和2個邊。它採用靜態佈局隨機化頂點位置JUNG

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

這是要健全非常聯合國的技術,而圖形只是看起來不足夠的隨機,基本上是什麼意思呢,就是每次被運行時,他們似乎總是在圖的邊緣周圍聚集很多,而很少到達中心附近的任何地方。我的程序通常使用100個生成的頂點,我將在中心結束半打,其他所有結點都在邊緣。

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

也許如果有人能確認這實際上是隨機的,或者如果沒有辦法解決這個問題,或者如果我設置了錯誤的東西。因爲我希望節點儘可能隨機。

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

Random Example

下面是相關代碼的小程序。涉及其成立。

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); 
    } 
} 
+0

我走在黑暗中拍攝,但看起來你是通過你的'StaticLayout'的'FRLayout'(Fruchterman-萊因戈爾德)。您的屏幕截圖是大多數FRLayout尺寸太小時的樣子。節點靠在佈局的牆上。我猜JUNG在'StaticLayout'類中使用'FRLayout'作爲變換器。 – sdasdadas

回答

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); 
+1

我最終將佈局更改爲靜態,即layout = new StaticLayout (g),而不是刪除第二個構造函數參數,但這非常感謝。 – AlexioHill

+0

@AlexioHill我很高興它的工作。看起來你只是通過'new StaticLayout (g)'而不是'new StaticLayout (g,layout)'來移除第二個構造函數參數。 – sdasdadas

1

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

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


編輯

這實際上似乎工作,但它實際上並沒有,我不得不刪除FRLayout。 事實證明,FRLayout不會讓你設置自己的位置,因爲算法的作用。

FRLayout是一個力導向佈局,將根據圖形拓撲重新定位頂點 。

因此,我將FRLayout更改爲StaticLayout,刪除了一些僅適用於FRLayout的工作,現在它可以正常工作。