Marching cube et marching tetrahedra

Contenu du snippet

Représentation d’isosurface

L’algorithme du Marching Cubes a été inventé par Bill LORENSEN et Harvey CLINE. Il s’agit d’une méthode surfacique permettant d’extraire une surface équipotentielle (isosurface) d’un maillage structuré et uniforme 3D.

Source / Exemple :


/***** 

  • LIBRAIRIES
*
          • /
#include "glut.h" #include "glu.h" #include <math.h> #include <stdio.h> /*****
  • ALIAS
*
          • /
#define TAILLECELLULE 8 // Taille des cellules #define RESOLUTION 55 // Finesse #define TAILLE 11 // Taille nbr impaire // image sur site taille = 15 et 5 /*****
  • STRUCTURES
*
          • /
// Point 3D typedef struct { GLfloat x; GLfloat y; GLfloat z; } Point3D; // Cellule // 8 sommets et 8 valeurs typedef struct { Point3D p[TAILLECELLULE]; GLfloat val[TAILLECELLULE]; } Cellule; // Triangle3D // 3 sommets typedef struct { Point3D p[3]; } Triangle3D; /*****
  • VARIABLES
*
          • /
GLfloat isovaleur = 5 ;//(TAILLE/2)-1; GLint taille = TAILLE ; GLint loop = 0 ; GLint n = 0 ; GLint nb = 0 ; GLint affiche = 1 ; // affichage des cubes GLint numeroCube = 0 ; GLint formes = 0 ; // dessin des formes GLint type = 0 ; // choix de l'algo Cube ou Tetra Cellule c ; Point3D PointInter[RESOLUTION]; // points d'intersection // positionnement static GLfloat theta[] = {.0, .0, .0} ; // angularisation static GLint axis = 2 ; // axes static GLdouble viewer[] = {10.0, 15.0, 0.0}; // vue // aspect // Modele 1 GLfloat ambient [] = { 0.5, 0.5, 0.5, 1.0}; GLfloat diffuse [] = { 0.9, 0.2, 0.5, 1.0 }; GLfloat specular [] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat shininess[] = { 100. }; // affichage des polygones GLenum ePolygonMode = GL_FILL; // mise en place de la lumière GLfloat light_position[] = { -2.5, -2.5, -2.5, .0 }; /*****
  • PROTOTYPES
*
          • /
void display(void); void MyInit(void); /*****
  • TABLEAUX
*
          • /
// Normales GLfloat normals[][3] = { {-1.0,-1.0,-1.0}, { 1.0,-1.0,-1.0}, { 1.0, 1.0,-1.0}, {-1.0, 1.0,-1.0}, {-1.0,-1.0, 1.0}, { 1.0,-1.0, 1.0}, { 1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0} }; // Triangle // arête => points extrémités GLint TableDesTriangles[256][16] = { {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1}, { 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1}, { 3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1}, { 3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1}, { 9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1}, { 1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1}, { 9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1}, { 2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1}, { 8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1}, { 9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, { 4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1}, { 3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1}, { 1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1}, { 4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1}, { 4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1}, { 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1}, { 1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, { 5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1}, { 2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1}, { 9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, { 0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, { 2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1}, {10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1}, { 4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1}, { 5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1}, { 5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1}, { 9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1}, { 0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1}, { 1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1}, {10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1}, { 8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1}, { 2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1}, { 7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1}, { 9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1}, { 2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1}, {11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1}, { 9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1}, { 5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1}, {11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1}, {11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, { 1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1}, { 9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1}, { 5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1}, { 2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, { 5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1}, { 6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1}, { 0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1}, { 3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1}, { 6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1}, { 5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1}, { 1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1}, {10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1}, { 6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1}, { 1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1}, { 8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1}, { 7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1}, { 3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1}, { 5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1}, { 0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1}, { 9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1}, { 8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1}, { 5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1}, { 0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1}, { 6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1}, {10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1}, {10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1}, { 8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1}, { 1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1}, { 3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1}, { 0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1}, {10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1}, { 0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1}, { 3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1}, { 6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1}, { 9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1}, { 8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1}, { 3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1}, { 6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1}, { 0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1}, {10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1}, {10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1}, { 1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1}, { 2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1}, { 7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1}, { 7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1}, { 2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1}, { 1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1}, {11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1}, { 8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1}, { 0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1}, { 7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, {10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, { 2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, { 6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1}, { 7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1}, { 2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1}, { 1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1}, {10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1}, {10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1}, { 0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1}, { 7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1}, { 6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1}, { 8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1}, { 9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1}, { 6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1}, { 1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1}, { 4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1}, {10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1}, { 8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1}, { 0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1}, { 1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1}, { 8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1}, {10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1}, { 4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1}, {10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, { 5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, {11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1}, { 9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, { 6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1}, { 7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1}, { 3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1}, { 7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1}, { 9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1}, { 3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1}, { 6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1}, { 9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1}, { 1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1}, { 4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1}, { 7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1}, { 6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1}, { 3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1}, { 0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1}, { 6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1}, { 1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1}, { 0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1}, {11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1}, {6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1}, {5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1}, {9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1}, {1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1}, {1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1}, {10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1}, {0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1}, {5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1}, {10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1}, {11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1}, {9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1}, {7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1}, {2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1}, {8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1}, {9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1}, {9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1}, {1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1}, {9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1}, {9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1}, {5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1}, {0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1}, {10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1}, {2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1}, {0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1}, {0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1}, {9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1}, {5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1}, {3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1}, {5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1}, {8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1}, {0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1}, {9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1}, {1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1}, {3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1}, {4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1}, {9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1}, {11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1}, {11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1}, {2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1}, {9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1}, {3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1}, {1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1}, {4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1}, {4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1}, {3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1}, {0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1}, {9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1}, {1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1} }; GLint TableDesCubes[15][16] = { {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 10, 11, 1, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 3, 11, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 3, 11, 4, 5, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 3, 10, 3, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1}, {3, 10, 11, 1, 3, 10, 4, 5, 9, -1, -1, -1, -1, -1, -1, -1}, {6, 7, 11, 1, 2, 10, 4, 5, 9, -1, -1, -1, -1, -1, -1, -1}, {8, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 7, 11, 2, 4, 11, 2, 4, 9, 1, 2, 9, -1, -1, -1, -1}, {2, 3, 6, 3, 6, 7, 0, 1, 5, 0, 4, 5, -1, -1, -1, -1}, {2, 8, 11, 4, 5, 8, 2, 5, 8, 1, 2, 5, -1, -1, -1, -1}, {6, 7, 11, 2, 3, 10, 3, 8, 10, 8, 9, 10, -1, -1, -1, -1}, {4, 7, 8, 2, 3, 11, 5, 6, 10, 0, 1, 9, -1, -1, -1, -1}, {2, 3, 7, 2, 7, 9, 2, 9, 10, 4, 7, 9, -1, -1, -1, -1} }; GLint TableDesAretes[256] = { 0x000, 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00, 0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90, 0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c, 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30, 0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac, 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0, 0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c, 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60, 0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc, 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0, 0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c, 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950, 0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc , 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0, 0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc, 0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0, 0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c, 0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650, 0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc, 0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0, 0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c, 0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460, 0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac, 0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0, 0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c, 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230, 0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c, 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190, 0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c, 0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x000}; GLfloat Couleur[6][3] = { {0.5,0.0,0.7}, {0.2,0.2,0.6}, {0.0,0.5,0.5}, {0.0,0.6,0.5}, {0.8,0.3,0.0}, {1.0,1.0,0.0} }; //------------------------------------------ INIT ----------------------------------------- // Fonction qui initialise les valeurs des sommets de la cellule pour extraire une sphère void initValSphere(void) { GLint i; for(i=0; i<8; i++) { c.val[i] = sqrt( (c.p[i].x * c.p[i].x) + (c.p[i].y * c.p[i].y) + (c.p[i].z * c.p[i].z) ); } } // Fonction qui initialise les valeurs des sommets de la cellule pour extraire un cylindre void initValCercle(void) { GLint i; for(i=0; i<8; i++) { c.val[i] = sqrt( (c.p[i].x * c.p[i].x) + (c.p[i].z * c.p[i].z) ); } } // Fonction qui initialise les valeurs des sommets de la cellule pour extraire une croix void initValCroix(void) { GLint i; for(i=0; i<8; i++) { // croix isovaleur = 2; c.val[i] = sqrt( ((cos (c.p[i].x )/ c.p[i].x))*((cos (c.p[i].x )/ c.p[i].x)) + ((cos (c.p[i].y )/ c.p[i].y))*((cos (c.p[i].y )/ c.p[i].y))+ ((cos (c.p[i].z )/ c.p[i].z))*((cos (c.p[i].z )/ c.p[i].z)) ); } } void initValForme(void) { GLint i; float a , b ; a= 2; b=2.; for(i=0; i<8; i++) { c.val[i] = sqrt( (c.p[i].y * c.p[i].y) + (c.p[i].z * c.p[i].z))
  • ((c.p[i].x)*5);
} } // Initialisation du cube void initCube(float taille, float x, float y, float z) { c.p[0].x = x; c.p[0].y = y; c.p[0].z = z; c.p[1].x = taille+x; c.p[1].y = y; c.p[1].z = z; c.p[2].x = taille+x; c.p[2].y = y; c.p[2].z = taille+z; c.p[3].x = x; c.p[3].y = y; c.p[3].z = taille+z; c.p[4].x = x; c.p[4].y = taille+y; c.p[4].z = z; c.p[5].x = taille+x; c.p[5].y = taille+y; c.p[5].z = z; c.p[6].x = taille+x; c.p[6].y = taille+y; c.p[6].z = taille+z; c.p[7].x = x; c.p[7].y = taille+y; c.p[7].z = taille+z; } //---------------------------------------- MARCHING --------------------------------------- // Fonction d'interpolation entre deux points Point3D InterpolLineaire(double Isovaleur, Point3D P1, Point3D P2, double V1, double V2){ GLdouble distance; Point3D P; // cas extreme if((Isovaleur<V1 && Isovaleur<V2) || (Isovaleur>V1 && Isovaleur>V2)){ return P1; } else{ // recherche du rapport distance = (Isovaleur-V1)/(V2-V1); // calcul des coordonnees de P P.x = distance * (P2.x - P1.x) + P1.x; P.y = distance * (P2.y - P1.y) + P1.y; P.z = distance * (P2.z - P1.z) + P1.z; return P; } } /* // Fonction de calcul des aretes intersectees Generic int Index(Cellule cel, double Isovaleur, int nb_face) { int index = 0; int i; for(i=0; i<nb_face ;i++){ if(cel.val[i] <= Isovaleur){ index += pow(2,i); } } return index; }
  • /
// Fonction de calcul des aretes intersectees pour le MarchingCube int IndexCube(Cellule cel, double Isovaleur) { int index = 0; int i; int valindex[8] = {1, 2, 4, 8, 16, 32, 64, 128}; for(i=0;i<8;i++){ if(cel.val[i] <= Isovaleur){ index = index + valindex[i]; // index += pow(2,i); } } return index; } // Fonction de calcul des aretes intersectees pour le MarchingTetrahedra int IndexTetra(Cellule cel, double Isovaleur) { int index = 0; int i; int valindex[4] = {1,2,4,8}; for(i=0;i<4;i++){ if(cel.val[i] <= Isovaleur){ index = index + valindex[i]; } } return index; } // retourne le nbr d'intersection void CalculIntersect(int index){ int nb = 0 ; while(TableDesTriangles[index][nb]!=-1){ switch(TableDesTriangles[index][nb]){ case 0 : PointInter[nb] = InterpolLineaire(isovaleur,c.p[0],c.p[1],c.val[0],c.val[1]); break; case 1 : PointInter[nb] = InterpolLineaire(isovaleur,c.p[1],c.p[2],c.val[1],c.val[2]); break; case 2 : PointInter[nb] = InterpolLineaire(isovaleur,c.p[2],c.p[3],c.val[2],c.val[3]); break; case 3 : PointInter[nb] = InterpolLineaire(isovaleur,c.p[0],c.p[3],c.val[0],c.val[3]); break; case 4 : PointInter[nb] = InterpolLineaire(isovaleur,c.p[4],c.p[5],c.val[4],c.val[5]); break; case 5 : PointInter[nb] = InterpolLineaire(isovaleur,c.p[5],c.p[6],c.val[5],c.val[6]); break; case 6 : PointInter[nb] = InterpolLineaire(isovaleur,c.p[6],c.p[7],c.val[6],c.val[7]); break; case 7 : PointInter[nb] = InterpolLineaire(isovaleur,c.p[4],c.p[7],c.val[4],c.val[7]); break; case 8 : PointInter[nb] = InterpolLineaire(isovaleur,c.p[0],c.p[4],c.val[0],c.val[4]); break; case 9 : PointInter[nb] = InterpolLineaire(isovaleur,c.p[1],c.p[5],c.val[1],c.val[5]); break; case 10 : PointInter[nb] = InterpolLineaire(isovaleur,c.p[2],c.p[6],c.val[2],c.val[6]); break; case 11 : PointInter[nb] = InterpolLineaire(isovaleur,c.p[3],c.p[7],c.val[3],c.val[7]); break; } nb++; } } void CalculIntersectTetra(int index){ int nb = 0 ; int i ; int choix ; Cellule tetra; int ValPoint[6][4] = { {0,2,3,7}, {0,6,1,4}, {5,6,1,4}, {0,2,6,7}, {0,4,6,7}, {0,6,1,2} }; /* on s'occupe des 6 tetrahedre de c */ for(i=0;i<6;i++){ tetra.p[0] = c.p[ValPoint[i][0]]; tetra.p[1] = c.p[ValPoint[i][1]]; tetra.p[2] = c.p[ValPoint[i][2]]; tetra.p[3] = c.p[ValPoint[i][3]]; tetra.val[0] = c.val[ValPoint[i][0]]; tetra.val[1] = c.val[ValPoint[i][1]]; tetra.val[2] = c.val[ValPoint[i][2]]; tetra.val[3] = c.val[ValPoint[i][3]]; choix = IndexTetra(tetra,isovaleur); switch(choix){ case 1 : case 14 : PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[0],tetra.p[1],tetra.val[0],tetra.val[1]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[0],tetra.p[2],tetra.val[0],tetra.val[2]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[0],tetra.p[3],tetra.val[0],tetra.val[3]); nb++; break; case 2 : case 13 : PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[1],tetra.p[0],tetra.val[1],tetra.val[0]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[1],tetra.p[2],tetra.val[1],tetra.val[2]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[1],tetra.p[3],tetra.val[1],tetra.val[3]); nb++; break; case 4 : case 11 : PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[2],tetra.p[0],tetra.val[2],tetra.val[0]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[2],tetra.p[1],tetra.val[2],tetra.val[1]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[2],tetra.p[3],tetra.val[2],tetra.val[3]); nb++; break; case 8 : case 7 : PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[3],tetra.p[0],tetra.val[3],tetra.val[0]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[3],tetra.p[1],tetra.val[3],tetra.val[1]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[3],tetra.p[2],tetra.val[3],tetra.val[2]); nb++; break; case 3 : case 12 : PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[1],tetra.p[2],tetra.val[1],tetra.val[2]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[1],tetra.p[3],tetra.val[1],tetra.val[3]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[0],tetra.p[2],tetra.val[0],tetra.val[2]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[0],tetra.p[2],tetra.val[0],tetra.val[2]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[0],tetra.p[3],tetra.val[0],tetra.val[3]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[1],tetra.p[3],tetra.val[1],tetra.val[3]); nb++; break; case 5 : case 10 : PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[0],tetra.p[1],tetra.val[0],tetra.val[1]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[0],tetra.p[3],tetra.val[0],tetra.val[3]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[1],tetra.p[2],tetra.val[1],tetra.val[2]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[1],tetra.p[2],tetra.val[1],tetra.val[2]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[2],tetra.p[3],tetra.val[2],tetra.val[3]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[0],tetra.p[3],tetra.val[0],tetra.val[3]); nb++; break; case 6 : case 9 : PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[1],tetra.p[0],tetra.val[1],tetra.val[0]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[1],tetra.p[3],tetra.val[1],tetra.val[3]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[2],tetra.p[0],tetra.val[2],tetra.val[0]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[2],tetra.p[0],tetra.val[2],tetra.val[0]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[2],tetra.p[3],tetra.val[2],tetra.val[3]); nb++; PointInter[nb] = InterpolLineaire(isovaleur,tetra.p[1],tetra.p[3],tetra.val[1],tetra.val[3]); nb++; break; default : break; } } } // Facettes de l'isosurface pour l'type du MarchingCube void polygon(int aa, int bb, int cc , int dd) { glBegin(GL_LINE_STRIP); glDisable(GL_LIGHTING); glColor3f(.0,.0,.0); glNormal3fv(normals[aa]); glVertex3f(c.p[aa].x,c.p[aa].y,c.p[aa].z); glColor3f(.0,.0,.0); glNormal3fv(normals[bb]); glVertex3f(c.p[bb].x,c.p[bb].y,c.p[bb].z); glColor3f(.0,.0,.0); glNormal3fv(normals[cc]); glVertex3f(c.p[cc].x,c.p[cc].y,c.p[cc].z); glColor3f(.0,.0,.0); glNormal3fv(normals[dd]); glVertex3f(c.p[dd].x,c.p[dd].y,c.p[dd].z); glEnable(GL_LIGHTING); glEnd(); } // Voxel void cubeColor(void) { glPushAttrib(GL_LIGHTING_BIT); polygon(0, 3, 2, 1); polygon(2, 3, 7, 6); polygon(0, 4, 7, 3); polygon(1, 2, 6, 5); polygon(4, 5, 6, 7); polygon(0, 1, 5, 4); glPopAttrib(); } // Triangle void triangleColor(void) { int i; glBegin(GL_TRIANGLES); for(i=0; i<RESOLUTION; i++){ if(PointInter[i].x!=-1.0){ glVertex3f( PointInter[i].x, PointInter[i].y, PointInter[i].z ); } } glEnd(); } // Rotation void spinCube() { /* Idle callback, spin cube 2 degrees about selected axis */ theta[axis] += 0.1; if(theta[axis]>360.) theta[axis] -= 360.0; theta[0] += 0.1; if(theta[0]>360.) theta[0] -= 360.; theta[1] += 0.1; if(theta[1]>360.) theta[1] -= 360.0; display(); } //---------------------------------------- AFFICHAGE --------------------------------------- GLvoid vGetColor(Point3D rfColor, Point3D rfPosition, Point3D rfNormal) { GLfloat x = rfNormal.x; GLfloat y = rfNormal.y; GLfloat z = rfNormal.z; rfColor.x = (x > 0.0 ? x : 0.0) + (y < 0.0 ? -0.5*y : 0.0) + (z < 0.0 ? -0.5*z : 0.0); rfColor.y = (y > 0.0 ? y : 0.0) + (z < 0.0 ? -0.5*z : 0.0) + (x < 0.0 ? -0.5*x : 0.0); rfColor.z = (z > 0.0 ? z : 0.0) + (x < 0.0 ? -0.5*x : 0.0) + (y < 0.0 ? -0.5*y : 0.0); } void display(void) { GLint ii=0, jj=0, kk=0, ll=0 ; GLfloat decalage = TAILLE / 2. ; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glEnable(GL_LIGHTING); // Update viewer position in modelview matrix glLoadIdentity(); gluLookAt( viewer[0], viewer[1], viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 ); // rotate cube glRotatef(theta[0], 1.0, 0.0, 0.0); glRotatef(theta[1], 0.0, 1.0, 0.0); glRotatef(theta[2], 0.0, 0.0, 1.0); // glRotatef(13., 37.0, 40.0, 0.0); // Objet en 3D for(ii=0; ii<TAILLE; ii++){ for(jj=0; jj<TAILLE; jj++){ for(kk=0; kk<TAILLE; kk++){ // initialisation de chacun des cubes // pour un vue eclatee modif le prem param en 0.9 ou 0.8 initCube(1.,(float) ii-decalage, (float) jj-decalage, (float) kk-decalage); // Modele de forme switch (formes){ case 0 : initValSphere(); break ; case 1 : initValCercle(); break ; case 2 : initValCroix(); break ; case 3 : initValForme(); break ; default : break ; } // affichage de tous les cubes if(affiche == 0) cubeColor(); // algo du Marching Cube ou Tetrahedra switch(type){ case 0 : CalculIntersect(IndexCube(c,isovaleur)); break; case 1 : CalculIntersectTetra(IndexTetra(c,isovaleur)); break; default : break; } // dessin du triangle triangleColor(); } } } glFlush(); glutSwapBuffers(); } // Redimenssionement void myReshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Nous ne voulons pas distrodre les coordonnées if (w > h) { glFrustum(-2.5*w/h,2.5*w/h, -2.5,2.5, 2.0,20.0); } else // h >= w { glFrustum(-2.5,2.5, -2.5*h/w,2.5*h/w, 2.0,20.0); } } //---------------------------------------- INTERFACE --------------------------------------- // Gestion de la souris void mouse(int btn, int state, int x, int y) { if(btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0; if(btn == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1; if(btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2; theta[axis] += 2.0; if( theta[axis] > 360.0 ) theta[axis] -= 360.0; display(); } // Gestion du clavier void keys(unsigned char key, int x, int y) { switch (key) { case 'x' : viewer[0]-= 1.0; break ; case 'X' : viewer[0]+= 1.0; break ; case 'y' : viewer[1]-= 1.0; break ; case 'Y' : viewer[1]+= 1.0; break ; case 'z' : viewer[2]-= 1.0; break ; case 'Z' : viewer[2]+= 1.0; break ; // marching tetrahedra case 't' : case 'T' : type = 1; break ; // marching Cube case 'c' : case 'C' : type = 0; break ; // Forme 0 : sphere case '1' : formes = 0; break ; // Forme 1 : tube case '2' : formes = 1; break ; // Forme 2 : cube case '3' : formes = 2; break ; // Forme 3 : fun case '4' : formes = 3; break ; case 'a' : case 'A' : affiche = 1-affiche; break ; case 45 : // - isovaleur -= 0.5; break ; case 43 : // + isovaleur += 0.5; break ; // mode texture ou fil de fer case 'w' : case 'W' : { if(ePolygonMode == GL_LINE) ePolygonMode = GL_FILL; else ePolygonMode = GL_LINE; glPolygonMode(GL_FRONT_AND_BACK, ePolygonMode); } break ; case 27 : // Escape exit(0); break ; default : break ; } } // idle void idle() { glutPostRedisplay(); } // Menu d'aide GLvoid Menu() { printf(" ViSc : Marching Cubes & Marching Tetrahedra\n"); printf(" ___________________________________________\n\n\n"); printf("\tGuillaume GALLON & Guillaume ELOIRE :\n\n"); printf("\t\tx/X + / - : axe (x)\n"); printf("\t\ty/Y + / - : axe (y)\n"); printf("\t\tz/Z + / - : axe (z)\n"); printf("\t\t+/- Zoom\n\n"); printf("\t\tc Marching Cubes \n"); printf("\t\tt Marching Tetrahedra \n"); printf("\t\ta Affichage structure \n"); printf("\t\tw Affichage texture / fils de fer \n\n"); printf("\t\t1 Affichage Sphere \n"); printf("\t\t2 Affichage Tube \n"); printf("\t\t3 Affichage Croix \n\n"); printf("\t\t4 Affichage Forme \n\n"); printf("\t\tEsc Sortie \n"); } //----------------------------------------- MAIN ------------------------------------------- void main(int argc, char **argv) { Menu(); glutInitWindowPosition(0, 0); glutInitWindowSize(500, 500); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutCreateWindow("Marching Cube"); glutDisplayFunc(display); glutReshapeFunc(myReshape); glutIdleFunc(idle); glutIdleFunc(spinCube); glutMouseFunc(mouse); glutKeyboardFunc(keys); glClearColor( 1.0, 1.0, 1.0, 1.0 ); glClearDepth( 1.0 ); glEnable(GL_DEPTH_TEST); //glEnable(GL_LIGHTING); glPolygonMode(GL_FRONT_AND_BACK, ePolygonMode); // Texture Rose glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shininess); glLightfv( GL_LIGHT0, GL_AMBIENT, ambient); glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse); glLightfv( GL_LIGHT0, GL_SPECULAR, specular); glLightfv( GL_LIGHT0, GL_SHININESS, shininess); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 9.0); glShadeModel(GL_SMOOTH); glEnable( GL_LIGHT0 ); glutMainLoop(); }

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.