Classe de stockage de coordonnées homogènes 3D : CoordonneesHomogenes3D.java
/**
* La classe <code>CoordonneesHomogenes3D</code> permet l'instanciation d'objets
* de type coordonnees homogenes en trois dimensions a composantes de type double.
*
* @author Nicolas Janey
* @author nicolas.janey@univ-fcomte.fr
* @version 1.0, 12/11/08
*/
public class CoordonneesHomogenes3D {
/**
* Tableau de stockage des 4 coordonnees x, y, z et t de type double
* d'une <code>CoordonneesHomogenes3D</code>.
*/
protected double [] c;
/**
* Constructeur pour une <code>CoordonneesHomogenes3D</code> de valeurs (0.0, 0.0, 0.0, 0.0).
*
*/
public CoordonneesHomogenes3D() {
c = new double[4];
}
/**
* Constructeur pour une <code>CoordonneesHomogenes3D</code> de valeur (x, y, z, t).
*
* @param x la coordonnee x affectee.
* @param y la coordonnee x affectee.
* @param z la coordonnee x affectee.
* @param t la coordonnee t affectee.
*/
public CoordonneesHomogenes3D(double x,double y,double z,double t) {
c = new double[4];
c[0] = x;
c[1] = y;
c[2] = z;
c[3] = t;
}
/**
* Constructeur pour une <code>CoordonneesHomogenes3D</code>
* copie qu'une autre <code>CoordonneesHomogenes3D</code>.
*
* @param ch l'objet <code>CoordonneesHomogenes3D</code> d'initialisation par copie.
*/
public CoordonneesHomogenes3D(CoordonneesHomogenes3D ch) {
c = new double[4];
c[0] = ch.c[0];
c[1] = ch.c[1];
c[2] = ch.c[2];
c[3] = ch.c[3];
}
/**
* Constructeur pour une <code>CoordonneesHomogenes3D</code> initialisee
* avec les valeurs contenues dans un tableau de double.
*
* @param t le tableau de double.
*/
public CoordonneesHomogenes3D(double [] t) {
c = new double[4];
c[0] = t[0];
c[1] = t[1];
c[2] = t[2];
c[3] = t[3];
}
/**
* Affecte la <code>CoordonneesHomogenes3D</code> avec une nouvelle coordonnee x.
*
* @param x la nouvelle coordonnee x.
*/
public void setX(double x) {
c[0] = x;
}
/**
* Retourne la coordonnee x de la <code>CoordonneesHomogenes3D</code>.
*
* @return la coordonnee x.
*/
public double getX() {
return(c[0]);
}
/**
* Affecte la <code>CoordonneesHomogenes3D</code> avec une nouvelle coordonnee y.
*
* @param y la nouvelle coordonnee y.
*/
public void setY(double y) {
c[1] = y;
}
/**
* Retourne la coordonnee y de la <code>CoordonneesHomogenes3D</code>.
*
* @return la coordonnee y.
*/
public double getY() {
return(c[1]);
}
/**
* Affecte la <code>CoordonneesHomogenes3D</code> avec une nouvelle coordonnee z.
*
* @param z la nouvelle coordonnee z.
*/
public void setZ(double z) {
c[2] = z;
}
/**
* Retourne la coordonnee z de la <code>CoordonneesHomogenes3D</code>.
*
* @return la coordonnee z.
*/
public double getZ() {
return(c[2]);
}
/**
* Affecte la <code>CoordonneesHomogenes3D</code> avec une nouvelle coordonnee t.
*
* @param t la nouvelle coordonnee t.
*/
public void setT(double t) {
c[3] = t;
}
/**
* Retourne la coordonnee t de la <code>CoordonneesHomogenes3D</code>.
*
* @return la coordonnee t.
*/
public double getT() {
return(c[3]);
}
/**
* Retourne un tableau de 4 double contenant les coordonnees
* de la <code>CoordonneesHomogenes3D</code>.
*
* @return le tableau de 4 double contenant les coordonnees.
*/
public double [] getValue() {
double [] nc = new double[4];
nc[0] = c[0];
nc[1] = c[1];
nc[2] = c[2];
nc[3] = c[3];
return(nc);
}
/**
* Retourne une chaine de caracteres de description
* de la <code>CoordonneesHomogenes3D</code> this.
*
* @return la chaine de caracteres de description.
*/
public String toString() {
String s = "[";
int i;
for ( i = 0 ; i < c.length-1 ; i++ )
s += (c[i]+",");
s += c[i]+"]";
return(s);
}
}
Classe de stockage de positions en 3D : Position3D.java
/**
* La classe <code>Position3D</code> derive de {@link CoordonneesHomogenes3D CoordonneesHomogenes3D}
* pour permettre l'instanciation d'objets de type position en trois dimensions.
*
* @author Nicolas Janey
* @author nicolas.janey@univ-fcomte.fr
* @version 1.0, 12/11/08
*/
public class Position3D extends CoordonneesHomogenes3D {
/**
* Constructeur pour une <code>Position3D</code> situee a l'origine (0.0, 0.0, 0.0).
*
*/
public Position3D() {
super(0.0,0.0,0.0,1.0);
}
/**
* Constructeur pour une <code>Position3D</code> situee en (x, y, z).
*
* @param x la coordonnee x affectee.
* @param y la coordonnee x affectee.
* @param z la coordonnee x affectee.
*/
public Position3D(double x,double y,double z) {
super(x,y,z,1.0);
}
/**
* Constructeur pour une <code>Position3D</code> copie qu'une autre <code>Position3D</code>.
*
* @param p l'objet <code>Position3D</code> d'initialisation par copie.
*/
public Position3D(Position3D p) {
super(p);
}
}
Classe de stockage de directions en 3D : Direction3D.java
/**
* La classe <code>Direction3D</code> derive de {@link CoordonneesHomogenes3D CoordonneesHomogenes3D}
* pour permettre l'instanciation d'objets de type direction en trois dimensions.
*
* @author Nicolas Janey
* @author nicolas.janey@univ-fcomte.fr
* @version 1.0, 12/11/08
*/
public class Direction3D extends CoordonneesHomogenes3D {
/**
* Constructeur pour une <code>Direction3D</code> orientée en (0.0, 0.0, 1.0).
*
*/
public Direction3D() {
super(0.0,0.0,1.0,0.0);
}
/**
* Constructeur pour une <code>Direction3D</code> orientée en (x, y, z).
*
* @param x la coordonnee x affectee.
* @param y la coordonnee x affectee.
* @param z la coordonnee x affectee.
*
*/
public Direction3D(double x,double y,double z) {
super(x,y,z,0.0);
}
/**
* Constructeur pour une <code>Direction3D</code> orientée en (x,y,z).
*
* @param d l'objet <code>Direction3D</code> d'initialisation par copie.
*
*/
public Direction3D(Direction3D d) {
super(d);
}
/**
* Constructeur pour une <code>Direction3D</code> orientée
* selon le vecteur norme defini entre deux {@link Position3D Position3D}.
*
* @param pi l'objet {@link Position3D Position3D} de depart.
* @param pf l'objet {@link Position3D Position3D} d'arrivee.
*
*/
public Direction3D(Position3D pi,
Position3D pf) throws ArithmeticException {
double dx = pf.c[0]-pi.c[0];
double dy = pf.c[1]-pi.c[1];
double dz = pf.c[2]-pi.c[2];
double d = Math.sqrt(dx*dx+dy*dy+dz*dz);
if ( d == 0.0 ) {
throw new ArithmeticException(); }
c = new double[4];
c[0] = dx/d;
c[1] = dy/d;
c[2] = dz/d;
c[3] = 0.0;
}
}
Classe de stockage de transformations géométriques en 3D : TransformationGeometrique3D.java
/**
* La classe <code>TransformationGeometrique3D</code> permet l'instanciation d'objets
* de type transformation geometrique en trois dimensions a composantes de type double.
*
* @author Nicolas Janey
* @author nicolas.janey@univ-fcomte.fr
* @version 1.0, 12/11/08
*/
public class TransformationGeometrique3D {
/**
* Tableau de stockage des 4x4 composantes de type double de la matrice de transformation
* representative d'une <code>TransformationGeometrique3D</code>.
*/
protected double [][] c;
/**
* Constructeur pour une <code>TransformationGeometrique3D</code> identite.
*
*/
public TransformationGeometrique3D() {
c = new double[4][4];
for ( int i = 0 ; i < 4 ; i++ )
c[i][i] = 1.0;
}
/**
* Constructeur pour une <code>TransformationGeometrique3D</code> initialisee
* avec un tableau de 4x4 double.
*
* @param t le tableau de 4x4 double utilise pour l'initialisation
*/
public TransformationGeometrique3D(double [][] t) {
c = new double[4][4];
for ( int i = 0 ; i < 4 ; i++ )
for ( int j = 0 ; j < 4 ; j++ )
c[i][j] = t[i][j];
}
/**
* Constructeur pour une <code>TransformationGeometrique3D</code> initialisee
* avec la valeur d'une autre <code>TransformationGeometrique3D</code>.
*
* @param t la <code>TransformationGeometrique3D</code> d'initialisation
*/
public TransformationGeometrique3D(TransformationGeometrique3D t) {
c = new double[4][4];
for ( int i = 0 ; i < 4 ; i++ )
for ( int j = 0 ; j < 4 ; j++ )
c[i][j] = t.c[i][j];
}
/**
* Transforme une {@link CoordonneesHomogenes3D CoordonneesHomogenes3D}
* en une nouvelle {@link CoordonneesHomogenes3D CoordonneesHomogenes3D}.
*
* @param ch la {@link CoordonneesHomogenes3D CoordonneesHomogenes3D} a transformer
* @return la {@link CoordonneesHomogenes3D CoordonneesHomogenes3D} obtenue par transformation
*/
public CoordonneesHomogenes3D transform(CoordonneesHomogenes3D ch) {
double [] v = multiplication(ch.getValue());
return(new CoordonneesHomogenes3D(v));
}
/**
* Transforme une {@link Position3D Position3D} en une nouvelle {@link Position3D Position3D}.
*
* @param p la {@link Position3D Position3D} a transformer
* @return la {@link Position3D Position3D} obtenue par transformation
*/
public Position3D transform(Position3D p) {
double [] v = multiplication(p.getValue());
return(new Position3D(v[0],v[1],v[2]));
}
/**
* Transforme une {@link Direction3D Direction3D} en une nouvelle {@link Direction3D Direction3D}.
*
* @param d la {@link Direction3D Direction3D} a transformer
* @return la {@link Direction3D Direction3D} obtenue par transformation
*/
public Direction3D transform(Direction3D d) {
double [] v = multiplication(d.getValue());
return(new Direction3D(v[0],v[1],v[2]));
}
private double [] multiplication(double [] v) {
double [] r = new double[4];
for ( int i = 0 ; i < 4 ; i++ )
for ( int j = 0 ; j < 4 ; j++ )
r[i] += c[i][j]*v[j];
return(r);
}
/**
* Compose this avec une {@link TransformationGeometrique3D TransformationGeometrique3D}
* en une nouvelle {@link TransformationGeometrique3D TransformationGeometrique3D}.
*
* @param m la {@link TransformationGeometrique3D TransformationGeometrique3D}
* a composer avec this
* @return la {@link TransformationGeometrique3D TransformationGeometrique3D}
* obtenue par composition
*/
public TransformationGeometrique3D compose(TransformationGeometrique3D m) {
TransformationGeometrique3D r = new TransformationGeometrique3D();
for ( int i = 0 ; i < 4 ; i++ )
for ( int j = 0 ; j < 4 ; j++ ) {
r.c[i][j] = 0.0;
for ( int k = 0 ; k < 4 ; k++ )
r.c[i][j] += c[i][k]*m.c[k][j]; }
return(r);
}
/**
* Compose deux {@link TransformationGeometrique3D TransformationGeometrique3D}
* et stocke le resultat dans this.
*
* @param m1 la premiere {@link TransformationGeometrique3D TransformationGeometrique3D} a composer
* @param m2 la seconde {@link TransformationGeometrique3D TransformationGeometrique3D} a composer
*/
public void compose(TransformationGeometrique3D m1,
TransformationGeometrique3D m2) {
TransformationGeometrique3D t = m1.compose(m2);
c = t.c;
}
/**
* Retourne une chaine de caracteres de description
* de la <code>TransformationGeometrique3D</code> this.
*
* @return la chaine de caracteres de description.
*/
public String toString() {
String s = "[";
for ( int j = 0 ; j < c.length ; j++ ) {
if ( j > 0 )
s += " ";
s += "[";
for ( int i = 0 ; i < c[j].length ; i++ ) {
s += c[j][i];
if ( i < c[j].length-1 )
s += ","; }
s += "]";
if ( j < c.length-1 )
s += "\n"; }
s += "]";
return(s);
}
}
Classe de stockage pour des transformations géométriques de mise en projection parallèle orthographique : Ortho.java
/**
* La classe <code>Ortho</code> permet l'instanciation d'objets
* de type transformation geometrique
* pour mise en projection parallele orthographique.
*
* @author Nicolas Janey
* @author nicolas.janey@univ-fcomte.fr
* @version 1.0, 12/11/08
*/
public class Ortho extends TransformationGeometrique3D {
/**
* Constructeur pour une transformation <code>Ortho</code> 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 Ortho(Position3D observateur,Position3D pointVise) {
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] = 0.0;
c[3][1] = 0.0;
c[3][2] = 0.0;
c[3][3] = 1.0;
}
}