import java.awt.*; /** * La classe Afficheur3D implante l'interface * {@link Afficheur Afficheur} pour developper une methode * d'affichage par rasterisation d'un segment de droite 3D. * * @author Nicolas Janey * @author nicolas.janey@univ-fcomte.fr * @version 1.0, 12/11/08 */ public class Afficheur3D implements Afficheur { private int tx; private int ty; private int zoom = 15; private Graphics g; private Ortho ortho; /** * 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) { this.tx = tx; this.ty = ty; this.g = g; g.drawString("3D en 26 connexité",10,20); g.drawString("Image : "+numeroImage,10,40); double angle = (numeroImage+40)*Math.PI/45.0; double x = Math.round(1000.0*Math.sin(angle))/100.0; double y = 4.0; double z = Math.round(1000.0*Math.cos(angle))/100.0; g.drawString("x : "+x,10,60); g.drawString("y : "+y,10,80); g.drawString("z : "+z,10,100); ortho = new Ortho(new Position3D(x,y,z),new Position3D(0.0,0.0,0.0)); ligne(-9,-5,-3,10,6,2); Position3D pi = transform(new Position3D(-8.5,-4.5,-2.5)); Position3D pf = transform(new Position3D(10.5,6.5,2.5)); g.setColor(Color.blue); g.drawLine(xEcran(pi),yEcran(pi), xEcran(pf),yEcran(pf)); } private int xEcran(Position3D p) { return((int) (tx/2+p.getX()*zoom)); } private int yEcran(Position3D p) { return((int) (ty/2-p.getY()*zoom)); } private Position3D transform(Position3D p) { return(ortho.transform(p)); } private void traceVoxel(int x,int y,int z) { double px = x; double py = y; double pz = z; Position3D p000 = transform(new Position3D(px,py,pz)); Position3D p100 = transform(new Position3D(px+1,py,pz)); Position3D p010 = transform(new Position3D(px,py+1,pz)); Position3D p001 = transform(new Position3D(px,py,pz+1)); Position3D p110 = transform(new Position3D(px+1,py+1,pz)); Position3D p011 = transform(new Position3D(px,py+1,pz+1)); Position3D p101 = transform(new Position3D(px+1,py,pz+1)); Position3D p111 = transform(new Position3D(px+1,py+1,pz+1)); g.drawLine(xEcran(p000),yEcran(p000),xEcran(p100),yEcran(p100)); g.drawLine(xEcran(p000),yEcran(p000),xEcran(p010),yEcran(p010)); g.drawLine(xEcran(p000),yEcran(p000),xEcran(p001),yEcran(p001)); g.drawLine(xEcran(p110),yEcran(p110),xEcran(p100),yEcran(p100)); g.drawLine(xEcran(p101),yEcran(p101),xEcran(p100),yEcran(p100)); g.drawLine(xEcran(p011),yEcran(p011),xEcran(p010),yEcran(p010)); g.drawLine(xEcran(p110),yEcran(p110),xEcran(p010),yEcran(p010)); g.drawLine(xEcran(p101),yEcran(p101),xEcran(p001),yEcran(p001)); g.drawLine(xEcran(p011),yEcran(p011),xEcran(p001),yEcran(p001)); g.drawLine(xEcran(p110),yEcran(p110),xEcran(p111),yEcran(p111)); g.drawLine(xEcran(p011),yEcran(p011),xEcran(p111),yEcran(p111)); g.drawLine(xEcran(p101),yEcran(p101),xEcran(p111),yEcran(p111)); } /* xf > xi */ /* yf > yi */ /* xf-xi > yf-yi */ private void ligne(int xi,int yi,int zi, int xf,int yf,int zf) { int dx,dy,dz; int cumuly,cumulz; int x,y,z ; x = xi ; y = yi ; z = zi ; dx = xf - xi ; dy = yf - yi ; dz = zf - zi ; traceVoxel(x,y,z) ; cumulz = cumuly = dx >> 1 ; for ( x = xi+1 ; x <= xf ; x++ ) { cumuly += dy ; if (cumuly >= dx) { cumuly -= dx ; y += 1 ; } cumulz += dz ; if (cumulz >= dx) { cumulz -= dx ; z += 1 ; } traceVoxel(x,y,z) ; } } }