L'exécutable

Fichier source : MathematiquesIG1.cpp

/* Test de planarite pour une facette           */
/* a quatre sommets                             */
/*                                              */
/* Auteur: Nicolas JANEY                        */
/* nicolas.janey@univ-fcomte.fr                 */
/* Octobre 2012                                 */

#include <stdio.h>
#include <math.h>

#include "Position3D.h"
#include "Direction3D.h"

/* Fonction de test de la planarite             */
/* d'une facette à quatre sommets               */

int testPlanarite(Position3D *p1,Position3D *p2,Position3D *p3,Position3D *p4) {
  const double EPSILON = 0.000001;
  Direction3D *d12 = new Direction3D(p1,p2);
  Direction3D *d13 = new Direction3D(p1,p3);
  Direction3D *d14 = new Direction3D(p1,p4);
  d12->produitVectoriel(d13);
  double ps = d14->produitScalaire(d12);
  delete(d12);
  delete(d13);
  delete(d14);
  return(fabs(ps) < EPSILON);
}

/* Fonction principale                          */

int main(int argc,char **argv) {
  { Position3D *p1 = new Position3D(2.0,  3.0, 4.0);
    Position3D *p2 = new Position3D(6.0,  1.0, 1.0);
    Position3D *p3 = new Position3D(3.0,  7.0, 5.0);
    Position3D *p4 = new Position3D(7.0,-13.0,-5.0);
    printf("P1 : ");
    p1->print();
    printf("\n");
    printf("P2 : ");
    p2->print();
    printf("\n");
    printf("P3 : ");
    p3->print();
    printf("\n");
    printf("P4 : ");
    p4->print();
    printf("\n");
    if ( testPlanarite(p1,p2,p3,p4) )
      printf("Facette planaire\n");
      else
      printf("Facette non planaire\n");
    delete(p4);
    delete(p3);
    delete(p2);
    delete(p1); }
  printf("\n");
  { Position3D *p1 = new Position3D(2.0,  3.0, 4.0);
    Position3D *p2 = new Position3D(6.0,  1.0, 1.0);
    Position3D *p3 = new Position3D(3.0,  7.0, 5.0);
    Position3D *p4 = new Position3D(7.0,-13.0, 0.0);
    printf("P1 : ");
    p1->print();
    printf("\n");
    printf("P2 : ");
    p2->print();
    printf("\n");
    printf("P3 : ");
    p3->print();
    printf("\n");
    printf("P4 : ");
    p4->print();
    printf("\n");
    if ( testPlanarite(p1,p2,p3,p4) )
      printf("Facette planaire\n");
      else
      printf("Facette non planaire\n");
    delete(p4);
    delete(p3);
    delete(p2);
    delete(p1); }
  getchar();
  return(0);
}

Fichier source : CoordonneesHomogenes3D.h

/* Mathematiques de l'informatique graphique    */
/* Coordonnees homogenes en 3D                  */
/*                                              */
/* Auteur: Nicolas JANEY                        */
/* nicolas.janey@univ-fcomte.fr                 */
/* Octobre 2012                                 */

#ifndef ____COORDONNEESHOMOGENES3D____
#define ____COORDONNEESHOMOGENES3D____

class CoordonneesHomogenes3D  {

  public :
    double c[4];

  public :

    /* Constructeurs                            */
    CoordonneesHomogenes3D(void);
    CoordonneesHomogenes3D(double x,double y,double z,double t);
    CoordonneesHomogenes3D(CoordonneesHomogenes3D *c);

    /* Destructeur                              */
    ~CoordonneesHomogenes3D(void);

    /* Methode d'affichage texte                */
    void print(void);
};

#endif

Fichier source : CoordonneesHomogenes3D.cpp

/* Mathematiques de l'informatique graphique    */
/* Coordonnees homogenes en 3D                  */
/*                                              */
/* Auteur: Nicolas JANEY                        */
/* nicolas.janey@univ-fcomte.fr                 */
/* Octobre 2012                                 */

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include "CoordonneesHomogenes3D.h"

/* Constructeurs                                */

CoordonneesHomogenes3D::CoordonneesHomogenes3D(void) {
  c[0] = c[1] = c[2] = 0.0;
  c[3] = 1.0;
}

CoordonneesHomogenes3D::CoordonneesHomogenes3D(double x,double y,double z,double t) {
  c[0] = x;
  c[1] = y;
  c[2] = z;
  c[3] = t;
}

CoordonneesHomogenes3D::CoordonneesHomogenes3D(CoordonneesHomogenes3D *ch) {
  c[0] = ch->c[0];
  c[1] = ch->c[1];
  c[2] = ch->c[2];
  c[3] = ch->c[3];
}

/* Destructeur                                  */

CoordonneesHomogenes3D::~CoordonneesHomogenes3D(void) {
}

/* Methode d'affichage texte                    */

void CoordonneesHomogenes3D::print(void) {
  printf("%10.4lf %10.4lf %10.4lf %10.4lf",c[0],c[1],c[2],c[3]);
}

Fichier source : Position3D.h

/* Mathematiques de l'informatique graphique    */
/* Position en 3D                               */
/*                                              */
/* Auteur: Nicolas JANEY                        */
/* nicolas.janey@univ-fcomte.fr                 */
/* Octobre 2012                                 */

#ifndef ____POSITION3D____
#define ____POSITION3D____

#include "CoordonneesHomogenes3D.h"

class Position3D : public CoordonneesHomogenes3D {

  public :

    /* Constructeurs                            */
    Position3D(void);
    Position3D(double x,double y,double z);
    Position3D(Position3D *c);

    /* Destructeur                              */
    ~Position3D(void);

    /* Methode de calcul de la distance         */
    /* entre deux positions                     */
    double distance(Position3D *p);

    /* Methode de calcul du carre               */
    /* de la distance entre deux positions      */
    double carreDistance(Position3D *p);
};

#endif

Fichier source : Position3D.cpp

/* Mathematiques de l'informatique graphique    */
/* Position en 3D                               */
/*                                              */
/* Auteur: Nicolas JANEY                        */
/* nicolas.janey@univ-fcomte.fr                 */
/* Octobre 2012                                 */

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include "CoordonneesHomogenes3D.h"
#include "Position3D.h"

/* Constructeurs                                */

Position3D::Position3D(void):CoordonneesHomogenes3D(0.0,0.0,0.0,1.0) {
}

Position3D::Position3D(double x,double y,double z):CoordonneesHomogenes3D(x,y,z,1.0) {
}

Position3D::Position3D(Position3D *p):CoordonneesHomogenes3D(p) {
}

/* Destructeur                                  */

Position3D::~Position3D(void) {
}

/* Methode de calcul de la distance             */
/* entre deux positions                         */

double Position3D::distance(Position3D *p) {
  return(sqrt(carreDistance(p)));
}

/* Methode de calcul du carre de la distance    */
/* entre deux positions                         */

double Position3D::carreDistance(Position3D *p) {
  double dx = p->c[0]-c[0];
  double dy = p->c[1]-c[1];
  double dz = p->c[2]-c[2];
  return(dx*dx+dy*dy+dz*dz);
}

Fichier source : Direction3D.h

/* Mathematiques de l'informatique graphique    */
/* Direction en 3D                              */
/*                                              */
/* Auteur: Nicolas JANEY                        */
/* nicolas.janey@univ-fcomte.fr                 */
/* Octobre 2012                                 */

#ifndef ____DIRECTION3D____
#define ____DIRECTION3D____

class Position3D;

#include "CoordonneesHomogenes3D.h"

class Direction3D : public CoordonneesHomogenes3D {

  public :

    /* Constructeurs                            */
    Direction3D(void);
    Direction3D(double x,double y,double z);
    Direction3D(Direction3D *c);
    Direction3D(Position3D *p1,Position3D *p2);

    /* Destructeur                              */
    ~Direction3D(void);

    /* Methode de calcul de la norme            */
    double norme(void);

    /* Methode de normalisation                 */
    double normalisation(void);

    /* Methode de calcul du produit scalaire    */
    /* de deux directions                       */
    double produitScalaire(Direction3D *d);

    /* Methode de calcul du produit vectoriel   */
    /* de deux directions                       */
    void produitVectoriel(Direction3D *d1,Direction3D *d2);

    /* Methode de calcul du produit vectoriel   */
    /* de this par une direction                */
    void produitVectoriel(Direction3D *d);
};

#endif

Fichier source : Direction3D.cpp

/* Mathematiques de l'informatique graphique    */
/* Direction en 3D                              */
/*                                              */
/* Auteur: Nicolas JANEY                        */
/* nicolas.janey@univ-fcomte.fr                 */
/* Octobre 2012                                 */

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include "CoordonneesHomogenes3D.h"
#include "Direction3D.h"
#include "Position3D.h"

/* Constructeurs                                */

Direction3D::Direction3D(void):CoordonneesHomogenes3D(0.0,0.0,0.0,0.0) {
}

Direction3D::Direction3D(double x,double y,double z):CoordonneesHomogenes3D(x,y,z,0.0) {
}

Direction3D::Direction3D(Direction3D *p):CoordonneesHomogenes3D(p) {
}

Direction3D::Direction3D(Position3D *p1,Position3D *p2):CoordonneesHomogenes3D() {
  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 this par une direction                    */

void Direction3D::produitVectoriel(Direction3D *d) {
  double x = c[1]*d->c[2] - c[2]*d->c[1];
  double y = c[2]*d->c[0] - c[0]*d->c[2];
  double z = c[0]*d->c[1] - c[1]*d->c[0];
  c[0] = x;
  c[1] = y;
  c[2] = z;
  c[3] = 0.0;
}

RETOUR