Rayon incident en jaune, normale en magenta, rayon réfléchi en rouge, rayon transmis en bleu (dévié vers le plan d'interface)
Rayon transmis dévié vers le vecteur opposé au vecteur normal
Pas de rayon transmis
Fichier source : RayonLumineux.h
/* Stockage d'un rayon lumineux */
/* */
/* Auteur: Nicolas JANEY */
/* nicolas.janey@univ-fcomte.fr */
/* Novembre 2012 */
#ifndef ____RAYONLUMINEUX____
#define ____RAYONLUMINEUX____
class Position3D;
class Direction3D;
class RayonLumineux {
public :
Position3D *src;
Direction3D *dir;
public :
/* Constructeurs */
RayonLumineux(void);
RayonLumineux(RayonLumineux *rl);
/* Destructeur */
~RayonLumineux(void);
};
#endif
Fichier source : RayonLumineux.cpp
/* Stockage d'un rayon lumineux */
/* */
/* Auteur: Nicolas JANEY */
/* nicolas.janey@univ-fcomte.fr */
/* Novembre 2012 */
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "RayonLumineux.h"
#include "Position3D.h"
#include "Direction3D.h"
/* Constructeurs */
RayonLumineux::RayonLumineux(void) {
src = new Position3D();
dir = new Direction3D();
}
RayonLumineux::RayonLumineux(RayonLumineux *rl) {
src = new Position3D(rl->src);
dir = new Direction3D(rl->dir);
}
/* Destructeur */
RayonLumineux::~RayonLumineux(void) {
delete(src);
delete(dir);
}
Fichier source : ReflexionEtTransmission.cpp
Fichier source : Direction3D.h
/* Methode de calcul de la direction */
/* de reflexion d'un rayon lumineux */
int reflexion(Direction3D *i,Direction3D *n);
/* Methode de calcul de la direction */
/* de transmission d'un rayon lumineux */
int transmission(Direction3D *i,Direction3D *n,double ni,double nt);
Fichier source : Direction3D.cpp
/* Methode de calcul de la direction */
/* de reflexion d'un rayon lumineux */
int Direction3D::reflexion(Direction3D *i,Direction3D *n) {
double ps = i->produitScalaire(n);
if ( ps < 0.0 )
return(0);
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];
return(1);
}
/* Methode de calcul de la direction */
/* de transmission d'un rayon lumineux */
int Direction3D::transmission(Direction3D *i,Direction3D *n,double ni,double nt) {
double ps = i->produitScalaire(n);
if ( ps < 0.0 )
return(0);
double nr = ni/nt;
double v = 1.0-nr*nr*(1.0-ps*ps);
if ( v < 0.0 )
return(0);
v = nr*ps-sqrt(v);
c[0] = v*n->c[0]-nr*i->c[0];
c[1] = v*n->c[1]-nr*i->c[1];
c[2] = v*n->c[2]-nr*i->c[2];
return(1);
}