import java.awt.*; /** * La classe AfficheurProjectionPerspective implante l'interface * {@link Afficheur Afficheur} pour developper une methode d'affichage d'un objet * en projection en perspective utilisable au sein * d'un {@link ApplicationCanvas ApplicationCanvas}. * * @author Nicolas Janey * @author nicolas.janey@univ-fcomte.fr * @version 1.0, 12/11/08 */ public class AfficheurProjectionPerspective implements Afficheur { /** * Tableau de stockage des {@link Position3D Position3D} des sommets * definissant l'objet affiche. */ private static final Position3D [] pts = { new Position3D( 2.0,0.0,3.0), new Position3D( 2.0,3.0,3.0), new Position3D( 0.0,5.0,3.0), new Position3D(-2.0,3.0,3.0), new Position3D(-2.0,0.0,3.0), new Position3D( 2.0,0.0,-3.0), new Position3D( 2.0,3.0,-3.0), new Position3D( 0.0,5.0,-3.0), new Position3D(-2.0,3.0,-3.0), new Position3D(-2.0,0.0,-3.0) }; /** * Tableau de stockage des indices au sein du tableau de {@link Position3D Position3D} * definissant les segments de droite de dessin en fil de fer de l'objet affiche. */ private static final int [][] indexe = { { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 }, { 4, 0 }, { 5, 6 }, { 6, 7 }, { 7, 8 }, { 8, 9 }, { 9, 5 }, { 0, 5 }, { 1, 6 }, { 2, 7 }, { 3, 8 }, { 4, 9 } }; /** * Facteur de zoom a l'affichage. */ private static final double zoom = 60.0; /** * Methode d'affichage executee en boucle infinie pour realiser l'affichage * d'un objet en projection en perspective. * * @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("Image : "+numeroImage,10,20); double angle = numeroImage*Math.PI/45.0; double x = Math.round(1000.0*Math.cos(angle))/100.0; double y = 4.0; double z = Math.round(1000.0*Math.sin(angle))/100.0; g.drawString("x : "+x,10,40); g.drawString("y : "+y,10,60); g.drawString("z : "+z,10,80); Persp persp = new Persp(new Position3D(x,y,z), new Position3D(0.0,3.0,0.0),-5.0); CoordonneesHomogenes3D [] np = new CoordonneesHomogenes3D[pts.length]; for ( int i = 0 ; i < np.length ; i++ ) { CoordonneesHomogenes3D ch = new CoordonneesHomogenes3D(pts[i].getValue()); CoordonneesHomogenes3D p = persp.transform(ch); double [] tab = p.getValue(); tab[0] /= tab[3]; tab[1] /= tab[3]; np[i] = new CoordonneesHomogenes3D(tab); } double cx = tx/2.0; double cy = ty/2.0; for ( int i = 0 ; i < indexe.length ; i++ ) { CoordonneesHomogenes3D pi = np[indexe[i][0]]; CoordonneesHomogenes3D pf = np[indexe[i][1]]; g.drawLine((int) (cx+pi.getX()*zoom), (int) (cy-pi.getY()*zoom), (int) (cx+pf.getX()*zoom), (int) (cy-pf.getY()*zoom)); } } }