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 transformationModelisation construit la transformation géométrique retournée en composant trois transformations translation, rotation et zoom instanciées au moyen des paramètres d'entête.

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 utilisation de la fonction transformationModelisation, puis appelle la fonction de modélisation de cube en fil de fer transformé par trz et enfin libère trz par delete.

L'exécutable

Fichier source : Mathematiques3.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();
}

/* Calcul et retour de la TG3D 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          */

static TG3D *transformationModelisation(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);
  return(new TG3D(&tg,&scale));
}

/* 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();
  TG3D *trz = transformationModelisation(&tr,angle,&axeR,scx,scy,scz);
  modeliseCubeEnFilDeFer(trz);
  delete(trz);
  glPopMatrix();
  glutSwapBuffers();
  int error = glGetError();
  if ( error != GL_NO_ERROR )
    printf("Erreur OpenGL: %d\n",error);
}

RETOUR