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;
  }
}

RETOUR