Représentation disosurface
Lalgorithme du Marching Cubes a été inventé par Bill LORENSEN et Harvey CLINE. Il sagit dune méthode surfacique permettant dextraire une surface équipotentielle (isosurface) dun maillage structuré et uniforme 3D.
Source / Exemple :
/*****
*
#include "glut.h"
#include "glu.h"
#include <math.h>
#include <stdio.h>
/*****
*
#define TAILLECELLULE 8 // Taille des cellules
#define RESOLUTION 55 // Finesse
#define TAILLE 11 // Taille nbr impaire
// image sur site taille = 15 et 5
/*****
*
// 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;
/*****
*
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 };
/*****
*
void display(void);
void MyInit(void);
/*****
*
// 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))
}
}
// 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();
}
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.