コード例 #1
0
ファイル: MarchCube.cpp プロジェクト: WPI-ARC/soft_hand
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;
}
コード例 #2
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();
}