/* Energie r,v,b en double precision reelle */ /* */ /* Auteur: Nicolas JANEY */ /* nicolas.janey@univ-fcomte.fr */ /* Octobre 2010 */ #include #include #include #include "Energie.h" #include "Direction3D.h" #include "Position3D.h" #include "FacetteTriangulaire.h" #include "Couleur.h" #include "LumierePonctuelle.h" Energie::Energie(void):Couleur() { } Energie::Energie(double r,double v,double b):Couleur(r,v,b) { } Energie::Energie(Energie *e):Couleur(e->r,e->v,e->b) { } Energie::~Energie(void) { } void Energie::calculDiffusion(Position3D *p,FacetteTriangulaire *fct,Couleur *kd,LumierePonctuelle *lp) { Direction3D *n = fct->normale(); Direction3D *l = new Direction3D(p,lp->p); double d = l->normalise(); double ps = l->produitScalaire(n); if ( ps < 0.0 ) { r = v = b = 0.0; } else { double i = lp->e/(d*d)*ps; r = i*kd->r*lp->c->r; v = i*kd->v*lp->c->v; b = i*kd->b*lp->c->b; } delete(l); delete(n); } void Energie::calculReflexionSpeculaire(Position3D *p,FacetteTriangulaire *fct,Couleur *kr,LumierePonctuelle *lp,Position3D *obs) { Direction3D *n = fct->normale(); Direction3D *l = new Direction3D(p,lp->p); double d = l->normalise(); Direction3D *r = l->reflexion(n); if ( !r ) { this->r = this->v = this->b = 0.0; delete(l); delete(n); return; } Direction3D *po = new Direction3D(p,obs); po->normalise(); double ps = r->produitScalaire(po); if ( ps < 0.0 ) { this->r = this->v = this->b = 0.0; } else { double i = lp->e/(d*d)*ps; this->r = i*kr->r*lp->c->r; this->v = i*kr->v*lp->c->v; this->b = i*kr->b*lp->c->b; } delete(po); delete(r); delete(l); delete(n); } void Energie::calculDiffusion(Position3D *p,Direction3D *n,Couleur *kd,LumierePonctuelle *lp) { Direction3D *l = new Direction3D(p,lp->p); double d = l->normalise(); double ps = l->produitScalaire(n); if ( ps < 0.0 ) { r = v = b = 0.0; } else { double i = lp->e/(d*d)*ps; r = i*kd->r*lp->c->r; v = i*kd->v*lp->c->v; b = i*kd->b*lp->c->b; } delete(l); } void Energie::calculReflexionSpeculaire(Position3D *p,Direction3D *n,Couleur *kr,LumierePonctuelle *lp,Position3D *obs) { Direction3D *l = new Direction3D(p,lp->p); double d = l->normalise(); Direction3D *r = l->reflexion(n); if ( !r ) { this->r = this->v = this->b = 0.0; delete(l); return; } Direction3D *po = new Direction3D(p,obs); po->normalise(); double ps = r->produitScalaire(po); if ( ps < 0.0 ) { this->r = this->v = this->b = 0.0; } else { double i = lp->e/(d*d)*ps; this->r = i*kr->r*lp->c->r; this->v = i*kr->v*lp->c->v; this->b = i*kr->b*lp->c->b; } delete(po); delete(r); delete(l); }