int CMarchCube::Polygonise(GRIDCELL grid, double iso, CMesh* pMeshOut) { bool UseTets = false; if (UseTets){ PolygoniseTet(grid, iso, pMeshOut, 0, 2, 3, 7); PolygoniseTet(grid, iso, pMeshOut, 0, 2, 6, 7); PolygoniseTet(grid, iso, pMeshOut, 0, 4, 6, 7); PolygoniseTet(grid, iso, pMeshOut, 0, 6, 1, 2); PolygoniseTet(grid, iso, pMeshOut, 0, 6, 1, 4); PolygoniseTet(grid, iso, pMeshOut, 5, 6, 1, 4); } else PolygoniseCube(grid, iso, pMeshOut); return 0; }
void marchCube(){ int i,j,k,l,n,c; short int ***data = NULL; short int isolevel = 128,themax = 0,themin = 255; GRIDCELL grid; TRIANGLE triangles[10]; TRIANGLE *tri = NULL; int ntri = 0; FILE *fptr; // Malloc the volumetric data, hardwired size! data = malloc(NX*sizeof(short int **)); for (i=0;i<NX;i++) data[i] = malloc(NY*sizeof(short int *)); for (i=0;i<NX;i++) for (j=0;j<NY;j++) data[i][j] = malloc(NZ*sizeof(short int)); // Open and read the raw data if ((fptr = fopen("../data/statueLeg.raw","rb")) == NULL) { fprintf(stderr,"File open failed\n"); exit(-1); } for (k=0;k<NZ;k++) { for (j=0;j<NY;j++) { for (i=0;i<NX;i++) { if ((c = fgetc(fptr)) == EOF) { fprintf(stderr,"Unexpected end of file\n"); exit(-1); } data[i][j][k] = c; if (c > themax) themax = c; if (c < themin) themin = c; } } } fclose(fptr); // Polygonise the grid for (i=0;i<NX-1;i++) { for (j=0;j<NY-1;j++) { for (k=0;k<NZ-1;k++) { grid.p[0].x = i; grid.p[0].y = j; grid.p[0].z = k; grid.val[0] = data[i][j][k]; grid.p[1].x = i+1; grid.p[1].y = j; grid.p[1].z = k; grid.val[1] = data[i+1][j][k]; grid.p[2].x = i+1; grid.p[2].y = j+1; grid.p[2].z = k; grid.val[2] = data[i+1][j+1][k]; grid.p[3].x = i; grid.p[3].y = j+1; grid.p[3].z = k; grid.val[3] = data[i][j+1][k]; grid.p[4].x = i; grid.p[4].y = j; grid.p[4].z = k+1; grid.val[4] = data[i][j][k+1]; grid.p[5].x = i+1; grid.p[5].y = j; grid.p[5].z = k+1; grid.val[5] = data[i+1][j][k+1]; grid.p[6].x = i+1; grid.p[6].y = j+1; grid.p[6].z = k+1; grid.val[6] = data[i+1][j+1][k+1]; grid.p[7].x = i; grid.p[7].y = j+1; grid.p[7].z = k+1; grid.val[7] = data[i][j+1][k+1]; n = PolygoniseCube(grid,isolevel,triangles); tri = realloc(tri,(ntri+n)*sizeof(TRIANGLE)); for (l=0;l<n;l++) tri[ntri+l] = triangles[l]; ntri += n; } } } for (i=0;i<ntri;i++) { glColor3f(1.0f , 1.0f , 1.0f); for (k=0;k<3;k++) { glBegin(GL_POINTS); glVertex3f(tri[i].p[k].x,tri[i].p[k].y,tri[i].p[k].z); glEnd(); } } glutSwapBuffers(); }