/* Mathematiques de l'informatique graphique */ /* Direction en 3D */ /* */ /* Auteur: Nicolas JANEY */ /* nicolas.janey@univ-fcomte.fr */ /* Octobre 2011 */ #include #include #include #include "CoordonneesHomogenes.h" #include "Direction3D.h" #include "Position3D.h" /* Constructeurs */ Direction3D::Direction3D(void):CoordonneesHomogenes(0.0,0.0,0.0,0.0) { } Direction3D::Direction3D(double x,double y,double z):CoordonneesHomogenes(x,y,z,0.0) { } Direction3D::Direction3D(Direction3D *p):CoordonneesHomogenes(p) { } Direction3D::Direction3D(Position3D *p1,Position3D *p2):CoordonneesHomogenes() { c[0] = p2->c[0]-p1->c[0]; c[1] = p2->c[1]-p1->c[1]; c[2] = p2->c[2]-p1->c[2]; c[3] = 0.0; } /* Destructeur */ Direction3D::~Direction3D(void) { } /* Methode de calcul de la norme */ double Direction3D::norme(void) { return(sqrt(c[0]*c[0]+c[1]*c[1]+c[2]*c[2])); } /* Methode de normalisation */ double Direction3D::normalisation(void) { double d = norme(); if ( d != 0.0 ) { c[0] /= d; c[1] /= d; c[2] /= d; } return(d); } /* Methode de calcul du produit scalaire */ /* de deux directions */ double Direction3D::produitScalaire(Direction3D *d) { return(c[0]*d->c[0]+c[1]*d->c[1]+c[2]*d->c[2]); } /* Methode de calcul du produit vectoriel */ /* de deux directions */ void Direction3D::produitVectoriel(Direction3D *d1,Direction3D *d2) { double x = d1->c[1]*d2->c[2] - d1->c[2]*d2->c[1]; double y = d1->c[2]*d2->c[0] - d1->c[0]*d2->c[2]; double z = d1->c[0]*d2->c[1] - d1->c[1]*d2->c[0]; c[0] = x; c[1] = y; c[2] = z; c[3] = 0.0; } /* Methode de calcul du produit vectoriel */ /* de deux directions */ Direction3D *Direction3D::produitVectoriel(Direction3D *d) { return(new Direction3D(c[1]*d->c[2] - c[2]*d->c[1], c[2]*d->c[0] - c[0]*d->c[2], c[0]*d->c[1] - c[1]*d->c[0])); } bool Direction3D::reflechi(Direction3D *i,Direction3D *n) { double ps = i->produitScalaire(n); if ( ps < 0.0 ) return(false); c[0] = 2.0*ps*n->c[0]-i->c[0]; c[1] = 2.0*ps*n->c[1]-i->c[1]; c[2] = 2.0*ps*n->c[2]-i->c[2]; c[3] = 0.0; return(true); } bool Direction3D::transmis(Direction3D *i,Direction3D *n,double rp) { double ps = i->produitScalaire(n); double fact = 1.0-rp*rp*(1.0-ps*ps); if ( fact < 0.0 ) return(false); fact = rp*ps-sqrt(fact); c[0] = fact*n->c[0]-rp*i->c[0]; c[1] = fact*n->c[1]-rp*i->c[1]; c[2] = fact*n->c[2]-rp*i->c[2]; c[3] = 0.0; return(true); }