2013-08-20 4 views
-2

J'utilise la bibliothèque JUNG Java pour gérer les graphiques et je veux savoir comment colorer les nœuds connectés avec la même couleur pour distinguer les composants connectés.Utilisation de la bibliothèque Graphes JUNG

Par exemple, je veux les nœuds 2, 3 et 4 d'avoir la même couleur et le noeud 1 d'avoir une autre couleur, sachant que la matrice de contiguïté est:

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

code pour créer le graphique (nœuds ont la même couleur):

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

Alors, comment changer ce code pour avoir les composants connectés avec des couleurs différentes

+0

@Tichodroma Maintenant OP ne comprend pas sa propre question, merci de votre modification invalide. –

+0

@RomanC Si vous regardez les [révisions] (http://stackoverflow.com/posts/18331566/revisions), vous verrez que j'ai rajouté une modification qui a été supprimée par http: // stackoverflow. com/users/2345880/vaibhav-jain quand il a traduit une ancienne version de la question. Mais allez-y et annulez toutes les modifications. –

+0

@ user2699285 Avez-vous un problème avec JUNG? Qu'avez-vous essayé jusqu'à présent? S'il vous plaît inclure votre code. –

Répondre

1

La bibliothèque JUNG ne vous permet pas de définir des rendus différents par Vertex, vous utilisez donc un moteur de rendu et y placez une partie de la logique. (J'ai cette idée de this SO post).

Vous devez maintenant déterminer quels sommets doivent obtenir quelles couleurs et les mettre dans un appel de méthode ou un Map<Integer, Color>. Je suppose ce dernier:

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

Évidemment, cela laisse la question de savoir comment remplir colorMapping.
Vous devez déterminer quels sont les composants connectés à partir de la matrice d'adjacence; ceci est un problème distinct qui a été traité dans this StackOverflow post.
Une fois que vous avez les sous-graphes séparés, tout ce qui reste à faire est de leur assigner des couleurs, et remplir colorMapping en conséquence.


Quelques notes sur votre exemple de code:

  1. je devais commenter cet appel à:

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

    Il établit une nouvelle PaintTransformer qui remplace celui qui appelle vertexPaint.

  2. L'initialisation de votre graphique est basée sur 1, mais le tableau est basé sur 0. Vous devez changer

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

    dans

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

    ou vous obtiendrez un ArrayIndexOutOfBoundsException.

+0

Je vais essayer cette idée. Merci de votre aide. – user2699285

Questions connexes