Dessiner un segment ou ligne

Signaler
Messages postés
28
Date d'inscription
mardi 24 mai 2011
Statut
Membre
Dernière intervention
27 avril 2017
-
Messages postés
28
Date d'inscription
mardi 24 mai 2011
Statut
Membre
Dernière intervention
27 avril 2017
-
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

Messages postés
519
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
19 décembre 2016
23
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
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
301
Salut,

Tu peux surcharger la méthode paintComponent de JPanel et faire un g.drawLine(x0, y0, x1, y1)
Messages postés
28
Date d'inscription
mardi 24 mai 2011
Statut
Membre
Dernière intervention
27 avril 2017

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
Messages postés
28
Date d'inscription
mardi 24 mai 2011
Statut
Membre
Dernière intervention
27 avril 2017

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);
}
}
}
Messages postés
519
Date d'inscription
mercredi 21 mars 2007
Statut
Membre
Dernière intervention
19 décembre 2016
23
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
}
}
}
Messages postés
28
Date d'inscription
mardi 24 mai 2011
Statut
Membre
Dernière intervention
27 avril 2017

Oui , bien reçu Merci bien