Fichier source : RotationCube.cpp
Fichier source : TransformationGeometrique3D.cpp
/* Mathematiques de l'informatique graphique    */
    /* Transformation geometrique en 3D             */
    /*                                              */
    /* Auteur: Nicolas JANEY                        */
    /* nicolas.janey@univ-fcomte.fr                 */
    /* Octobre 2012                                 */
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    
    #include "TransformationGeometrique3D.h"
    #include "CoordonneesHomogenes3D.h"
    
    /* Constructeurs                                */
    
    TransformationGeometrique3D::TransformationGeometrique3D(void) {
      for ( int i = 0 ; i < 4 ; i++ )
        for ( int j = 0 ; j < 4 ; j++ )
          c[i][j] =( i == j ) ? 1.0 : 0.0;
    }
    
    TransformationGeometrique3D::TransformationGeometrique3D(double *t) {
      int k = 0;
      for ( int i = 0 ; i < 4 ; i++ )
        for ( int j = 0 ; j < 4 ; j++ ) {
          c[i][j] = t[k];
          k++; }
    }
    
    TransformationGeometrique3D::TransformationGeometrique3D(double **t) {
      for ( int i = 0 ; i < 4 ; i++ )
        for ( int j = 0 ; j < 4 ; j++ )
          c[i][j] = t[i][j];
    }
    
    TransformationGeometrique3D::TransformationGeometrique3D(TransformationGeometrique3D *tg) {
      for ( int i = 0 ; i < 4 ; i++ )
        for ( int j = 0 ; j < 4 ; j++ )
          c[i][j] = tg->c[i][j];
    }
    
    /* Destructeur                                  */
    
    TransformationGeometrique3D::~TransformationGeometrique3D(void) {
    }
    
    /* Methodes                                     */
    
    void TransformationGeometrique3D::print(void) {
      for ( int i = 0 ; i < 4 ; i++ )
        printf("%10.4lf %10.4lf %10.4lf %10.4lf\n",c[i][0],c[i][1],c[i][2],c[i][3]);
    }
    
    void TransformationGeometrique3D::compose(TransformationGeometrique3D *t1,TransformationGeometrique3D *t2) {
      double c[4][4];
      for ( int i = 0 ; i < 4 ; i++ )
        for ( int j = 0 ; j < 4 ; j++ ) {
          c[i][j] = 0.0;
          for ( int k = 0 ; k < 4 ; k++ )
            c[i][j] += t1->c[i][k]*t2->c[k][j]; }
      for ( int i = 0 ; i < 4 ; i++ )
        for ( int j = 0 ; j < 4 ; j++ )
          this->c[i][j] = c[i][j];
    }
    
    void TransformationGeometrique3D::compose(TransformationGeometrique3D *tg) {
      double aux[4][4];
      for ( int i = 0 ; i < 4 ; i++ )
        for ( int j = 0 ; j < 4 ; j++ ) {
          aux[i][j] = 0.0;
          for ( int k = 0 ; k < 4 ; k++ )
            aux[i][j] += tg->c[i][k]*c[k][j]; }
      for ( int i = 0 ; i < 4 ; i++ )
        for ( int j = 0 ; j < 4 ; j++ )
          c[i][j] = aux[i][j];
    }
    
    void TransformationGeometrique3D::transforme(CoordonneesHomogenes3D *ch) {
      double t[4];
      for ( int i = 0 ; i < 4 ; i++ ) {
        t[i] = 0.0;
        for ( int k = 0 ; k < 4 ; k++ )
          t[i] += c[i][k]*ch->c[k]; }
      for ( int i = 0 ; i < 4 ; i++ ) {
        ch->c[i] = t[i]; }
    }