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