/**
* 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]));
}
}