Dessiner un segment ou ligne

MananaNina Messages postés 28 Date d'inscription mardi 24 mai 2011 Statut Membre Dernière intervention 27 avril 2017 - 9 oct. 2012 à 02:08
MananaNina Messages postés 28 Date d'inscription mardi 24 mai 2011 Statut Membre Dernière intervention 27 avril 2017 - 9 oct. 2012 à 18:57
Bonjour,

Je suis débutante en infographie , je cherche le programme permettant de tracer ou dessiner un segment en langage java , si vous pouvez m'aider pour avoir une idée , merci

6 réponses

cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
9 oct. 2012 à 14:43
Salut,

import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * panneau de 300x200 pixels ou on dessine une ligne diagonale 
 * 
 * @author jonathan
 */
public class LinePanel extends JPanel {

public static void main(String[] args) {

JFrame frame = new JFrame(); // creation de la fenetre
JPanel panel = new LinePanel(); // creation du panneau

frame.setContentPane(panel); // integration du panneau dans la fenetre
frame.pack(); // ajustement de la taille de la fenetre au contenu
frame.setLocationRelativeTo(null); // centrage
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // quand on clique sur la croix, ca quitte le programme (ce n'est pas le cas par defaut)
frame.setVisible(true); // rend la fenetre visible (ce n'est pas le cas par defaut)
}


/**
 * constructeur du panneau
 */
public LinePanel() {
setPreferredSize(new Dimension(300, 200)); // ajustement de la taille "preferee" du panneau
}


@Override
protected void paintComponent(Graphics graphics) {

int width = getWidth();
int height = getHeight();
graphics.drawLine(width / 8, height / 8, 7 * width / 8, 7 * height / 8);
}

}


Essaie de bien comprendre ce qui est fait :
- héritage de la classe JPanel pour faire un JPanel spécialisé pour afficher une ligne
- instanciation de la classe JFrame pour intégrer le JPanel et l'afficher
2
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
9 oct. 2012 à 13:54
Salut,

Tu peux surcharger la méthode paintComponent de JPanel et faire un g.drawLine(x0, y0, x1, y1)
0
MananaNina Messages postés 28 Date d'inscription mardi 24 mai 2011 Statut Membre Dernière intervention 27 avril 2017
9 oct. 2012 à 14:26
t'as pas un morceau de code qui peut me donner une idée , parce que je n'ai jamais codé un tel programme , merci
0
MananaNina Messages postés 28 Date d'inscription mardi 24 mai 2011 Statut Membre Dernière intervention 27 avril 2017
9 oct. 2012 à 15:06
Merci bien pour votre aide , c'est un code compréhensible et très simple , mais je cherche à utiliser l'algorithme de Bresenham ,et surtout de préciser le point de départ et celui du point final , donc il me faut comment cliquer sur les points désirés sur l'écran je pense je dois implémenter soit MouseListener ou MouseMotionListener ;
voilà la fonction permettant d'appliquer l'algorthme de bresenham :
public void Bresenham(Graphics g)
{

int x=debut.abs,y=debut.cord,dx,dy,S,i=1,Px=1,Py=1;
dx=fin.abs-debut.abs;
dy=fin.cord-debut.cord;
if(dx<0){Px=-1; dx=-dx;}
if(dy<0){Py=-1; dy=-dy;}
if(dx>dy)
{
S=(2*dy-dx) ;
while(i<dx)
{
if(S>0)
{
x+=Px;
y+=Py;
S+=2*dy-2*dx;
}
else
{
x+=Px;
S+=2*dy;
}
i++;
g.setColor(color);
g.drawLine(x,y,x,y);
}

}
else
{
S=(2*dx-dy) ;
while(i<dy)
{
if(S>0)
{
x+=Px;
y+=Py;
S+=2*dx-2*dy;
}
else
{
y+=Py;
S+=2*dx;
}
i++;
g.setColor(color);
g.drawLine(x,y,x,y);
}
}
}
0

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

Posez votre question
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
9 oct. 2012 à 18:28
Oui, dans ce cas il te faut un MouseListener que tu vas ajouter sur ton JPanel. Tu gères l'évènement mouseClicked ou bien mouseReleased et tu ajoute un point à chaque clic que tu enregistre dans une liste (List). Ensuite dans la méthode paintComponent, tu dessines une ligne entre chaque paire de points.

L'inconvénient c'est qu'il faut redessiner toutes les lignes à chaque nouvelle ligne, mais c'est plus simple à coder.

Je n'ai pas implémenté l'algo de Bresenham mais pour que tu vois l'idée, ça donne ça :

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * panneau de 300x200 pixels ou on dessine une ligne diagonale 
 * 
 * @author jonathan
 */
public class LinePanel extends JPanel implements MouseListener {

private List points;

public static void main(String[] args) {

JFrame frame = new JFrame(); // creation de la fenetre
JPanel panel = new LinePanel(); // creation du panneau

frame.setContentPane(panel); // integration du panneau dans la fenetre
frame.pack(); // ajustement de la taille de la fenetre au contenu
frame.setLocationRelativeTo(null); // centrage
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // quand on clique sur la croix, ca quitte le programme (ce n'est pas le cas par defaut)
frame.setVisible(true); // rend la fenetre visible (ce n'est pas le cas par defaut)

}


/**
 * constructeur du panneau
 */
public LinePanel() {

points = new LinkedList();

setPreferredSize(new Dimension(300, 200)); // ajustement de la taille "preferee" du panneau
addMouseListener(this);
}


@Override
protected void paintComponent(Graphics graphics) {

Iterator pointIterator = points.iterator();

Point start, end;

while (pointIterator.hasNext()) {

start = pointIterator.next();

if (pointIterator.hasNext()) {

end = pointIterator.next();
graphics.drawLine(start.x, start.y, end.x, end.y);
}
}
}

@Override
public void mouseClicked(MouseEvent mouseEvent) {}

@Override
public void mouseEntered(MouseEvent mouseEvent) {}

@Override
public void mouseExited(MouseEvent mouseEvent) {}

@Override
public void mousePressed(MouseEvent mouseEvent) {}

@Override
public void mouseReleased(MouseEvent mouseEvent) {

points.add(mouseEvent.getPoint());

if (points.size() % 2 == 0) {
repaint(); // on ne redessine que quand on a un nombre pair de points
}
}
}
0
MananaNina Messages postés 28 Date d'inscription mardi 24 mai 2011 Statut Membre Dernière intervention 27 avril 2017
9 oct. 2012 à 18:57
Oui , bien reçu Merci bien
0
Rejoignez-nous