Un programme de visualisation de segments de droite tracés au moyen de variantes de l'algorithme de Bresenham : Bresenham2D.java
Segment en 8-connexité
Pixels inférieurs ajoutés
Dessin en 4-connexité
Pages WEB de référence au format Javadoc pour ces classes
/**
* La classe <code>Bresenham2D</code> implante un programme d'affichage
* de segments de droites 2D rasterises pour l'affichage.
*
* @author Nicolas Janey
* @author nicolas.janey@univ-fcomte.fr
* @version 1.0, 16/11/08
*/
public class Bresenham2D {
public static void main(String [] args) {
ApplicationFrame f;
f = new ApplicationFrame("Tracé de segment par algorithme de Bresenham");
f.add("Bresenham 2D en 4 connexité (1)",
(Afficheur) new Afficheur4Connexite1());
f.add("Bresenham 2D en 4 connexité (2)",
(Afficheur) new Afficheur4Connexite2());
f.add("Bresenham 2D en 4 connexité (1+2)",
(Afficheur) new Afficheur4Connexite1et2());
f.add("Bresenham 2D en 4 connexité",
(Afficheur) new Afficheur4Connexite());
f.add("Bresenham 2D en 8 connexité",
(Afficheur) new Afficheur8Connexite());
f.setSize(480,360);
f.setLocation(50,250);
f.setVisible(true);
}
}
Un Afficheur implantant l'algorithme de Bresenham pour la rasterisation en 8-connexité de segments de droite 2D : Afficheur8Connexite.java
import java.awt.*;
/**
* La classe <code>Afficheur8Connexite</code> implante l'interface {@link Afficheur Afficheur}
* pour developper une methode d'affichage d'un segment de droite 2D en 8-connexite
* au moyen de l'algorithme de Bresenham.
*
* @author Nicolas Janey
* @author nicolas.janey@univ-fcomte.fr
* @version 1.0, 12/11/08
*/
public class Afficheur8Connexite implements Afficheur {
private int tx;
private int ty;
private int zoom = 20;
private Graphics g;
/**
* Methode d'affichage executee en boucle infinie pour realiser l'affichage
* d'un objet en projection parallele orthographique.
*
* @param g l'objet <code>Graphics</code> d'affichage.
* @param numeroImage le nombre de fois ou cette methode a deja ete appelee.
* @param tx la largeur (en pixels) de la zone de dessin.
* @param ty la hauteur (en pixels) de la zone de dessin.
*/
public void paint(Graphics g,int numeroImage,int tx,int ty) {
g.drawString("8 connexité",10,20);
this.tx = tx;
this.ty = ty;
this.g = g;
ligne(2,2,21,13);
g.setColor(Color.yellow);
g.drawLine((int) (2.5*zoom),(int) (ty-1.5*zoom),
(int) (21.5*zoom),(int) (ty-12.5*zoom));
}
private void tracePixel(int x,int y,Color c) {
// System.out.format("%3d %3d\n",x,y);
g.setColor(c);
g.fillRect(x*zoom,ty-y*zoom,zoom,zoom);
g.setColor(Color.black);
g.drawRect(x*zoom,ty-y*zoom,zoom,zoom);
}
/* xf > xi */
/* yf > yi */
/* xf-xi > yf-yi */
private void ligne(int xi,int yi,int xf,int yf) {
int dx,dy;
int cumul;
int x,y;
x = xi;
y = yi;
dx = xf - xi;
dy = yf - yi;
tracePixel(x,y,Color.red);
cumul = dx >> 1;
for ( x = xi+1 ; x <= xf ; x++ ) {
cumul += dy;
if (cumul >= dx) {
cumul -= dx;
y += 1; }
tracePixel(x,y,Color.red); }
}
}
Un Afficheur implantant imparfaitement l'algorithme de Bresenham pour la rasterisation en 4-connexité de segments de droite 2D : Afficheur4Connexite1.java
import java.awt.*;
/**
* La classe <code>Afficheur4Connexite1</code> implante l'interface {@link Afficheur Afficheur}
* pour developper de maniere imparfaite une methode d'affichage d'un segment de droite 2D
* en 4-connexite au moyen de l'algorithme de Bresenham.
*
* @author Nicolas Janey
* @author nicolas.janey@univ-fcomte.fr
* @version 1.0, 12/11/08
*/
public class Afficheur4Connexite1 implements Afficheur {
private int tx;
private int ty;
private int zoom = 20;
private Graphics g;
/**
* Methode d'affichage executee en boucle infinie pour realiser l'affichage
* d'un objet en projection parallele orthographique.
*
* @param g l'objet <code>Graphics</code> d'affichage.
* @param numeroImage le nombre de fois ou cette methode a deja ete appelee.
* @param tx la largeur (en pixels) de la zone de dessin.
* @param ty la hauteur (en pixels) de la zone de dessin.
*/
public void paint(Graphics g,int numeroImage,int tx,int ty) {
g.drawString("4 connexité (1)",10,20);
this.tx = tx;
this.ty = ty;
this.g = g;
ligne(2,2,21,13);
g.setColor(Color.yellow);
g.drawLine((int) (2.5*zoom),(int) (ty-1.5*zoom),
(int) (21.5*zoom),(int) (ty-12.5*zoom));
}
private void tracePixel(int x,int y,Color c) {
// System.out.format("%3d %3d\n",x,y);
g.setColor(c);
g.fillRect(x*zoom,ty-y*zoom,zoom,zoom);
g.setColor(Color.black);
g.drawRect(x*zoom,ty-y*zoom,zoom,zoom);
}
/* xf > xi */
/* yf > yi */
/* xf-xi > yf-yi */
private void ligne(int xi,int yi,int xf,int yf) {
int dx,dy;
int cumul;
int x,y;
x = xi;
y = yi;
dx = xf - xi;
dy = yf - yi;
tracePixel(x,y,Color.red);
cumul = dx >> 1;
for ( x = xi+1 ; x <= xf ; x++ ) {
cumul += dy;
if (cumul >= dx) {
cumul -= dx;
y += 1;
tracePixel(x,y-1,Color.green); }
tracePixel(x,y,Color.red); }
}
}
Un autre Afficheur implantant imparfaitement l'algorithme de Bresenham pour la rasterisation en 4-connexité de segments de droite 2D : Afficheur4Connexite2.java
import java.awt.*;
/**
* La classe <code>Afficheur4Connexite2</code> implante l'interface {@link Afficheur Afficheur}
* pour developper de maniere imparfaite une methode d'affichage d'un segment de droite 2D
* en 4-connexite au moyen de l'algorithme de Bresenham.
*
* @author Nicolas Janey
* @author nicolas.janey@univ-fcomte.fr
* @version 1.0, 12/11/08
*/
public class Afficheur4Connexite2 implements Afficheur {
private int tx;
private int ty;
private int zoom = 20;
private Graphics g;
/**
* Methode d'affichage executee en boucle infinie pour realiser l'affichage
* d'un objet en projection parallele orthographique.
*
* @param g l'objet <code>Graphics</code> d'affichage.
* @param numeroImage le nombre de fois ou cette methode a deja ete appelee.
* @param tx la largeur (en pixels) de la zone de dessin.
* @param ty la hauteur (en pixels) de la zone de dessin.
*/
public void paint(Graphics g,int numeroImage,int tx,int ty) {
g.drawString("4 connexité (2)",10,20);
this.tx = tx;
this.ty = ty;
this.g = g;
ligne(2,2,21,13);
g.setColor(Color.yellow);
g.drawLine((int) (2.5*zoom),(int) (ty-1.5*zoom),
(int) (21.5*zoom),(int) (ty-12.5*zoom));
}
private void tracePixel(int x,int y,Color c) {
// System.out.format("%3d %3d\n",x,y);
g.setColor(c);
g.fillRect(x*zoom,ty-y*zoom,zoom,zoom);
g.setColor(Color.black);
g.drawRect(x*zoom,ty-y*zoom,zoom,zoom);
}
/* xf > xi */
/* yf > yi */
/* xf-xi > yf-yi */
private void ligne(int xi,int yi,int xf,int yf) {
int dx,dy;
int cumul;
int x,y;
x = xi;
y = yi;
dx = xf - xi;
dy = yf - yi;
tracePixel(x,y,Color.red);
cumul = dx >> 1;
for ( x = xi+1 ; x <= xf ; x++ ) {
cumul += dy;
if (cumul >= dx) {
cumul -= dx;
y += 1;
tracePixel(x-1,y,Color.blue); }
tracePixel(x,y,Color.red); }
}
}
Encore un autre Afficheur implantant imparfaitement l'algorithme de Bresenham pour la rasterisation en 4-connexité de segments de droite 2D : Afficheur4Connexite1et2.java
import java.awt.*;
/**
* La classe <code>Afficheur4Connexite1et2</code> implante l'interface {@link Afficheur Afficheur}
* pour developper de maniere imparfaite une methode d'affichage d'un segment de droite 2D
* en 4-connexite au moyen de l'algorithme de Bresenham.
*
* @author Nicolas Janey
* @author nicolas.janey@univ-fcomte.fr
* @version 1.0, 12/11/08
*/
public class Afficheur4Connexite1et2 implements Afficheur {
private int tx;
private int ty;
private int zoom = 20;
private Graphics g;
/**
* Methode d'affichage executee en boucle infinie pour realiser l'affichage
* d'un objet en projection parallele orthographique.
*
* @param g l'objet <code>Graphics</code> d'affichage.
* @param numeroImage le nombre de fois ou cette methode a deja ete appelee.
* @param tx la largeur (en pixels) de la zone de dessin.
* @param ty la hauteur (en pixels) de la zone de dessin.
*/
public void paint(Graphics g,int numeroImage,int tx,int ty) {
g.drawString("4 connexité (1 & 2)",10,20);
this.tx = tx;
this.ty = ty;
this.g = g;
ligne(2,2,21,13);
g.setColor(Color.yellow);
g.drawLine((int) (2.5*zoom),(int) (ty-1.5*zoom),
(int) (21.5*zoom),(int) (ty-12.5*zoom));
}
private void tracePixel(int x,int y,Color c) {
// System.out.format("%3d %3d\n",x,y);
g.setColor(c);
g.fillRect(x*zoom,ty-y*zoom,zoom,zoom);
g.setColor(Color.black);
g.drawRect(x*zoom,ty-y*zoom,zoom,zoom);
}
/* xf > xi */
/* yf > yi */
/* xf-xi > yf-yi */
private void ligne(int xi,int yi,int xf,int yf) {
int dx,dy;
int cumul;
int x,y;
x = xi;
y = yi;
dx = xf - xi;
dy = yf - yi;
tracePixel(x,y,Color.red);
cumul = dx >> 1;
for ( x = xi+1 ; x <= xf ; x++ ) {
cumul += dy;
if (cumul >= dx) {
cumul -= dx;
y += 1;
tracePixel(x-1,y,Color.blue);
tracePixel(x,y-1,Color.green); }
tracePixel(x,y,Color.red); }
}
}
Un Afficheur implantant correctement l'algorithme de Bresenham pour la rasterisation en 4-connexité de segments de droite 2D : Afficheur4Connexite.java
import java.awt.*;
/**
* La classe <code>Afficheur4Connexite</code> implante l'interface {@link Afficheur Afficheur}
* pour developper de maniere correcte une methode d'affichage d'un segment de droite 2D
* en 4-connexite au moyen de l'algorithme de Bresenham.
*
* @author Nicolas Janey
* @author nicolas.janey@univ-fcomte.fr
* @version 1.0, 12/11/08
*/
public class Afficheur4Connexite implements Afficheur {
private int tx;
private int ty;
private int zoom = 20;
private Graphics g;
/**
* Methode d'affichage executee en boucle infinie pour realiser l'affichage
* d'un objet en projection parallele orthographique.
*
* @param g l'objet <code>Graphics</code> d'affichage.
* @param numeroImage le nombre de fois ou cette methode a deja ete appelee.
* @param tx la largeur (en pixels) de la zone de dessin.
* @param ty la hauteur (en pixels) de la zone de dessin.
*/
public void paint(Graphics g,int numeroImage,int tx,int ty) {
g.drawString("4 connexité",10,20);
this.tx = tx;
this.ty = ty;
this.g = g;
ligne(2,2,21,13);
g.setColor(Color.yellow);
g.drawLine((int) (2.5*zoom),(int) (ty-1.5*zoom),
(int) (21.5*zoom),(int) (ty-12.5*zoom));
}
private void tracePixel(int x,int y,Color c) {
// System.out.format("%3d %3d\n",x,y);
g.setColor(c);
g.fillRect(x*zoom,ty-y*zoom,zoom,zoom);
g.setColor(Color.black);
g.drawRect(x*zoom,ty-y*zoom,zoom,zoom);
}
/* xf > xi */
/* yf > yi */
/* xf-xi > yf-yi */
private void ligne(int xi,int yi,int xf,int yf) {
int dx,dy;
int cumul;
int x,y;
x = xi;
y = yi;
dx = xf - xi;
dy = yf - yi;
tracePixel(x,y,Color.red);
cumul = dx >> 1;
for ( x = xi+1 ; x <= xf ; x++ ) {
cumul += dy;
if (cumul >= dx) {
cumul -= dx;
y += 1;
if ( cumul > (dy>>1) )
tracePixel(x-1,y,Color.blue);
else
tracePixel(x,y-1,Color.green); }
tracePixel(x,y,Color.red); }
}
}