Graphique : DrawLine

aposfa Messages postés 36 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 14 mars 2009 - 1 juin 2006 à 14:20
aposfa Messages postés 36 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 14 mars 2009 - 1 juin 2006 à 15:30
salut tout le monde. J'essaye de faire un petit éditeur de graph, dont le principe est :
   - on clique une première fois : un point se dessine
   - on clique une seconde fois : un autre point se dessine ainsi qu'une ligne reliant les 2
   - on clique une troisieme fois : un point de dessine et le relie au précédent

Pour le dessiner je redéfini la méthode OnPaint et je n'ai pas de problème pour ca.
En revanche j'éprouve des difficultés pour ce qui est de relier les deux points. En effet mon problème est que j'écrase le point précédent et le remplace par le nouveau, donc il se relie a lui meme et ce n'est pas ce que je veux
Il faudrait donc que je sauvegarde le premier point dans une variable, puis creer une second et enfin relier les deux. Mais je n'y arrive pas

Ci dessous les méthodes de construction des points et des lignes.

Merci de m'aider a trouver cette fameuse fonction qui me pose problème.

private
void GraphDoc_MouseDown(
object sender, System.Windows.Forms.MouseEventArgs e){
Point center new Point(e.X, e.Y);Size size

new Size(size_tmp,size_tmp);Noeud node =

new Noeud(center, size, color); //pour creer le pointgraph.Add_Noeud(center, size, color); //ajouter le point a mon ArrayList

Arete arete =

new Arete(node,node,color,size); //pour creer la ligne entre deux noeudsgraph.Add_Arete(node,node,color,size); //ajouter la ligne dans mon ArrayList

this.Refresh(); //j'appelle la méthode OnPaint qui affiche les éléments de mon ArrayList}

Si vous voulez plus de précisions vous n'avez qu'a me demander

8 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
1 juin 2006 à 14:26
pourquoi ne pas créer une collection de point... et dans la méthode OnPaint relier les points entre eux ?

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
aposfa Messages postés 36 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 14 mars 2009
1 juin 2006 à 14:31
pour répondre simplement : parce que la méthode que j'utilise est une méthode imposée par l'exercice que je suis en train de traiter. Personnellement moi non plus j'aurais pas fait comme ca mais je n'ai pas le choix ...
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
1 juin 2006 à 14:36
Lorsque tu créé ton Arrete, si je comprend ce que fais la fontion, ce n'est pas

new Arrete(node, node, ...)

mais :

new Arrete(previousNode, node)
avec previousNode = l'avant dernier noeud dans "graph"

de meme, tu crée cette arrete mais tu n'en fais rien :
Arete arete =
new Arete(node,node,color,size); //pour creer la ligne entre deux noeuds

graph.Add_Arete(node,node,color,size); //ajouter la ligne dans mon ArrayList

Tu peux supprimer la premiere ligne,  mais toujours templacer le premier node par previousNode dans la seconde...

Par contre attention, pour le premier point...il n'y a pas de previous node, donc on n'ajoute par d'arrete.
0
aposfa Messages postés 36 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 14 mars 2009
1 juin 2006 à 14:41
oui tu a mis le doigt sur mon probleme. et donc comme je disais, lorsque je sauvegarde le premier noeud, donc nommé previousNode comme tu dis, et que je clique une seconde fois dans ma fenetre, je rappelle de nouveau la fonction qui m'écrase ce previousNode, ainsi je ne peux rien relié pouisque je n'ai pas le premier point. Et se pose aussi le probleme de ne pas compter le premier click de l'utilisateur.
je suis bloqué ici

j'espere avoir été assez clair lol
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
1 juin 2006 à 14:50
Que représente "graph" dans ton morceau de code? une collection déclarée dans une variable exterieure a la fonction?

Si c'est le cas, de la même facon que tu ajout un noeud (graph.Add_Node(...)) tu dois pouvoir récupérer un noeud : graph.Get_Node(i) par exemple... a voir dans graph ce que tu peux faire.

Donc pour récupérer le noeud précédent, ca pourrais ressembler a ca :

previousNode = graph.Get_Node( graph.Get_NodeCount - 2); // (on prend l'avant dernier noeud)

et pour ne pas compter le premier click, de la meme facon :

if(graph.Get_NodeCount > 1) // on a au moins un noeud
{
      graph.Add_Arrete...
}

Mais bon c'est pas évident de t'aider ne sachant pas quels objets tu utilise, ce que font tes méthodes, et ce que tu as le droit / ou non de modifier (puisqu'aparement tu ne peux par exemple pas toucher a la méthode OnPaint).
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
1 juin 2006 à 14:51
c'est pourquoi, je disais avec une petite collection... ca se fait en 3 lignes

petite remarque aussi... on doit éviter l'utilisation de Refresh(), et utiliser à la place Invalidate().

Bref... pour moi le code "idéal" :

sur le MouseDown de la souris :

monTableau.Add(MousePosition);

Dans le OnPaint :

Point previousPoint = Point.Empty;
foreach(Point p in monTableau) {
   if (previousPoint != Point.Empty) {
      e.Graphics.DrawLine( SystemPens.ControlText, previousPoint, p);
   }
   previousPoint = p;
}

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
1 juin 2006 à 14:52
j'ai oublié :

List monTableau = List();

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
0
aposfa Messages postés 36 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 14 mars 2009
1 juin 2006 à 15:30
merci beaucoup Nikoui grace a toi j'ai résolu mon problème. Voici ce que j'ai finalement écrit :

protected
override
void OnPaint(PaintEventArgs e){

base.OnPaint(e);graph.Display(e, filled);

}

private

void GraphDoc_MouseDown(
object sender, System.Windows.Forms.MouseEventArgs e){

Noeud previousNode;
Point center new Point(e.X, e.Y);Size size

new Size(size_tmp,size_tmp);Noeud node =

new Noeud(center, size, color);graph.Add_Noeud(center, size, color);

if(graph.Get_NodeCount() > 1){

previousNode = graph.Get_Node(graph.Get_NodeCount() - 2);

graph.Add_Arete(previousNode,node,color,size);

}

this.Refresh();}

Et voici les fonctions qui sont appelées pour que vous compreniez :

public
class Graphic{
ArrayList tab_noeud new ArrayList();ArrayList tab_arete

new ArrayList();

public
void Add_Noeud(Point center, Size size, Color color){

Noeud node =

new Noeud(center, size, color);tab_noeud.Add(node);

}

public
void Delete_Noeud(Noeud node){

tab_noeud.Remove(node);

}

public
void Add_Arete(Noeud node1, Noeud node2, Color color, Size size){

Arete arete =

new Arete(node1, node2, color, size);tab_arete.Add(arete);

}

public
void Delete_Arete(Arete arete){

tab_arete.Remove(arete);

}

public
void Display(PaintEventArgs e,
bool filled){

foreach(Noeud node
in tab_noeud)node.Display(e, filled);

foreach(Arete arete
in tab_arete)arete.Display(e);

}

public Noeud Get_Node(
int i){

return (Noeud)tab_noeud[i];}

public
int Get_NodeCount(){

return tab_noeud.Count;}

}

ENCORE MERCI A TOUS
0
Rejoignez-nous