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:
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:
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.
http://img15.hostingpics.net/thumbs/...9521noeuds.png
J'ai donc modifié, pour essayer de bien les placer:
Code:
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:
http://img15.hostingpics.net/thumbs/...9noeudsBug.png
Je ne vois pas du tout ce qui cloche. :(
Si quelqu'un voit le/les soucis, je suis preneur. Merci!