Rayon incident en jaune, normale en magenta, rayon réfléchi en rouge, rayon transmis en bleu
ni > nt -> Rayon transmis dévié vers le plan d'interface
ni < nt -> Rayon transmis dévié vers le vecteur opposé au vecteur normal
Cas particulier: Pas de rayon transmis
Fichier source principal : ReflexionEtTransmission.cpp
Fichiers de l'application : ReflexionEtTransmission.zip
Classes mathématiques : Mathematiques.zip
/* Methode de calcul de la direction */
/* de reflexion speculaire a partir */
/* de la direction d'incidence i */
/* et de la normale n au point d'incidence */
/* Affectation du resultat a this */
bool reflexion(Dir3D *i,Dir3D *n);
/* Methode de calcul de la direction */
/* de transmission a partir */
/* de la direction d'incidence i, */
/* de la normale n au point d'incidence */
/* et du rapport niSurNt calcule entre */
/* les coefficients de refraction */
/* des milieux d'incidence */
/* et de transmission */
/* Affectation du resultat a this */
bool transmission(Dir3D *i,Dir3D *n,float niSurNt);
/* Methode de calcul de la direction */
/* de reflexion speculaire a partir */
/* de la direction d'incidence i */
/* et de la normale n au point d'incidence */
/* Affectation du resultat a this */
bool Dir3D::reflexion(Dir3D *i,Dir3D *n) {
float ps = i->produitScalaire(n);
if ( ps < 0.0 ) return(false);
x = 2.0F*ps*n->x-i->x;
y = 2.0F*ps*n->y-i->y;
z = 2.0F*ps*n->z-i->z;
return(true);
}
/* Methode de calcul de la direction */
/* de transmission a partir */
/* de la direction d'incidence i, */
/* de la normale n au point d'incidence */
/* et du rapport niSurNt calcule entre */
/* les coefficients de refraction */
/* des milieux d'incidence et de transmission */
/* Affectation du resultat a this */
bool Dir3D::transmission(Dir3D *i,Dir3D *n,float niSurNt) {
float ps = i->produitScalaire(n);
float v = 1.0F-(niSurNt*niSurNt*(1.0F-ps*ps));
if ( v < 0.0 ) return(false);
v =(float) (niSurNt*ps-sqrt(v));
x = v*n->x - niSurNt*i->x;
y = v*n->y - niSurNt*i->y;
z = v*n->z - niSurNt*i->z;
return(true);
}