/**
 * \file Vecte3DD.cpp
 * Classe de modelisation de directions dans un espace 3 dimensions.
 * 
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */

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

#include "Vecte3DD.h"
#include "Coord3DD.h"
#include "MatriceD.h"

Vecte3DD::Vecte3DD(void) {
  x = y = z = t = 0.0F;
}

Vecte3DD::Vecte3DD(double xx,double yy,double zz) {
  x = xx;
  y = yy;
  z = zz;
  t = 0.0F;
}

Vecte3DD::Vecte3DD(Vecte3DD *a) {
  x = a->x;
  y = a->y;
  z = a->z;
  t = a->t;
}

Vecte3DD::Vecte3DD(Coord3DD *p1,Coord3DD *p2) {
  x = p2->x-p1->x;
  y = p2->y-p1->y;
  z = p2->z-p1->z;
  t = 0.0F;
}

void Vecte3DD::toVecteur(Coord3DD *p1,Coord3DD *p2) {
  x = p2->x-p1->x;
  y = p2->y-p1->y;
  z = p2->z-p1->z;
  t = 0.0F;
}

double Vecte3DD::norme(void) {
  double d2 =(double) pow((double) x*x + y*y + z*z,0.5) ;
  return(d2);
}

void Vecte3DD::normalise(void) {
  double d2 = norme() ;
  if ( d2 != 0 ) {
    x /= d2 ;
    y /= d2 ;
    z /= d2 ; }
}

double Vecte3DD::produitScalaire(Vecte3DD *d) {
  return(x*d->x + y*d->y + z*d->z) ;
}

void Vecte3DD::produitVectoriel(Vecte3DD *v,Vecte3DD *r) {
  r->x = y*v->z - z*v->y;
  r->y = z*v->x - x*v->z;
  r->z = x*v->y - y*v->x;
  r->t = 0.0F;
}

Vecte3DD *Vecte3DD::newProduitVectoriel(Vecte3DD *v) {
  Vecte3DD *r = new Vecte3DD();
  produitVectoriel(v,r);
  return(r);
}

Vecte3DD::~Vecte3DD(void) {
}

void Vecte3DD::addition(Vecte3DD *v) {
  x += v->x;
  y += v->y;
  z += v->z;
}

void Vecte3DD::addition(Vecte3DD *v,Vecte3DD *r) {
  r->x = x + v->x;
  r->y = y + v->y;
  r->z = z + v->z;
}

Vecte3DD *Vecte3DD::newAddition(Vecte3DD *v) {
  return(new Vecte3DD(x + v->x,y + v->y,z + v->z));
}

void Vecte3DD::soustraction(Vecte3DD *v) {
  x -= v->x;
  y -= v->y;
  z -= v->z;
}

void Vecte3DD::soustraction(Vecte3DD *v,Vecte3DD *r) {
  r->x = x - v->x;
  r->y = y - v->y;
  r->z = z - v->z;
}

Vecte3DD *Vecte3DD::newSoustraction(Vecte3DD *v) {
  return(new Vecte3DD(x - v->x,y - v->y,z - v->z));
}

void Vecte3DD::multiplication(double f) {
  x *= f;
  y *= f;
  z *= f;
}

void Vecte3DD::multiplication(double f,Vecte3DD *r) {
  r->x = x*f;
  r->y = y*f;
  r->z = z*f;
}

Vecte3DD *Vecte3DD::newMultiplication(double f) {
  return(new Vecte3DD(x*f,y*f,z*f));
}

/**
 * Produit d'une MatriceD par this avec stockage dans this.
 *
 * @param m La MatriceD de multiplication.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
void Vecte3DD::produit(MatriceD *m) {
  m->produit(this);
}

/**
 * Produit d'une MatriceD par this avec stockage dans un Vecte3DD.
 *
 * @param m La MatriceD de multiplication.
 * @param v Le Vecte3DD de stockage du resultat.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
void Vecte3DD::produit(MatriceD *m,Vecte3DD *v) {
  m->produit(this,v);
}

Vecte3DD *Vecte3DD::newProduit(MatriceD *m) {
  return(m->newProduit(this));
}
