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

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

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

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

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

Coord3D::~Coord3D(void) {
}

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

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

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

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

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

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

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

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

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