⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 voxel.cpp

📁 marchingcube源代码
💻 CPP
字号:

#include "Voxel.h"#include "math.h"//class Voxel:void Voxel_SetParams(Voxel *This, DataArray *ADataArray){	int i,j,k;	MH_BOOL found;	Configuration CurrentConfig, RotatedBCase;	This->MyDataArray = ADataArray;	//Initialize the cases	//initialize to base configurations	//Configuration BaseConfig[23];	Configuration_reset1(&(This->BaseConfig[0]),0);		//00000000		Configuration_reset1(&(This->BaseConfig[1]),1);		//00000001	Configuration_reset1(&(This->BaseConfig[2]),3);		//00000011	Configuration_reset1(&(This->BaseConfig[3]),33);	//00100001	Configuration_reset1(&(This->BaseConfig[4]),35);	//00100011		Configuration_reset1(&(This->BaseConfig[5]),51);	//00110011	Configuration_reset1(&(This->BaseConfig[6]),36);	//00100100	Configuration_reset1(&(This->BaseConfig[7]),37);	//00100101	Configuration_reset1(&(This->BaseConfig[8]),39);	//00100111		Configuration_reset1(&(This->BaseConfig[9]),22);	//00010110	Configuration_reset1(&(This->BaseConfig[10]),23);	//00010111					Configuration_reset1(&(This->BaseConfig[11]),53);	//00110101		Configuration_reset1(&(This->BaseConfig[12]),54);	//00110110	Configuration_reset1(&(This->BaseConfig[13]),55);	//00110111	Configuration_reset1(&(This->BaseConfig[14]),60);	//00111100	Configuration_reset1(&(This->BaseConfig[15]),61);	//00111101	Configuration_reset1(&(This->BaseConfig[16]),63);	//00111111	Configuration_reset1(&(This->BaseConfig[17]),150);	//10010110	Configuration_reset1(&(This->BaseConfig[18]),151);	//10010111	Configuration_reset1(&(This->BaseConfig[19]),183);	//10110111	Configuration_reset1(&(This->BaseConfig[20]),189);	//10111101	Configuration_reset1(&(This->BaseConfig[21]),191);	//10111111	Configuration_reset1(&(This->BaseConfig[22]),255);	//11111111	//initialize to base rotations	//Rotation BaseRotat[24];	//error in case #3	Rotation_reset(&(This->BaseRotat[0]),0,1,2,3,4,5,6,7);Rotation_reset(&(This->BaseRotat[1]),4,5,0,1,6,7,2,3);	Rotation_reset(&(This->BaseRotat[2]),6,7,4,5,2,3,0,1);Rotation_reset(&(This->BaseRotat[3]),2,3,6,7,0,1,4,5);	Rotation_reset(&(This->BaseRotat[4]),1,5,3,7,0,4,2,6);Rotation_reset(&(This->BaseRotat[5]),5,4,7,6,1,0,3,2);	Rotation_reset(&(This->BaseRotat[6]),4,0,6,2,5,1,7,3);Rotation_reset(&(This->BaseRotat[7]),2,0,3,1,6,4,7,5);	Rotation_reset(&(This->BaseRotat[8]),3,2,1,0,7,6,5,4);Rotation_reset(&(This->BaseRotat[9]),1,3,0,2,5,7,4,6);	Rotation_reset(&(This->BaseRotat[10]),5,7,1,3,4,6,0,2);Rotation_reset(&(This->BaseRotat[11]),7,6,3,2,5,4,1,0);	Rotation_reset(&(This->BaseRotat[12]),6,4,2,0,7,5,3,1);Rotation_reset(&(This->BaseRotat[13]),7,3,5,1,6,2,4,0);	Rotation_reset(&(This->BaseRotat[14]),2,6,0,4,3,7,1,5);Rotation_reset(&(This->BaseRotat[15]),3,1,7,5,2,0,6,4);	Rotation_reset(&(This->BaseRotat[16]),1,0,5,4,3,2,7,6);Rotation_reset(&(This->BaseRotat[17]),0,2,4,6,1,3,5,7);	Rotation_reset(&(This->BaseRotat[18]),0,4,1,5,2,6,3,7);Rotation_reset(&(This->BaseRotat[19]),4,6,5,7,0,2,1,3);	Rotation_reset(&(This->BaseRotat[20]),6,2,7,3,4,0,5,1);Rotation_reset(&(This->BaseRotat[21]),3,7,2,6,1,5,0,4);	Rotation_reset(&(This->BaseRotat[22]),7,5,6,4,3,1,2,0);Rotation_reset(&(This->BaseRotat[23]),5,1,4,0,7,3,6,2);	//initialise the MapToBase array	for (i=0 ; i<256 ; i++)	//for each possible case	{		This->MapToBase[i].BaseCase = -1; //so that the case is -1 if not found		Configuration_reset1(&CurrentConfig,i);	//set CurrentConfig to configuration #i		found = 0;		j=0;		while (j<23 && !found)		//for each possible base configuration		{			k=0;			while (k<24 && !found)			//for each possible rotation			{				RotatedBCase = This->BaseConfig[j];				Configuration_Apply(&RotatedBCase,&(This->BaseRotat[k]));				if (Configuration_IsSame(&RotatedBCase,&CurrentConfig))				{					This->MapToBase[i].Rot = k;					This->MapToBase[i].BaseCase = j;					found = 1;				}				k++;			}			j++;		}	}}void Voxel_reset8(Voxel *This, MH_BOOL corner0, MH_BOOL corner1, MH_BOOL corner2, MH_BOOL corner3,	MH_BOOL corner4, MH_BOOL corner5, MH_BOOL corner6, MH_BOOL corner7, int Ai, int Aj, int Ak){	Configuration_reset8(&(This->MyConfig),corner0, corner1, corner2, corner3,					corner4, corner5, corner6, corner7);	This->i = Ai; This->j = Aj; This->k = Ak;}void Voxel_reset3(Voxel *This, int Ai, int Aj, int Ak){	MH_BOOL corner0, corner1, corner2, corner3;
	MH_BOOL corner4, corner5, corner6, corner7;	This->i = Ai; This->j = Aj; This->k = Ak;

	corner0 = This->MyDataArray->ValueAboveT(This->i, This->j, This->k);
	corner1 = This->MyDataArray->ValueAboveT(This->i+1, This->j, This->k);
	corner2 = This->MyDataArray->ValueAboveT(This->i, This->j+1, This->k);
	corner3 = This->MyDataArray->ValueAboveT(This->i+1, This->j+1, This->k);
	corner4 = This->MyDataArray->ValueAboveT(This->i, This->j, This->k+1);
	corner5 = This->MyDataArray->ValueAboveT(This->i+1, This->j, This->k+1);
	corner6 = This->MyDataArray->ValueAboveT(This->i, This->j+1, This->k+1);
	corner7 = This->MyDataArray->ValueAboveT(This->i+1, This->j+1, This->k+1);
	Configuration_reset8(&(This->MyConfig),corner0,					corner1,					corner2,					corner3,					corner4,					corner5,					corner6,					corner7	);	//printf("voxel %i%i%i%i%i%i%i%i\n",corner0, corner1, corner2, corner3,	//	corner4, corner5, corner6, corner7);}TriangleList Voxel_OutputTriangles(Voxel *This)//returns a list of Triangles{	TriangleList ToBeReturned = TriangleList_TriangleList();	This->MyBaseConfig = This->BaseConfig[This->MapToBase[Configuration_ToInt(&(This->MyConfig))].BaseCase];	//the base configuration that corresponds to this one	This->MyBaseRotation = This->BaseRotat[This->MapToBase[Configuration_ToInt(&(This->MyConfig))].Rot];	//the rotation that brings us from the base configuration	//to the current one.	This->TestConfig = This->MyBaseConfig;	Configuration_Apply(&(This->TestConfig),&(This->MyBaseRotation));		//printf("nb case : %i\n",This->MapToBase[Configuration_ToInt(&(This->MyConfig))].BaseCase);	switch (This->MapToBase[Configuration_ToInt(&(This->MyConfig))].BaseCase)	{	case 0:		//no triangles to add		break;	case 1:		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,0,2,	0,4,	0,1));		break;	case 2:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,0,2,	0,4,	1,5));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,0,2,	1,5,	1,3));		}		break;	case 3:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,0,2,	0,4,	0,1));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,7,5,	5,1,	4,5));		}		break;	case 4:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,0,4,	4,5,	5,7));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,0,4,	5,7,	0,2));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,0,2,	5,7,	1,3));		}		break;	case 5:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,4,6,	1,3,	0,2));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,1,3,	4,6,	5,7));		}		break;	case 6:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	0,2,	2,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,5,7,	1,5,	4,5));		}		break;	case 7:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	0,4,	2,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,3,	0,4,	0,1));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,5,7,	1,5,	4,5));		}		break;	case 8:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	1,3,	2,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	4,5,	1,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	0,4,	4,5));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,1,3,	4,5,	5,7));		}		break;	case 9:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	2,0,	2,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,1,3,	0,1,	1,5));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,4,6,	4,5,	0,4));		}		break;	case 10:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	4,6,	2,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,4,6,	4,5,	2,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,3,	4,5,	1,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,1,3,	4,5,	1,5));		}		break;	case 11:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	4,6,	2,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,3,	4,6,	1,5));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,3,	1,5,	0,1));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,5,7,	1,5,	4,6));		}		break;	case 12:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	0,2,	2,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,4,6,	1,3,	5,7));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,4,6,	1,3,	0,1));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,4,6,	0,1,	0,4));		}		break;	case 13:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	1,3,	2,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	5,7,	3,1));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	4,6,	5,7));		}		break;	case 14:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	0,2,	3,7));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,3,7,	0,2,	1,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,5,7,	0,4,	4,6));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,5,7,	1,5,	0,4));		}		break;	case 15:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	4,6,	3,7));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,3,7,	4,6,	1,0));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,3,7,	0,1,	1,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,4,6,	5,7,	0,1));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,0,1,	1,5,	5,7));		}		break;	case 16:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	4,6,	5,7));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	5,7,	3,7));		}		break;	case 17:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,1,3,	0,1,	1,5));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,3,7,	5,7,	6,7));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,0,2,	2,3,	2,6));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,4,6,	4,5,	0,4));		}		break;	case 18:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,3,7,	5,7,	6,7));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	4,5,	2,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,4,6,	4,5,	2,6));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,3,	4,5,	1,5));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,3,	1,5,	1,3));		}		break;	case 19:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	4,6,	2,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,3,	4,6,	1,3));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,6,7,	1,3,	4,6));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,3,7,	1,3,	6,7));		}		break;	case 20:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	4,6,	6,7));		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,1,3,	1,5,	1,0));		}		break;	case 21:		{		TriangleList_Add(&ToBeReturned,Voxel_NewTriangle(This,2,6,	4,6,	6,7));		}		break;	case 22:		//non to add		break;	default:		//should warn that the case was not found		break;	}	return ToBeReturned;}int Voxel_GetEdgePoint(Voxel *This, int corner1, int corner2){	return This->MyDataArray->GetEdgePoint(corner1, corner2, This->i, This->j, This->k);}Triangle *Voxel_NewTriangle(Voxel *This, int c1a, int c1b, int c2a, int c2b, int c3a, int c3b){	int mc1a=This->MyBaseRotation.r[c1a], mc1b=This->MyBaseRotation.r[c1b];	int mc2a=This->MyBaseRotation.r[c2a], mc2b=This->MyBaseRotation.r[c2b];	int mc3a=This->MyBaseRotation.r[c3a], mc3b=This->MyBaseRotation.r[c3b];	int a = Voxel_GetEdgePoint(This,mc1a, mc1b);	int b = Voxel_GetEdgePoint(This,mc2a, mc2b);	int c = Voxel_GetEdgePoint(This,mc3a, mc3b);	//printf("new triangle %i %i %i\n",a,b,c);	return new_Triangle3( a, b, c);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -