import java.awt.*; /** * La classe AfficheurProjectionOrthographique implante * l'interface {@link Afficheur Afficheur} pour developper une methode d'affichage * d'un objet en projection parallele orthographique 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 AfficheurProjectionOrthographique 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 = 40.0; /** * 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("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); Ortho ortho = new Ortho(new Position3D(x,y,z),new Position3D(0.0,3.0,0.0)); Position3D [] np = new Position3D[pts.length]; for ( int i = 0 ; i < np.length ; i++ ) np[i] = ortho.transform(pts[i]); double cx = tx/2.0; double cy = ty/2.0; for ( int i = 0 ; i < indexe.length ; i++ ) { Position3D pi = np[indexe[i][0]]; Position3D 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)); } } }