/** * La classe Persp permet l'instanciation d'objets * de type transformation geometrique pour mise en perspective. * * @author Nicolas Janey * @author nicolas.janey@univ-fcomte.fr * @version 1.0, 12/11/08 */ public class Persp extends TransformationGeometrique3D { /** * Constructeur pour une transformation Persp definie * par la position de l'observateur, un point directement vise * et la conservation des verticales. * * @param observateur la {@link Position3D Position3D} definissant * la position de l'observateur * @param pointVise la {@link Position3D Position3D} definissant * la position du point directement vise par l'observateur */ public Persp(Position3D observateur,Position3D pointVise,double d) { super(); Direction3D n = new Direction3D(observateur,pointVise); double nx = n.getX(); double ny = n.getY(); double nz = n.getZ(); double pox = observateur.getX(); double poy = observateur.getY(); double poz = observateur.getZ(); double a = 1.0/Math.sqrt(1.0-ny*ny); c[0][0] = -a*nz; c[0][1] = 0.0; c[0][2] = a*nx; c[0][3] = a*(pox*nz-poz*nx); c[1][0] = -a*nx*ny; c[1][1] = 1.0/a; c[1][2] = -a*nz*ny; c[1][3] = (a*ny*(pox*nx+poz*nz)-poy/a); c[2][0] = -nx; c[2][1] = -ny; c[2][2] = -nz; c[2][3] = (pox*nx+poy*ny+poz*nz); c[3][0] = c[2][0]/d; c[3][1] = c[2][1]/d; c[3][2] = c[2][2]/d; c[3][3] = c[2][3]/d; } /** * Transforme une {@link CoordonneesHomogenes3D CoordonneesHomogenes3D} * en une nouvelle {@link CoordonneesHomogenes3D CoordonneesHomogenes3D}.
* Les coordonnees x et y sont divisees par t. * * @param ch la {@link CoordonneesHomogenes3D CoordonneesHomogenes3D} a transformer * @return la {@link CoordonneesHomogenes3D CoordonneesHomogenes3D} obtenue * par transformation */ public CoordonneesHomogenes3D transformAll(CoordonneesHomogenes3D ch) { double [] v = super.transform(ch).getValue(); return(new CoordonneesHomogenes3D(v[0]/v[3],v[1]/v[3],v[2],v[3])); } /** * Transforme une {@link Position3D Position3D} en une nouvelle * {@link Position3D Position3D}.
* Les coordonnees x et y sont divisees par t.
* t est reaffecte a 1.0. * * @param p la {@link Position3D Position3D} a transformer * @return la {@link Position3D Position3D} obtenue par transformation */ public Position3D transformAll(Position3D p) { double [] v = transformAll((CoordonneesHomogenes3D) p).getValue(); return(new Position3D(v[0],v[1],v[2])); } /** * Transforme une {@link Direction3D Direction3D} en une nouvelle * {@link Direction3D Direction3D}.
* Les coordonnees x et y sont divisees par t.
* t est reaffecte a 0.0. * * @param d la {@link Direction3D Direction3D} a transformer * @return la {@link Direction3D Direction3D} obtenue par transformation */ public Direction3D transformAll(Direction3D d) { double [] v = transformAll((CoordonneesHomogenes3D) d).getValue(); return(new Direction3D(v[0],v[1],v[2])); } }