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

#include "Vecte3D.h"
#include "Coord3D.h"
#include "Matrice.h"

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

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

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

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

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

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

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

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

void Vecte3D::produitVectoriel(Vecte3D *v,Vecte3D *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;
}

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

Vecte3D::~Vecte3D(void) {
}

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

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

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

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

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

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

void Vecte3D::multiplication(float f) {
  x *= f;
  y *= f;
  z *= f;
}

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

Vecte3D *Vecte3D::newMultiplication(float f) {
  return(new Vecte3D(x*f,y*f,z*f));
}

void Vecte3D::produit(Matrice *m) {
  m->produit(this);
}

void Vecte3D::produit(Matrice *m,Vecte3D *v) {
  m->produit(this,v);
}

Vecte3D *Vecte3D::newProduit(Matrice *m) {
  return(m->newProduit(this));
}
