IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

2D Java Discussion :

Représentation graphique d'un graphe


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Par défaut Représentation graphique d'un graphe
    Bonjour,

    J'ai essayé de représenter graphiquement un graphe (constitué de sommets et d'arcs entre ceux-ci).

    J'ai donc créé :

    - une classe Graphes, constitué de JNode, héritant de JPanel
    - une classe JNode, représentant les sommets, héritant de JLabel

    J'ai surchargé la méthode paint de JNode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    @Override
    public void paintComponent(Graphics g) {
    	super.paintComponent(g);
    	Graphics2D comp2D = (Graphics2D)g; 
     
    	comp2D.setColor(Color.red); 
    	Ellipse2D.Float sign1 = new Ellipse2D.Float(0F, 0F, 50F, 50F); 
    	comp2D.fill(sign1);
    	comp2D.setColor(Color.BLACK);
    	g.drawString(this.getCout()+"", 15, 15);
    }
    Cette méthode fonctionne bien.

    Et surchargé paint de Graphes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    @Override
        public void paint(Graphics g){
    	super.paint(g);
    	Graphics2D g2 = (Graphics2D)g;
    	for(JNode n:noeudsGraphe) {
    		Point p1=n.getLocation();
    		for(JNode suivant:n.getSuivants()) {
    			Point p2=suivant.getLocation();
    			g2.draw(new Line2D.Double(p1, p2));
    		}
    	}
     }
    Cette méthode fonctionne. Mais, les arcs partent toujours de la position du point 0,0 du JNode dans Graphes.



    J'ai donc modifié, pour essayer de bien les placer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    @Override
    public void paint(Graphics g){
    	super.paint(g);
    	Graphics2D g2 = (Graphics2D)g;
    	for(JNode n:noeudsGraphe) {
    		Point p1=n.getLocation();
    		double x1=p1.getX()+10;
    		double y1=p1.getY()+10;
    		double largeur1=n.getWidth();
    		double hauteur1=n.getHeight();
     
    		for(JNode suivant:n.getSuivants()) {
    			Point p2=suivant.getLocation();
    			double x2=p2.getX();
    			double y2=p2.getY();
    			double largeur2=suivant.getWidth();
    			double hauteur2=suivant.getHeight();
     
    			if(x1<x2 && y1<y2) { //si diag inf GD
    				p1.setLocation(x1+largeur1, y1+hauteur1);
    			} else if(x1>x2 && y1>y2) { //si diag sup DG
    				p2.setLocation(x2+largeur2, y2+hauteur2);
    			} else if(x1>x2 && y1<y2) { //si diag inf DG
    				p1.setLocation(x1, y1+hauteur1);
    				p2.setLocation(x1+largeur1, y1);
    			} else if(x1<x2 && y1>y2) { //si diag sup GD
    				p1.setLocation(x1+largeur1, y1);
    				p2.setLocation(x2, y2+hauteur2);
    			} else if(x1==x2) { //même colonne
    				if(y1<y2) {//vers le bas
    					p1.setLocation(x1+(largeur1/2), y1+hauteur1);
    					p2.setLocation(x2+(largeur2/2), y2);
    				} else {//vers le haut
    					p1.setLocation(x1+(largeur1/2), y1+hauteur1);
    					p2.setLocation(x2+(largeur2/2), y2);
    				} 
    			} else if(y1==y2) { //même ligne
    				if(x1 < x2){ //vers la droite
    					p1.setLocation(x1+largeur1, y1+(hauteur1/2));
    					p2.setLocation(x2, y2+(hauteur2/2));
    				} else { //vers la gauche
    					p1.setLocation(x1, y1+(hauteur1/2));
    					p2.setLocation(x2+largeur2, y2+(hauteur2/2));
    				} 
    			}
    			g2.draw(new Line2D.Double(p1, p2));
    		}
    	}
    }
    Mais ça donne n'importe quoi:



    Je ne vois pas du tout ce qui cloche.

    Si quelqu'un voit le/les soucis, je suis preneur. Merci!

  2. #2
    Membre éclairé
    Inscrit en
    Juin 2011
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 258
    Par défaut
    Ok j'ai trouvé, en fait le JLabel.getWidth(); retourne la taille de la case pour l'élément dans le JPanel, et pas la vraie taille du JLabel.

    Du coup j'ai stocké la taille du cercle dans la classe JNode et ça fonctionne très bien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Représentation graphique graphe Java
    Par hooouuta dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 18/11/2014, 04h07
  2. Réponses: 3
    Dernier message: 04/10/2010, 14h06
  3. Réponses: 2
    Dernier message: 15/10/2007, 11h28
  4. Théorie des graphes : Représentation GRAPHIQUE d'une matrice d'adjacence
    Par jm_gouy dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 03/05/2006, 16h53
  5. [conseil logiciel] Représentation graphique d'une BDD
    Par ShinJava dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 27/02/2005, 08h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo