2013-08-20 5 views
-2

그래프를 관리하기 위해 JUNG 자바 라이브러리를 사용하고 연결된 컴포넌트를 구별하기 위해 같은 색상으로 연결된 노드를 색칠하는 방법을 알고 싶습니다. (라이브러리 JUNG 그래프 사용하기

0 0 0 0 
0 0 1 1 
0 1 0 1 
0 1 1 0 

코드의 그래프를 작성하는 노드 :

예를 들어, I는 인접 행렬 인 것을 알고, 다른 색상을 가지고 동일한 컬러와 노드 1을 가지고 노드 2, 34 원하는) 동일한 색상을 가지고 서로 다른 색상으로 연결된 구성 요소가이 코드를 변경하는 방법 그래서

Graph<Integer, String> g; 
/** Creates a new instance of SimpleGraphView */ 
public ReadFile(int nbsommet,int [] [] nodeMat) { 
    // Graph<V, E> where V is the type of the vertices and E is the type of the edges 
    // Note showing the use of a SparseGraph rather than a SparseMultigraph 
    g = new SparseGraph<Integer, String>(); 
    // Add some vertices. From above we defined these to be type Integer. 
    /*for (int i = 1; i <=nbsommet; i++) { 
     g.addVertex((Integer)i); 

    }*/ 
     for (int i = 1; i <=nbsommet; i++) 
     { g.addVertex((Integer)i); 
      for (int j = 1; j<=nbsommet; j++) 
      { 
       if((nodeMat[i][j]==1)&& (j>i)) 
       { if(!(g.getVertices().contains(j))) 
       { g.addVertex((Integer)j);} 
        g.addEdge(i+" "+j, i, j); 
        } 

    }}} 
//... 
    ReadFile sgv = new ReadFile(nbsommet,nodeMatfinal); // This builds the graph 
    //Design sgv1 = new Design(); 
    Layout<Integer, String> layout = new KKLayout (sgv.g); 
    //TreeLayout layout = new TreeLayout(sgv.g,100,100); 
    layout.setSize(new Dimension(800,800)); 
    BasicVisualizationServer<Integer, String> vv = new BasicVisualizationServer<Integer, String>(layout); 

    Transformer<Integer,Paint> vertexPaint = new Transformer<Integer,Paint>() { 
     public Paint transform(Integer i) { 
      return (Paint) Color.GREEN; 
     } 
    }; 

    vv.setPreferredSize(new Dimension(850,850)); 
    vv.getRenderContext().setVertexLabelRenderer(new  DefaultVertexLabelRenderer(Color.green)); 
    vv.getRenderContext().setEdgeDrawPaintTransformer(new ConstantTransformer(Color.white)); 
    vv.getRenderContext().setEdgeStrokeTransformer(new ConstantTransformer(new BasicStroke(2.5f))); 

    vv.getRenderContext().setVertexFillPaintTransformer((Transformer<Integer, java.awt.Paint>) vertexPaint); 
    vv.getRenderContext().setVertexFillPaintTransformer(new PickableVertexPaintTransformer<Integer>(vv.getPickedVertexState(), Color.green, Color.yellow)); 

    vv.setBackground(Color.gray); 
    vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Integer>()); 
    vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR); 


    JFrame frame = new JFrame("Graph"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(vv); 
    frame.pack(); 
    frame.setVisible(true); 

+0

@Tichodroma 이제 OP는 자신의 질문을 이해하지 못합니다. 잘못된 편집을 부탁드립니다. –

+0

@RomanC [revisions] (http://stackoverflow.com/posts/18331566/revisions)를 살펴보면 http : // stackoverflow에서 제거 된 편집 내용을 다시 추가 한 것을 알 수 있습니다. com/users/2345880/vaibhav-jain에서 질문의 이전 버전을 번역했습니다. 그러나 모든 편집 내용을 되돌릴 수 있습니다. –

+0

@ user2699285 JUNG 사용에 문제가 있습니까? 지금까지 뭐 해봤 어? 코드를 포함 시키십시오. –

답변

1

정 라이브러리는 버텍스마다 다른 렌더러를 설정할 수 없으므로 대신 하나의 렌더러를 사용하여 거기에 로직 중 일부를 배치합니다. (나는 그 아이디어를 this SO post에서 얻었다).

이제 어떤 꼭지점에서 어떤 색상을 가져야하는지 결정해야하고 메서드 호출이나 Map<Integer, Color>에 배치해야합니다. 나는 후자를 가정합니다 :

final Map<Integer,Color> colorMapping = new HashMap<Integer, Color>(); 

// ..... 

Transformer<Integer,Paint> vertexPaint = new Transformer<Integer,Paint>() 
{ 
    public Paint transform(Integer i) 
    { 
     return colorMapping.get(i.intValue()); 
    } 
}; 

는 분명히 이것은 colorMapping을 채우기 위해 어떻게 질문을 떠난다.
인접성 매트릭스에서 연결된 구성 요소를 결정해야합니다. 이것은 this StackOverflow post에서 처리 된 별도의 문제입니다.
별도의 하위 그래프가 있으면 왼쪽에 색상을 지정하고 그에 따라 colorMapping을 채우면됩니다. 코드 샘플에


몇 가지 참고 사항 :

vv.getRenderContext().setVertexFillPaintTransformer(new PickableVertexPaintTransformer<Integer>(vv.getPickedVertexState(), Color.green, Color.yellow));

그것은 호출을 대체하는 새로운 PaintTransformer을 설정

  1. 나는이 불러 언급했다 vertexPaint.

  2. 그래프 초기화는 1부터 시작하지만 배열은 0부터 시작됩니다. 당신은

    if((nodeMat[i-1][j-1]==1)&& (j>i))

    if((nodeMat[i][j]==1)&& (j>i))

    을 변경해야합니다 또는 당신은는 ArrayIndexOutOfBoundsException을 얻을 것이다.

+0

나는이 아이디어를 시도 할 것이다. 도와 줘서 고마워. – user2699285