L'exécutable

 

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);
}

RETOUR