import java.awt.*; /** * La classe AfficheurBords implante l'interface {@link Afficheur Afficheur} * pour developper une methode d'affichage d'un triangle 2D par affichage en 8-connexite * des pixels de ses bords au moyen de l'algorithme de Bresenham. * * @author Nicolas Janey * @author nicolas.janey@univ-fcomte.fr * @version 1.0, 12/11/08 */ public class AfficheurBords 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 Graphics 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("Remplissage triangle",10,20); this.tx = tx; this.ty = ty; this.g = g; int x1 = 2; int y1 = 2; int x2 = 21; int y2 = 13; int x3 = 5; int y3 = 17; ligne(x1,y1,x2,y2); ligne(x2,y2,x3,y3); ligne(x3,y3,x1,y1); g.setColor(Color.yellow); drawLine(x1,y1,x2,y2); drawLine(x2,y2,x3,y3); drawLine(x3,y3,x1,y1); } private void drawLine(int xi,int yi,int xf,int yf) { g.drawLine((int) ((xi+0.5)*zoom),(int) (ty-(yi-0.5)*zoom), (int) ((xf+0.5)*zoom),(int) (ty-(yf-0.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); } private void ligne(int xi,int yi,int xf,int yf) { int dx,dy,i,xinc,yinc,cumul,x,y ; x = xi ; y = yi ; dx = xf - xi ; dy = yf - yi ; xinc = ( dx > 0 ) ? 1 : -1 ; yinc = ( dy > 0 ) ? 1 : -1 ; dx = Math.abs(dx) ; dy = Math.abs(dy) ; tracePixel(x,y,Color.red); if ( dx > dy ) { cumul = dx / 2 ; for ( i = 1 ; i <= dx ; i++ ) { x += xinc ; cumul += dy ; if (cumul >= dx) { cumul -= dx ; y += yinc ; } tracePixel(x,y,Color.red); } } else { cumul = dy / 2 ; for ( i = 1 ; i <= dy ; i++ ) { y += yinc ; cumul += dx ; if ( cumul >= dy ) { cumul -= dy ; x += xinc ; } tracePixel(x,y,Color.red); } } } }