Commentaires

La fonction modeliseCubeEnFilDeFer utilise une primitive OpenGL GL_LINES. Douze couples de sommets y sont créés pour modéliser les 12 arrêtes. Les coordonnées utilisées pour ces sommets sont les coordonnées extraites du tableau pCube aux indices trouvés dans le tableau iCube, chacune de ces coordonnées étant transformée par la transformation géométrique tg.

La fonction display utilise les variables globales de stockage des paramètres numériques de modélisation pour créer une transformation géométrique trz de placement-orientation-dimensionnement par instanciation de la classe TRZ3D, puis appelle la fonction de modélisation de cube en fil de fer transformé par trz et enfin libère trz par delete.

La classe TRZ3D a été développée classiquement par dérivation de la classe TG3D. Le constructeur de composition implante complétement le produit matriciel car la méthode de composition de la classe TG3D est déclaré en private et je n'ai pas souhaité remettre en cause ce choix.

L'exécutable

Fichier source : Mathematiques3Bis.cpp

Tous les fichiers sources : Mathematiques3.zip

static Dir3D tr;
static float angle = 0.0F;
static Dir3D axeR(1.0F,0.0F,0.0F);
static float scx = 1.0F;
static float scy = 1.0F;
static float scz = 1.0F;

/* Modelisation en fil de fer d'un cube         */
/* transforme par la TG3D tg                    */

static void modeliseCubeEnFilDeFer(TG3D *tg) {
  Pos3D pCube[8] = { Pos3D( 0.5F, 0.5F, 0.5F),
                     Pos3D(-0.5F, 0.5F, 0.5F),
                     Pos3D( 0.5F,-0.5F, 0.5F),
                     Pos3D( 0.5F, 0.5F,-0.5F),
                     Pos3D( 0.5F,-0.5F,-0.5F),
                     Pos3D(-0.5F, 0.5F,-0.5F),
                     Pos3D(-0.5F,-0.5F, 0.5F),
                     Pos3D(-0.5F,-0.5F,-0.5F) };
  int iCube [12][2] = { { 0,1 },
                        { 0,2 },
                        { 0,3 },
                        { 1,6 },
                        { 1,5 },
                        { 2,4 },
                        { 2,6 },
                        { 3,4 },
                        { 3,5 },
                        { 7,6 },
                        { 7,5 },
                        { 7,4 } } ;
  glBegin(GL_LINES);
  for ( int i = 0 ; i < 12 ; i++ ) {
    Pos3D p0(&pCube[iCube[i][0]]);
    Pos3D p1(&pCube[iCube[i][1]]);
    p0.transformation(tg);
    p1.transformation(tg);
    glVertex3f(p0.x,p0.y,p0.z);
    glVertex3f(p1.x,p1.y,p1.z); } 
  glEnd();
}

/* Fonction executee lors d'un rafraichissement */
/* de la fenetre de dessin                      */

static void display(void) {
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glPushMatrix();
  TRZ3D trz(&tr,angle,&axeR,scx,scy,scz);
  modeliseCubeEnFilDeFer(&trz);
  glPopMatrix();
  glutSwapBuffers();
  int error = glGetError();
  if ( error != GL_NO_ERROR )
    printf("Erreur OpenGL: %d\n",error);
}

Fichier source : TRZ3D.h

/* Mathematiques de l'informatique graphique    */
/* Transformation geometrique de composition    */
/* d'une translation, d'une rotation            */
/* et d'un zoom en coordonnees homogenes        */
/*                                              */
/* Auteur: Nicolas JANEY                        */
/* nicolas.janey@univ-fcomte.fr                 */
/* Mars 2020                                    */

#ifndef ____TRZ3D____
#define ____TRZ3D____

#include "TG3D.h"

class Dir3D;

class TRZ3D : public TG3D {

  public :

    /* Construit la TRZ3D identite              */

    TRZ3D(void);

    /* Construit la TRZ3D obtenue               */
    /* par composition                          */
    /* de la translation de direction tr,       */
    /* de la rotation de angle degres           */
    /* autour de l'axe de direction axe         */
    /* passant par l'origine,                   */
    /* et du zoom de rapports rx, ry et rz      */

    TRZ3D(Dir3D *tr,float angle,Dir3D *axe,float rx,float ry,float rz);

    /* Construit le clone de la TRZ3D trz       */

    TRZ3D(TRZ3D *tzr);

    /* Destructeur                              */

    ~TRZ3D(void);
};

#endif

Fichier source : TRZ3D.cpp

/* Mathematiques de l'informatique graphique    */
/* Transformation geometrique de composition    */
/* d'une translation, d'une rotation            */
/* et d'un zoom en coordonnees homogenes        */
/*                                              */
/* Auteur: Nicolas JANEY                        */
/* nicolas.janey@univ-fcomte.fr                 */
/* Mars 2020                                    */

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

#include "TG3D.h"
#include "Tr3D.h"
#include "Rt3D.h"
#include "Sc3D.h"
#include "Dir3D.h"
#include "TRZ3D.h"

/* Construit la TRZ3D identite                  */

TRZ3D::TRZ3D(void):TG3D() {
}

/* Construit la TRZ3D obtenue par composition   */
/* de la translation de direction tr,           */
/* de la rotation de angle degres               */
/* autour de l'axe de direction axe             */
/* passant par l'origine,                       */
/* et du zoom de rapports rx, ry et rz          */

TRZ3D::TRZ3D(Dir3D *tr,float angle,Dir3D *axe,float rx,float ry,float rz) {
  Tr3D translation(tr);
  Rt3D rotation(angle,axe);
  Sc3D scale(rx,ry,rz);
  TG3D tg(&translation,&rotation);
  for ( int i = 0 ; i < 4 ; i++ )
    for ( int j = 0 ; j < 4 ; j++ ) {
      c[i][j] = 0.0;
      for ( int k = 0 ; k < 4 ; k++ )
        c[i][j] += tg.c[i][k]*scale.c[k][j]; } 
}

/* Construit le clone de la TRZ3D trz           */

TRZ3D::TRZ3D(TRZ3D *trz):TG3D(trz) {
}

/* Destructeur                                  */

TRZ3D::~TRZ3D(void) {
}

RETOUR