2013-10-31 5 views
1

1 개의 정점으로 시작하는 자바 프로그램을 만들었습니다. 거기에서 하나의 정점과 2 개의 정점을 사이클마다 추가합니다. 내가이 뜻 그것은 정적 레이아웃정점 위치 무작위 화 JUNG

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

이 매우 해제 기술 소리 것입니다,하지만 그래프는 충분히 무작위 보이지 않는를 사용, 기본적으로는 실행됩니다 때마다 그들은 항상 보이는 것입니다 그래프의 가장자리를 중심으로 무리를 지어 배치하는 반면, 중심 근처에서는 거의 얻을 수 없습니다. 내 프로그램은 일반적으로 100 개의 생성 된 vertie를 사용하며 중심부에서 6 개, 다른 모든 가장자리에서 끝납니다.

다음은 방금 만든 무작위 예제입니다.

아마 누군가가 이것이 실제로 무작위인지 또는이 문제를 해결할 수있는 방법이 있는지 또는 내가 잘못 설정 한 것이 있는지를 확인할 수 있다면. 가능한 한 무작위로 노드를 갖고 싶습니다.

도움을 주시면 감사하겠습니다. 감사

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-Reingold)을 통과하는 것처럼 보인다. 스크린 샷은 크기가 너무 작 으면 대부분의'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

두 번째 생성자 인수를 제거하는 대신 레이아웃을 static = layout = new StaticLayout (g)로 변경했지만 결과적으로 많은 도움이되었습니다. – AlexioHill

+0

@AlexioHeill이 효과가있어 기쁩니다. 'new StaticLayout (g, layout)'와 반대로 단순히 'new StaticLayout (g)'를 수행하여 두 번째 생성자 인수를 제거한 것처럼 보입니다. – sdasdadas

1

나는 그것이 무작위인지 여부에 대한 결론에 도달하지 못했습니다. 그래서 각 정점을 만들 때 대신 정점의 특정 좌표를 설정하기로 결정했습니다. layout.setLocation(v1, x, y) math.random()을 사용하여 x와 y를 만들고이를 애플릿의 너비와 높이로 곱하면됩니다.

따라서 나는 그것이 무작위 적이라는 것을 알고 있습니다.


편집

이 실제로 작동하는 듯하지만 실제로, 나는 FRLayout을 제거해야하지 않았다. FRLayout은 알고리즘의 기능으로 인해 자신의 위치를 ​​설정할 수 없습니다.

FRLayout은 그래프의 토폴로지에 따라 버텍스를 위치로 재배치하는 강제 지정 레이아웃입니다.

따라서 FRLayout을 StaticLayout으로 변경하고 FRLayout에서만 작동하는 몇 가지 사항을 제거하면 올바르게 작동합니다.