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));
}
}
}