/* Mathematiques de l'informatique graphique    */
/* Rotation 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 "Rt3D.h"
#include "Dir3D.h"

#ifndef M_PI
#define M_PI 3.14159F
#endif

/* Construit la rotation identite               */

Rt3D::Rt3D(void):TG3D() {
}

/* Fonction utilitaire statique                 */
/* (C'est juste pour essayer)                   */

static void initialisation(Rt3D *rt,float alpha,Dir3D *d) {
  Dir3D axe(d);
  axe.normalisation();
  float aa = alpha/180.0F*M_PI;
  float sn =(float) sin(aa);
  float cs =(float) cos(aa);
  rt->c[0][0] = axe.x*axe.x+cs*(1-axe.x*axe.x);
  rt->c[0][1] = axe.x*axe.y*(1-cs)-sn*axe.z;
  rt->c[0][2] = axe.x*axe.z*(1-cs)+sn*axe.y;
  rt->c[1][0] = axe.x*axe.y*(1-cs)+sn*axe.z;
  rt->c[1][1] = axe.y*axe.y+cs*(1-axe.y*axe.y);
  rt->c[1][2] = axe.y*axe.z*(1-cs)-sn*axe.x;
  rt->c[2][0] = axe.x*axe.z*(1-cs)-sn*axe.y;
  rt->c[2][1] = axe.y*axe.z*(1-cs)+sn*axe.x;
  rt->c[2][2] = axe.z*axe.z+cs*(1-axe.z*axe.z);
}

/* Construit la rotation d'angle alpha degres   */
/* autour de l'axe (ax,ay,az) passant           */
/* par l'origine                                */

Rt3D::Rt3D(float alpha,float ax,float ay,float az):TG3D() {
  Dir3D axe(ax,ay,az);
  initialisation(this,alpha,&axe);
}

/* Construit la rotation d'angle alpha degres   */
/* autour de l'axe de direction d passant       */
/* par l'origine                                */

Rt3D::Rt3D(float alpha,Dir3D *d):TG3D() {
  initialisation(this,alpha,d);
}

/* Construit le clone de la rotation rt         */

Rt3D::Rt3D(Rt3D *rt):TG3D(rt) {
}

/* Destructeur                                  */

Rt3D::~Rt3D(void) {
}
