I
Aussi haut que soit le trône on n'est jamais assis que sur son cul...
Bonjour,
Merci pour la réponse.
J'essaye depuis hier. Mais, je n'arrive pas.
Bon, sachant que je suis encore débutante. Donc, j'ai très peu de ressources.
J'ai l'impression qu'il y a trop de bordel dans ma classe DessinPoints et que je pourrais la faire autrement mais comment je ne sais pas.
Tu peux essayer de trouver des exemples sur internet de classe simple de dessin de point.
Ne serait-ce que sur les tuto du site:
http://duj.developpez.com/tutoriels/java/dessin/intro/
j'ai rajouté ce code en se reposant sur le lien que tu m'as donné.
Il n'y a pas d'erreur mais la fenêtre est encore vide. Je deviens folle;((
je ne suis pas sure s'il faut mettre la variable pts.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Iterator iter = pts.ListIterator() while (iter.hasNext()){ pts = iter.next();
Pour moi déjà ton but n'est pas forcement clair non plus, alors ça n'aide pas pour t'aider...
Comme je t'ai dis, est-ce que tu récupère bien les points et que tu les peux les afficher (pas dans un dessin mais avec des coordonnées mathématiques).
En gros, est-ce que ce que tu lis du fichier est bon.
Ensuite, comme l'as dis deathness renseigne-toi sur le graphisme en java avec quelques tuto, et essaye un maximum d'avoir une démarche pour savoir ce qui ne marche pas (ce qui implique de savoir ce qui marche).
Ensuite donne-nous des infos précise, et on pourra t'aider (des stackTraces quand ça plante, des bouts de codes qui te semble pas clair, etc...)
On est tous passés par là, et on est là pour te donner un coup de main, que demander de plus :p
I
Aussi haut que soit le trône on n'est jamais assis que sur son cul...
Le code demande ceci:
Chaque ligne d’un fichier texte contient deux ou quatre nombres réels écrits sous forme littérale. Chaque ligne peut être analysée, d’abord en produisant des tokens, puis en faisant le parsing de ceux-ci pour voir s’ils se convertissent en nombres réels. Vous posséderez alors une collection de points affichables dans le plan en spécifiant une échelle. Si quatre valeurs figurent sur une ligne, on construit une droite qu’on dessine jusqu’au bord de la zone de dessin.
La figure ci-dessous vous montre deux aspects d’un même fichier de points et de droites, avant et après redimensionnement de la fenêtre.
Et pour la classe DessinPoints:
itérer à travers l’ArrayList
prendre un point UnPoint
dessiner un drawRect() autour de ce point
fin itération
...
On dessine un rectangle avec drawRect() car un pixel est difficilement visible. On dessinera donc une « enveloppe » du point. Pour les droites, vous utiliserez drawLine(). On aimerait que les droites s’étendent jusqu’au bord de la zone de dessin
et voilà ce qui s'affiche dans la console:
0.16121758737316802x + 6.650744081172491
Sachant que ce que j'ai mis dans mon fichier est :
1.56 3.87
1.36 6.87 10.23 8.30
je vous remercie tous. vos réponses m'ont bq aidées à avancer.
Un moyen simple de comprendre, c'est suivre le tuto de developpez, et de bien comprendre tous les morceaux de code qu'ils te donnent. Après tu t'amuses a modifier des trucs dedans pour voir comment ça réagit derrière.
Mais il faut avoir des notions de comment marche Swing (Thread graphique, raffraichissement, ...)
Non, moi non plus
Faire une Iteration reviens à faire une boucle For, en prenant un élément puis un autre, etc...
Avec quel IDE tu code ?
Eclipse (je pense pas), Notepad ??
Comment fais-tu pour résoudre les conflits ?
Ce bout de code est improbable...
Déjà tu as encore oublié un ";" à la fin de la première ligne (mais je met ça sur le compte du copier/coller) ensuite quel est le type de pts, sur lequel tu itère et qu'ensuite tu réaffecte avec une seule valeur de toute sa liste ...
Execute ça et tu comprendra qu'on ne peut pas itérer sur une liste, prendre un objet de cette liste et réaffecter à TOUTE la liste l'objet qu'on vient de lui prendre...
Par contre je pense que ce que tu veux faire, c'est pour chaque point de cette liste le tracer, non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Iterator iter = pts.ListIterator(); System.out.println(iter); while (iter.hasNext()){ System.out.println(iter.next());
Ou c'est des lignes, ou autres type de dessins que tu veux faire ??
I
Aussi haut que soit le trône on n'est jamais assis que sur son cul...
Ok, je comprend mieux, et j'affine ce que j'ai dis avant, pas contre, ça semble être un exercice de cours ce que tu nous demande, alors je vais essayer de pas tout te pré-mâcher
Je te fait la traduction en code
Et j'en ai déjà trop fait, mais ce qu'il te manquait étant l'objet Graphics, et donc des connaissances en swing, fait les tuto, ça ne peux que tu servir par la suite !!!!
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 // Ta frame principale (l'endroit ou tu affiche ton graphic) JFrame frame = new JFrame(); //Récupération du Graphics, l'objet dans lequel tu peux dessiner Graphics g = frame.getGraphics(); // width & height du rectangle (valeurs totalement arbitraire...) int width = 5; int height = 5; //Récupération de la liste de points (ici création d'une nouvelle ArrayList vide) List<Point> listeDePoints = new ArrayList<Point>(); //Création de l'iterator sur la liste de point Iterator<Point> iter = listeDePoints.iterator(); //Tant que la liste à un suivant (tant quelle renvoie true à la question, est-ce qu'il en reste ?) while (iter.hasNext()) { //Création d'un point par récupération des valeurs de l'itération.. Point unPoint = iter.next(); //Affichage et tracé du rectangle dans l'objet graphics avec les valeurs du point de la liste et de la taille et hauteur... g.drawRect(unPoint.x, unPoint.y, width, height);
I
Aussi haut que soit le trône on n'est jamais assis que sur son cul...
En fait le but est de lire le fichier.
si la ligne contient 2 valeurs , un point est instancié
4 valeurs , une droite est instanciée sinon afficher une erreur.
il faut dessiner tous les points et les lignes.( des rectangles autours des points)
et ma classe DessinPoint la voici:

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 package dataPoints; import geomD2.DroiteD2; import geomD2.PointsD2; import java.awt.*; import java.util.ArrayList; import java.util.Iterator; import javax.swing.JComponent; import javax.swing.JPanel; public class DessinPoints extends JPanel { /** * */ private static final long serialVersionUID = 1L; DataPoints listPts; int bord; // taille des bords int enveloppe; // dimension des rectangles public DessinPoints (DataPoints pts, int largeur, int hauteur, int bord, int enveloppe) { this.listPts = pts; this.bord = bord; this.enveloppe = enveloppe; } public void paintcomponent (Graphics g) { super.paintComponent(g); g.setXORMode(Color.RED); Dimension tailleSuivante = new Dimension (this.getSize()); //Affectation de la nouvelle taille de la fen√tre JComponent tailleOriginal = null; @SuppressWarnings("null") double factEchX = tailleSuivante.getWidth()/tailleOriginal.getWidth(); //calcule du facteur de l'√©chelle sur l'axe X double factEchY = tailleSuivante.getHeight()/tailleOriginal.getHeight(); //calcule de facteur de l'√©chelle sur l'axe Y for (int i=0;i<listPts.size();i++){ ArrayList<PointsD2> ptLu = (ArrayList<PointsD2>)listPts.get(i); //Liste des point courants //Test si il y a 1 ou 2 point pour l'affichage de ses dernier avec ou sans la droite if(ptLu.size()==1){ //Affichage des points g.drawRect((int)(ptLu.get(0).getX().intValue()*factEchX),(int)(ptLu.get(0).getY().intValue()*factEchY),enveloppe,enveloppe); } if(ptLu.size()==2){ int milieuPointX1,milieuPointY1,milieuPointX2,milieuPointY2; //Coordin√©es central des points pour l'affichage central de la droite //definition du milieu des points milieuPointX1 = ptLu.get(0).getX().intValue()-enveloppe/2; milieuPointY1 = ptLu.get(0).getY().intValue()-enveloppe/2; milieuPointX2 = ptLu.get(1).getX().intValue()-enveloppe/2; milieuPointY2 = ptLu.get(1).getY().intValue()-enveloppe/2; //Affichage des points g.drawRect((int)(milieuPointX1*factEchX),(int)(milieuPointY1*factEchY),enveloppe,enveloppe); g.drawRect((int)(milieuPointX2*factEchX),(int)(milieuPointY2*factEchY),enveloppe,enveloppe); //Cr√©ation de la droite DroiteD2 droite = new DroiteD2 (ptLu.get(0),ptLu.get(1)); //Affichage de la droite g.drawLine((int)(droite.getIntersectionX().intValue()*factEchX),0,0,(int)(droite.getIntersectionY().intValue()*factEchY)); } } } }
Ok autant pour moi, j'avais zappé cette classe, je te conseille de mettre
Avant
Code : Sélectionner tout - Visualiser dans une fenêtre à part System.out.println((int)(ptLu.get(0).getX().intValue()*factEchX),(int)(ptLu.get(0).getY().intValue()*factEchY),enveloppe,enveloppe));
Pour comprendre pourquoi tu n'affiche rien...
Code : Sélectionner tout - Visualiser dans une fenêtre à part g.drawRect((int)(ptLu.get(0).getX().intValue()*factEchX),(int)(ptLu.get(0).getY().intValue()*factEchY),enveloppe,enveloppe);
Plus simplement de mettre un point d'arrêt à la ligne 37 de ta classe et de runner ton Main et mode Debug, ça va t'afficher une autre perspective d'éclipse et ensuite tu as les variables en haut à droite, et tu fait des F5 pour rentrer dans la méthode, ou des F6 pour avancer dans ton code, tu vérifie toutes tes variables pour voir ce qu'elle contiennent...
I
Aussi haut que soit le trône on n'est jamais assis que sur son cul...
L'onglet ou il y a des variables est vide.!!?
C'est étonnant...
Tu devrais avoir ta classe dans laquelle tu as mis le point d'arrêt au milieu, en haut et gauche tes thread (ne t'en occupe pas pour le moment), et à droite tes variables...
Les flèches pour avancer dans le code sont celle-ci au dessus en haut :
Si tu ne les voie pas c'est que tu n'est pas dans le thread qui est en train d'être débugé...
Tu dois avoir des variables dans la fenêtre de cette manière :
Sinon tu as vérifié en mettant les System.out dont je t'ai parlé, pour voir quels sont les valeurs de ce que tu veux dessiner ?
I
Aussi haut que soit le trône on n'est jamais assis que sur son cul...
Utilisez le foreach java !
Pour ce qui est du problème d'affichage, je conseil de redéfinir la méthode paint.(@overwrite)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 List<Point> listeDePoints = new ArrayList<Point>(); //Parcours de la liste for(Point unPoint : listeDePoints ) { //Affichage et tracé du rectangle dans l'objet graphics avec les valeurs du point de la liste et de la taille et hauteur... g.drawRect(unPoint.x, unPoint.y, width, height); }
Et au passage de faire cela dans un JPanel spécifique, qui sera ajouter au la frame.
Une fois le tout proprement liée, réalise un "repaint()" sur la frame.
Cordialement,
Patrick Kolodziejczyk.
Si une réponse vous a été utile pensez à
Si vous avez eu la réponse à votre question, marquez votre discussion
Pensez aux FAQs et aux tutoriels et cours.
Merci les amis,
je vais essayer tout ça et je vous tiendrais au courant ce soir.
Encore merci
J'ai repris vite fait ton programme.
Il reste du boulot à faire, indiqué par les TODO.
Actuellement les points sont dessinés aux endroits indiqués dans le fichier, sans mise à l'échelle. Reste à afficher les droites.
A toi de finir.
J'ai séparée la classe qui lit les données de la classe qui les contient.
Ainsi tu peux changer de méthode de chargement sans modifier la structure de tes données.
Si tu ne passais pas dans l'affichage c'est à cause de
à la place de
Code : Sélectionner tout - Visualiser dans une fenêtre à part paintcomponent(Graphics g) // C Minuscule
Tu l'aurais vu avec l'annotation @Override
Code : Sélectionner tout - Visualiser dans une fenêtre à part paintComponent(Graphics g) // C Majuscule
fr.grapheur.GrapheurApplication
fr.grapheur.view.ZoneDessin
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 package fr.grapheur; import java.awt.BorderLayout; import javax.swing.JFrame; import fr.grapheur.data.Donnees; import fr.grapheur.data.reader.FichierPointsReader; import fr.grapheur.view.DessinPoints; public class GrapheurApplication { public static void main(String[] args) { try { Donnees donnes = FichierPointsReader.read("C:\\temp\\points.pts"); DessinPoints monGraphe = new DessinPoints(donnes,600,400,10,10); JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setLayout(new BorderLayout()); f.add(monGraphe, BorderLayout.CENTER); f.setTitle("Grapheur"); f.setSize(400, 400); f.setVisible(true); } catch (Exception e) { e.printStackTrace(System.err); } } }
fr.grapheur.data.Point2D
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 package fr.grapheur.view; import fr.grapheur.data.Donnees; import fr.grapheur.data.Droite; import fr.grapheur.data.Point2D; import java.awt.Graphics; import javax.swing.JPanel; public class ZoneDessin extends JPanel { /** * */ private static final long serialVersionUID = 1L; private Donnees donnees; private int bord; // taille des bords private int enveloppe; // dimension des rectangles public ZoneDessin (Donnees donnees, int largeur, int hauteur, int bord, int enveloppe) { this.donnees = donnees; this.bord = bord; this.enveloppe = enveloppe; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); int panelWidth = getWidth(); // Retourne la taille du panel, quelque soit le redimensionnement int panelHeight = getHeight(); // Afficher les points for(Point2D point : donnees.getPoints()){ System.out.println(point); // Mettre à l'échelle du panel Point2D pointAAfficher = toPanelScale(point, panelWidth, panelHeight, donnees); // TODO: Afficher le point g.drawRect((int)pointAAfficher.getX(), (int)pointAAfficher.getY(), (int)enveloppe, enveloppe); g.drawString(point.toString(), (int)pointAAfficher.getX() + enveloppe, (int)pointAAfficher.getY()); } // Afficher les points for(Droite droite : donnees.getDroites()){ // Afficher la droite System.out.println(droite); // TODO: Calculer p1 et p2 la position Y pour x = donnes.getXMax() et pour x = donnes.getXMax() // TODO: Si le coefficientDirecteur est important (Droites presques verticales, et y tend vers l'infini) trouver X qui donne y = donnes.getYMin() et Y = donnes.getYMax() Point2D p1 = new Point2D(); Point2D p2 = new Point2D(); // Mise à l'echelle p1 = toPanelScale(p1, panelWidth, panelHeight, donnees); p1 = toPanelScale(p2, panelWidth, panelHeight, donnees); // TODO: Afficher le segment p1 -> p2 avec g.drawLine((int)p1.getX(), (int)p1.getY(), (int)p2.getX(), (int)p2.getY()); } } /** * Fonction de mise à l'échelle du point. * Transorme un point du fichier en une coordonnée dans le JPanel * @param point * @param panelWidth la largeur du panel * @param panelHeight la hauteur du panel * @param donnees pour avoir les bornes min et max * @return */ Point2D toPanelScale(Point2D point, int panelWidth, int panelHeight, Donnees donnees) { final Point2D retour = new Point2D(point); // TODO: remplir retour avec les valeurs calculées // TODO: Pour que le centre du carré soit la position exacte, penser à enlever enveloppe/2 à X et Y // TODO: Penser que l'origine dans un panel (x=0, y=0) SWING se situe en haut à gauche return retour; } }
fr.grapheur.data.Droite
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
51
52
53
54
55
56
57
58
59
60
61
62
63 package fr.grapheur.data; public class Point2D { private double x; private double y; // Point D2 a ses constructeurs public Point2D() { this.x = 0.0; this.y = 0.0; }; public Point2D(double x, double y) { this.x = x; //conversion implicite de int en Integer this.y = y; } public Point2D(Point2D pt){ this.x = pt.x; this.y = pt.y; } public Point2D(double[] pt){ this.x = pt[0]; this.y = pt[1]; } public double getX(){ return x; } public double getY(){ return y; } public void setX(double a){ x = a; } public void setY(double a){ y = a; } public double dist(Point2D pt){ //distance ÀÜ un point entr?? en paramÔø?tre (pythagore) return Math.sqrt(Math.pow(pt.x-x,2) + Math.pow(pt.y-y,2)); } // redefinition de la methode Object.equal() @Override public boolean equals(Object p){ if (!(p instanceof Point2D)) { return false; } else { return (((Point2D)p).x == x && ((Point2D)p).y == y); } } @Override public String toString() { StringBuilder s = new StringBuilder(getClass().getSimpleName()); s.append("{x="); s.append(x); s.append(", y="); s.append(y); s.append("}"); return s.toString(); } }
fr.grapheur.data.Donnees
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 package fr.grapheur.data; public class Droite { private double cooefDirecteur; private double b = 0.0; // la droite "pente x + b" // Constructeurs // un point et une pente // deux points public Droite(Point2D p1, Point2D p2) { // calcul du cooefDirecteur if (p1.getX() >= p2.getX()) { cooefDirecteur = ((double)p1.getY() - p2.getY())/(p1.getX() - p2.getX()); } else { cooefDirecteur = ((double)p2.getY() - p1.getY())/(p2.getX() - p1.getX()); } // Calcul de B if (p1.getX() >= 0) { b = p1.getY() - cooefDirecteur*p1.getX(); } else { b = -(cooefDirecteur*p1.getX()) - p1.getY(); } } // les accesseurs avec calcul // abscisse d'intersection avec axe X public Double getIntersectionX() { return -(b/cooefDirecteur); } // ordonne d'intersection avec axe Y public Double getIntersectionY() { return b; } public boolean contient(Point2D p) { return (cooefDirecteur*p.getX() + b == p.getY()); } public boolean estParallele(Droite d) { return d.cooefDirecteur == cooefDirecteur; } // Les utilitaires public boolean equals(Object o){ if (!(o instanceof Droite)) { return false; } else return ((((Droite)o).cooefDirecteur == this.cooefDirecteur) && (((Droite)o).b == this.b)); //return true; //(((DroiteD2)o).point.getX() == this.point.getX() } @Override public String toString() { StringBuilder s = new StringBuilder(getClass().getSimpleName()); s.append("{equation="); s.append(cooefDirecteur); s.append("x + "); s.append(b); s.append("}"); return s.toString(); } }
fr.grapheur.data.reader.FichierPointsReader
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
51
52
53
54
55
56
57
58
59
60
61
62 package fr.grapheur.data; import java.util.List; public class Donnees { private double xMin; private double xMax; private double yMin; private double yMax; private List<Point2D> points; private List<Droite> droites; public List<Point2D> getPoints() { return points; } public void setPoints(List<Point2D> points) { this.points = points; } public List<Droite> getDroites() { return droites; } public void setDroites(List<Droite> droites) { this.droites = droites; } public double getXMin() { return xMin; } public void setXMin(double xMin) { this.xMin = xMin; } public double getXMax() { return xMax; } public void setXMax(double xMax) { this.xMax = xMax; } public double getYMin() { return yMin; } public void setYMin(double yMin) { this.yMin = yMin; } public double getYMax() { return yMax; } public void setYMax(double yMax) { this.yMax = yMax; } }
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 package fr.grapheur.data.reader; import java.io.FileReader; import java.io.LineNumberReader; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import fr.grapheur.data.Donnees; import fr.grapheur.data.Droite; import fr.grapheur.data.Point2D; public class FichierPointsReader { public static Donnees read(String fichier) throws Exception { final List<Point2D> points = new ArrayList<Point2D>(); final List<Droite> droites = new ArrayList<Droite>(); final LineNumberReader lecteurLignes = new LineNumberReader(new FileReader(fichier)); String ligneTexte = null; while ((ligneTexte = lecteurLignes.readLine()) != null) { final StringTokenizer st = new StringTokenizer(ligneTexte); if (st.countTokens() == 2) { // stoker les points dans le vecteur courant Double X = new Double(st.nextToken()); Double Y = new Double(st.nextToken()); Point2D Point = new Point2D(X, Y); points.add(Point); } if (st.countTokens() == 4) { Double X = new Double(st.nextToken()); Double Y = new Double(st.nextToken()); Point2D Point = new Point2D(X, Y); Double X1 = new Double(st.nextToken()); Double Y1 = new Double(st.nextToken()); Point2D Point2 = new Point2D(X1, Y1); Droite droite = new Droite(Point, Point2); droites.add(droite); } } final Donnees donnees = new Donnees(); donnees.setPoints(points); donnees.setDroites(droites); // TODO: Calcul des min max pour la mise à l'echelle plus tard return donnees; } }
Attention aux packages fr.xx.xx, qui ne sont peut-être pas adaptés dans ton cas
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager