/* Mathematiques de l'informatique graphique    */
/* Rotation 3D                                  */
/*                                              */
/* Auteur: Nicolas JANEY                        */
/* nicolas.janey@univ-fcomte.fr                 */
/* Octobre 2012                                 */

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

#include "TransformationGeometrique3D.h"
#include "Rotation3D.h"
#include "Direction3D.h"

#ifndef M_PI
#define M_PI 3.14159265358979323846264338327950288
#endif

/* Constructeurs                                */

Rotation3D::Rotation3D(void):TransformationGeometrique3D() {
}

Rotation3D::Rotation3D(double angle,double ax,double ay,double az):TransformationGeometrique3D() {
  Direction3D v(ax,ay,az);
  v.normalisation();
  double aa = angle/180.0*M_PI;
  float sn =(float) sin(aa);
  float cs =(float) cos(aa);
  c[0][0] = v.c[0]*v.c[0]+cs*(1-v.c[0]*v.c[0]);
  c[0][1] = v.c[0]*v.c[1]*(1-cs)-sn*v.c[2];
  c[0][2] = v.c[0]*v.c[2]*(1-cs)+sn*v.c[1];
  c[1][0] = v.c[0]*v.c[1]*(1-cs)+sn*v.c[2];
  c[1][1] = v.c[1]*v.c[1]+cs*(1-v.c[1]*v.c[1]);
  c[1][2] = v.c[1]*v.c[2]*(1-cs)-sn*v.c[0];
  c[2][0] = v.c[0]*v.c[2]*(1-cs)-sn*v.c[1];
  c[2][1] = v.c[1]*v.c[2]*(1-cs)+sn*v.c[0];
  c[2][2] = v.c[2]*v.c[2]+cs*(1-v.c[2]*v.c[2]);
}

/* Destructeur                                  */

Rotation3D::~Rotation3D(void) {
}
