/**
* La classe TransformationGeometrique3D
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 TransformationGeometrique3D
.
*/
protected double [][] c;
/**
* Constructeur pour une TransformationGeometrique3D
identite.
*
*/
public TransformationGeometrique3D() {
c = new double[4][4];
for ( int i = 0 ; i < 4 ; i++ )
c[i][i] = 1.0;
}
/**
* Constructeur pour une TransformationGeometrique3D
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 TransformationGeometrique3D
initialisee
* avec la valeur d'une autre TransformationGeometrique3D
.
*
* @param t la TransformationGeometrique3D
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 TransformationGeometrique3D
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);
}
}