/* Mathematiques de l'informatique graphique    */
/* Transformation geometrique 3D                */
/* en coordonnees homogenes                     */
/*                                              */
/* Auteur: Nicolas JANEY                        */
/* nicolas.janey@univ-fcomte.fr                 */
/* Mars 2020                                    */

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include "TG3D.h"
#include "CH3D.h"

/* Construit la TG3D identite                   */

TG3D::TG3D(void) {
  for ( int i = 0 ; i < 4 ; i++ )
    for ( int j = 0 ; j < 4 ; j++ )
      c[i][j] = ( i == j ) ? 1.0F : 0.0F;
}

/* Construit la TG3D clone de tg                */

TG3D::TG3D(TG3D *tg) {
  for ( int i = 0 ; i < 4 ; i++ )
    for ( int j = 0 ; j < 4 ; j++ )
      c[i][j] = tg->c[i][j];
}

/* Construit la TG3D composition de tg1 par tg2 */

TG3D::TG3D(TG3D *tg1,TG3D *tg2) {
  composition(tg1,tg2);
}

/* Destructeur                                  */

TG3D::~TG3D(void) {
}

/* Methode d'affichage texte                    */

void TG3D::print(void) {
  for ( int i = 0 ; i < 4 ; i++ )
    printf("%10.4f %10.4f %10.4f %10.4f\n",c[i][0],c[i][1],c[i][2],c[i][3]);
}

/* Methode d'affichage texte                */
/* precede d'un message                     */
/* et suivi d'un message                    */

void TG3D::print(const char *messageAvant,const char *messageApres) {
  printf("%s",messageAvant);
  print();
  printf("%s",messageApres);
}

/* Methode de composition                       */
/* de la transformation geometrique tg1         */
/* par la transformation geometrique tg2        */
/* avec stockage du resultat dans this          */
/* this = tg1 * tg2                             */

void TG3D::composition(TG3D *tg1,TG3D *tg2) {
  TG3D aux;
  for ( int i = 0 ; i < 4 ; i++ )
    for ( int j = 0 ; j < 4 ; j++ ) {
      aux.c[i][j] = 0.0;
      for ( int k = 0 ; k < 4 ; k++ )
        aux.c[i][j] += tg1->c[i][k]*tg2->c[k][j]; } 
  for ( int i = 0 ; i < 4 ; i++ )
    for ( int j = 0 ; j < 4 ; j++ )
      c[i][j] = aux.c[i][j];
}
