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

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

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

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

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

Coord3DD::~Coord3DD(void) {
}

Vecte3DD *Coord3DD::newVecteur(Coord3DD *p1,Coord3DD *p2) {
  Vecte3DD *v = new Vecte3DD();
  v->toVecteur(p1,p2);
  return(v);
}

Vecte3DD *Coord3DD::newVecteur(Coord3DD *p) {
  Vecte3DD *v = new Vecte3DD();
  v->toVecteur(this,p);
  return(v);
}

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

double Coord3DD::distance(Coord3DD *v) {
  double dx = x-v->x;
  double dy = y-v->y;
  double dz = z-v->z;
  return((double) pow(dx*dx+dy*dy+dz*dz,0.5));
}

void Coord3DD::produit(MatriceD *m) {
  m->produit(this);
}

void Coord3DD::produit(MatriceD *m,Coord3DD *v) {
  m->produit(this,v);
}

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

void Coord3DD::affichage(void) {
  printf("%10.5f %10.5f %10.5f %10.5f\n",x,y,z,t);
}

void Coord3DD::roundXYZ(void) {
  { double v = floor(x+0.5F);
    if ( fabs(v-x) < 0.0001 )
      x = v; }
  { double v = floor(y+0.5F);
    if ( fabs(v-y) < 0.0001 )
      y = v; }
  { double v = floor(z+0.5F);
    if ( fabs(v-z) < 0.0001 )
      z = v; }
}
