1.原始代码

#define GLUT_DISABLE_ATEXIT_HACK
#include <stdlib.h>
#include <string.h>
#include "stdio.h"
#include "math.h"
#include "GL/glut.h"  #if !defined(GLUT_WHEEL_UP)
#  define GLUT_WHEEL_UP   3
#  define GLUT_WHEEL_DOWN 4
#endif  //向量
struct GLvector
{  GLfloat fX;  GLfloat fY;  GLfloat fZ;
};  //立方体8个顶点
static const GLfloat a2fVertexOffset[8][3] =
{  {0.0, 0.0, 0.0},{1.0, 0.0, 0.0},{1.0, 1.0, 0.0},{0.0, 1.0, 0.0},  {0.0, 0.0, 1.0},{1.0, 0.0, 1.0},{1.0, 1.0, 1.0},{0.0, 1.0, 1.0}
};  // 立方体12个边
static const GLint a2iEdgeConnection[12][2] =
{  {0,1}, {1,2}, {2,3}, {3,0},  {4,5}, {5,6}, {6,7}, {7,4},  {0,4}, {1,5}, {2,6}, {3,7}
};  //立方体 12个边的方向向量
static const GLfloat a2fEdgeDirection[12][3] =
{  {1.0, 0.0, 0.0},{0.0, 1.0, 0.0},{-1.0, 0.0, 0.0},{0.0, -1.0, 0.0},  {1.0, 0.0, 0.0},{0.0, 1.0, 0.0},{-1.0, 0.0, 0.0},{0.0, -1.0, 0.0},  {0.0, 0.0, 1.0},{0.0, 0.0, 1.0},{ 0.0, 0.0, 1.0},{0.0,  0.0, 1.0}
};  static const GLfloat afAmbientWhite [] = {0.25, 0.25, 0.25, 1.00};   // 周围 环绕 白
static const GLfloat afAmbientRed   [] = {0.25, 0.00, 0.00, 1.00};   // 周围 环绕 红
static const GLfloat afAmbientGreen [] = {0.00, 0.25, 0.00, 1.00};   // 周围 环绕 绿
static const GLfloat afAmbientBlue  [] = {0.00, 0.00, 0.25, 1.00};   // 周围 环绕 蓝
static const GLfloat afDiffuseWhite [] = {0.75, 0.75, 0.75, 1.00};   // 漫射 白
static const GLfloat afDiffuseRed   [] = {0.75, 0.00, 0.00, 1.00};   // 漫射 红
static const GLfloat afDiffuseGreen [] = {0.00, 0.75, 0.00, 1.00};   // 漫射 绿
static const GLfloat afDiffuseBlue  [] = {0.00, 0.00, 0.75, 1.00};   // 漫射 蓝
static const GLfloat afSpecularWhite[] = {1.00, 1.00, 1.00, 1.00};   // 反射 白
static const GLfloat afSpecularRed  [] = {1.00, 0.25, 0.25, 1.00};   // 反射 红
static const GLfloat afSpecularGreen[] = {0.25, 1.00, 0.25, 1.00};   // 反射 绿
static const GLfloat afSpecularBlue [] = {0.25, 0.25, 1.00, 1.00};   // 反射 蓝  GLenum    ePolygonMode = GL_FILL;  GLfloat   fTargetValue = 100.0;
GLboolean bLight = true;  void vIdle();
void vDrawScene();
void vResize(GLsizei, GLsizei);
void vKeyboard(unsigned char cKey, int iX, int iY);
void vSpecial(int iKey, int iX, int iY);  void spinDisplay();
void fYawDisplay(void);
void myMouseCall(int button, int state, int x ,int y);  GLvoid vMarchingCubes();
GLvoid vMarchCube1(GLfloat fX, GLfloat fY, GLfloat fZ, GLfloat fScale);  #define NX 200
#define NY 160
#define NZ 160   short int ***data;
GLfloat HoriRotate  = 90;
GLfloat VertiRotate = 0;  GLfloat  Xtranform=-90.0;
GLfloat  Ytranform= 80.0;
GLfloat  Ztranform=-10.0;  GLfloat ZoonAspect=140.0;
GLfloat ZoomScale=1.0;
short int themax = 0,themin = 255;  void main(int argc, char **argv)
{   int i,j,k,c;  short int isolevel = 128;  FILE *fptr;  argc=2;  argv[1]="F:\\软件\\OpenGL\\mri.raw";  for (i=1;i<argc;i++) {  if (strcmp(argv[i],"-i") == 0)  isolevel = atof(argv[i+1]);  }  // Malloc the volumetric data, hardwired size!  data = (short int ***)malloc(NX*sizeof(short int **));  for (i=0;i<NX;i++)  data[i] = (short int **)malloc(NY*sizeof(short int *));  for (i=0;i<NX;i++)  for (j=0;j<NY;j++)  data[i][j] = (short int *)malloc(NZ*sizeof(short int));  // Open and read the raw data  fprintf(stderr,"Reading data ...\n");  if ((fopen_s(fptr,argv[argc-1],"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);  fprintf(stderr,"Volumetric data range: %d -> %d\n",themin,themax);  GLfloat afPropertiesAmbient [] = {0.25, 0.25, 0.25, 1.00};   GLfloat afPropertiesDiffuse [] = {0.75, 0.75, 0.75, 1.00};   GLfloat afPropertiesSpecular[] = {1.00, 0.25, 0.25, 1.00};   GLsizei iWidth = 640.0;   GLsizei iHeight = 480.0;   glutInit(&argc, argv);  glutInitWindowPosition( 0, 0);  glutInitWindowSize(iWidth, iHeight);  glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE );  glutCreateWindow( "Marching Cubes" );  glutDisplayFunc( vDrawScene );  glutIdleFunc( vIdle );  glutReshapeFunc( vResize );  glutKeyboardFunc( vKeyboard );  glutSpecialFunc( vSpecial );  glutMouseFunc(myMouseCall);  glClearColor( 0.0, 0.0, 0.0, 1.0 );   glClearDepth( 1.0 );   glEnable(GL_DEPTH_TEST);   glEnable(GL_LIGHTING);  glPolygonMode(GL_FRONT_AND_BACK, ePolygonMode);  glLightfv( GL_LIGHT0, GL_AMBIENT,  afPropertiesAmbient);   glLightfv( GL_LIGHT0, GL_DIFFUSE,  afPropertiesDiffuse);   glLightfv( GL_LIGHT0, GL_SPECULAR, afPropertiesSpecular);   glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 1.0);   glEnable( GL_LIGHT0 );   // 材质颜色  ***里外 ***  glMaterialfv(GL_BACK,  GL_AMBIENT,   afAmbientRed);   glMaterialfv(GL_BACK,  GL_DIFFUSE,   afDiffuseRed);   glMaterialfv(GL_FRONT, GL_AMBIENT,   afAmbientWhite);   glMaterialfv(GL_FRONT, GL_DIFFUSE,   afDiffuseWhite);   glMaterialfv(GL_FRONT, GL_SPECULAR,  afSpecularWhite);   glMaterialf( GL_FRONT, GL_SHININESS, 10.0);   vResize(iWidth, iHeight);     glutMainLoop();
}  // 窗口改变响应
void vResize( GLsizei iWidth, GLsizei iHeight )
{   GLfloat fAspect, fHalfWorldSize = (1.4142135623730950488016887242097/2);   glViewport( 0, 0, iWidth, iHeight );   glMatrixMode (GL_PROJECTION);  glLoadIdentity ();  if(iWidth <= iHeight)  {  fAspect = (GLfloat)iHeight / (GLfloat)iWidth;  glOrtho(-fHalfWorldSize*ZoonAspect, fHalfWorldSize*ZoonAspect, -fHalfWorldSize*fAspect*ZoonAspect,  fHalfWorldSize*fAspect*ZoonAspect, -10*fHalfWorldSize*ZoonAspect, 10*fHalfWorldSize*ZoonAspect);  }  else  {  fAspect = (GLfloat)iWidth / (GLfloat)iHeight;   glOrtho(-fHalfWorldSize*fAspect*ZoonAspect, fHalfWorldSize*fAspect*ZoonAspect, -fHalfWorldSize*ZoonAspect,  fHalfWorldSize*ZoonAspect, -10*fHalfWorldSize*ZoonAspect, 10*fHalfWorldSize*ZoonAspect);  }  glMatrixMode( GL_MODELVIEW );  }  void spinDisplay(void)
{  HoriRotate = HoriRotate+10.0;  if (HoriRotate >360.0)  HoriRotate = HoriRotate -360.0;  glutPostRedisplay();
}
void fYawDisplay(void)
{  VertiRotate = VertiRotate+10.0;  if (VertiRotate >360.0)  VertiRotate = VertiRotate -360.0;  glutPostRedisplay();  }  // 鼠标响应
void myMouseCall(int button, int state, int x ,int y)
{  switch (button)  {  case GLUT_LEFT_BUTTON:  if (state == GLUT_DOWN)  spinDisplay();  break;  case GLUT_RIGHT_BUTTON:  if(state == GLUT_DOWN)  fYawDisplay();  break;  case GLUT_WHEEL_UP:  ZoomScale=ZoomScale+0.05;  glutPostRedisplay();  break;  case GLUT_WHEEL_DOWN:  ZoomScale=ZoomScale-0.05;  glutPostRedisplay();  break;  default:  break;  }
}  // 键盘响应
void vKeyboard(unsigned char cKey, int iX, int iY)
{  switch(cKey)  {  case 'w' :  {  if(ePolygonMode == GL_LINE)  {  ePolygonMode = GL_FILL;  glutPostRedisplay();  }  else  {  ePolygonMode = GL_LINE;  glutPostRedisplay();  }  glPolygonMode(GL_FRONT_AND_BACK, ePolygonMode);  } break;  case 'l' :  {  if(bLight)  {  glDisable(GL_LIGHTING);//use vertex colors  glutPostRedisplay();  }  else  {  glEnable(GL_LIGHTING);//use lit material color  glutPostRedisplay();  }  bLight = !bLight;  };  }
}  //特殊键响应 上下左右 PaUP PaDn
void vSpecial(int iKey, int iX, int iY)
{  switch(iKey)  {  case GLUT_KEY_F1 :  {  ZoonAspect-=10;  glutReshapeFunc( vResize );  } break;  case GLUT_KEY_PAGE_UP :  {  if(fTargetValue<=themax-1)  {  fTargetValue=fTargetValue+1;  }  else  {  fTargetValue=themax;  }  glutPostRedisplay();  } break;  case GLUT_KEY_PAGE_DOWN :  {  if(fTargetValue>=themin+1)  {  fTargetValue=fTargetValue-1;  }  else  {  fTargetValue=themin;  }  glutPostRedisplay();  } break;   case GLUT_KEY_UP :    // 上  {  Ytranform+=10.0;  glutPostRedisplay();  } break;  case GLUT_KEY_DOWN :   // 下  {  Ytranform-=10.0;  glutPostRedisplay();  } break;  case GLUT_KEY_LEFT :    // 左  {  Xtranform-=10.0;  glutPostRedisplay();  } break;  case GLUT_KEY_RIGHT :   //  右  {  Xtranform+=10.0;  glutPostRedisplay();  } break;  }
}  void vIdle()//   程序空闲时
{  // 重绘函数  //glutPostRedisplay();  }  void vDrawScene() // 绘制场景
{   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );   glPushMatrix();   glTranslatef(Xtranform, Ytranform, Ztranform);   /*printf("%f,  %f,  %f \n" ,Xtranform, Ytranform, Ztranform ); printf("%f,  %f \n" ,VertiRotate, HoriRotate);*/  glRotatef(     HoriRotate, 1.0, 0.0, 0.0);  glRotatef(     0.0, 0.0, 1.0, 0.0);  glRotatef(     VertiRotate, 0.0, 0.0, 1.0);  glScaled(ZoomScale,ZoomScale,ZoomScale);  glPushAttrib(GL_LIGHTING_BIT);  glDisable(GL_LIGHTING);  /* glColor3f(1.0, 1.0, 1.0); glutWireCube(100.0); */  glPopAttrib();   glBegin(GL_TRIANGLES);  vMarchingCubes();  glEnd();  glPopMatrix();   glutSwapBuffers();
}  //计算交点坐标相对于val1的偏移(巧妙地利用了边的方向)
GLfloat fGetOffset(GLfloat fValue1, GLfloat fValue2, GLfloat fValueDesired)
{  GLdouble fDelta = fValue2 - fValue1;  if(fDelta == 0.0)  {  return 0.5;  }  return (fValueDesired - fValue1)/fDelta;
}  // 根据 位置 以及 法向量 产生颜色
GLvoid vGetColor(GLvector &rfColor, GLvector &rfPosition, GLvector &rfNormal)
{  GLfloat fX = rfNormal.fX;  GLfloat fY = rfNormal.fY;  GLfloat fZ = rfNormal.fZ;  rfColor.fX = (fX > 0.0 ? fX : 0.0) + (fY < 0.0 ? -0.5*fY : 0.0) + (fZ < 0.0 ? -0.5*fZ : 0.0);  rfColor.fY = (fY > 0.0 ? fY : 0.0) + (fZ < 0.0 ? -0.5*fZ : 0.0) + (fX < 0.0 ? -0.5*fX : 0.0);  rfColor.fZ = (fZ > 0.0 ? fZ : 0.0) + (fX < 0.0 ? -0.5*fX : 0.0) + (fY < 0.0 ? -0.5*fY : 0.0);
}
//向量标准化
GLvoid vNormalizeVector(GLvector &rfVectorResult, GLvector &rfVectorSource)
{  GLfloat fOldLength;  GLfloat fScale;  fOldLength = sqrtf( (rfVectorSource.fX * rfVectorSource.fX) +  (rfVectorSource.fY * rfVectorSource.fY) +  (rfVectorSource.fZ * rfVectorSource.fZ) );  if(fOldLength == 0.0)  {  rfVectorResult.fX = rfVectorSource.fX;  rfVectorResult.fY = rfVectorSource.fY;  rfVectorResult.fZ = rfVectorSource.fZ;  }  else  {  fScale = 1.0/fOldLength;  rfVectorResult.fX = rfVectorSource.fX*fScale;  rfVectorResult.fY = rfVectorSource.fY*fScale;  rfVectorResult.fZ = rfVectorSource.fZ*fScale;  }
}  //计算交点的梯度(法向量)
GLvoid vGetNormal(GLvector &rfNormal, GLfloat fX, GLfloat fY, GLfloat fZ)
{  if (  fX>1 && fX<NX-1 &&    fY>1 && fY<NY-1  &&  fZ>1 && fZ<NZ-1    )  {  rfNormal.fX = (GLfloat)data[(int)fX-1][ (int)fY][ (int)fZ] - (GLfloat)data[(int)fX+1][ (int)fY] [(int)fZ];  rfNormal.fY = (GLfloat)data[(int)fX] [(int)fY-1] [(int)fZ] - (GLfloat)data[(int)fX][(int) fY+1][(int)fZ];  rfNormal.fZ = (GLfloat)data[(int)fX][(int)fY][(int) fZ-1] - (GLfloat)data[(int)fX][ (int)fY][ (int)fZ+1];  vNormalizeVector(rfNormal, rfNormal);  }
}  //计算单个移动立方体内部的三角面片并进行渲染
GLvoid vMarchCube1(GLfloat fX, GLfloat fY, GLfloat fZ, GLfloat fScale)
{  extern GLint aiCubeEdgeFlags[256];  extern GLint a2iTriangleConnectionTable[256][16];  GLint iCorner, iVertex, iVertexTest, iEdge, iTriangle, iFlagIndex, iEdgeFlags;  GLfloat fOffset;  GLvector sColor;  GLfloat afCubeValue[8];  GLvector asEdgeVertex[12];  GLvector asEdgeNorm[12];  //保存每一个Cube的八个顶点。         for(iVertex = 0; iVertex < 8; iVertex++)  {  afCubeValue[iVertex] =(GLfloat)data[(int)(fX + a2fVertexOffset[iVertex][0])]  [(int)(fY + a2fVertexOffset[iVertex][1])]  [(int)(fZ + a2fVertexOffset[iVertex][2])] ;  }  //找出哪些顶点是在等值面内,哪些是在等值面外  iFlagIndex = 0;  for(iVertexTest = 0; iVertexTest < 8; iVertexTest++)  {  if(afCubeValue[iVertexTest] <= fTargetValue)   iFlagIndex |= 1<<iVertexTest;  }  //找到与等值面有交点的边  iEdgeFlags = aiCubeEdgeFlags[iFlagIndex];  //不存在三角面片  if(iEdgeFlags == 0)   {  return;  }  //找到每一个与等值面相交的边,并且找到等值面在这一点的法向量   for(iEdge = 0; iEdge < 12; iEdge++)  {  //如果在这一个边上有交点的话  if(iEdgeFlags & (1<<iEdge))  {  fOffset = fGetOffset(afCubeValue[ a2iEdgeConnection[iEdge][0] ],   afCubeValue[ a2iEdgeConnection[iEdge][1] ], fTargetValue);  //计算交点的坐标  asEdgeVertex[iEdge].fX = fX + (a2fVertexOffset[ a2iEdgeConnection[iEdge][0] ][0]  +  fOffset * a2fEdgeDirection[iEdge][0]) ;//* fScale;  asEdgeVertex[iEdge].fY = fY + (a2fVertexOffset[ a2iEdgeConnection[iEdge][0] ][1]  +  fOffset * a2fEdgeDirection[iEdge][1]) ;//* fScale;  asEdgeVertex[iEdge].fZ = fZ + (a2fVertexOffset[ a2iEdgeConnection[iEdge][0] ][2]  +  fOffset * a2fEdgeDirection[iEdge][2]) ;//* fScale;  //计算交点的法向量  vGetNormal(asEdgeNorm[iEdge], asEdgeVertex[iEdge].fX, asEdgeVertex[iEdge].fY, asEdgeVertex[iEdge].fZ);  }  }  //画出等值面三角形 每个立方体最多有5个三角形  for(iTriangle = 0; iTriangle < 5; iTriangle++)  {  if(a2iTriangleConnectionTable[iFlagIndex][3*iTriangle] < 0)  break;  for(iCorner = 0; iCorner < 3; iCorner++)  {  iVertex = a2iTriangleConnectionTable[iFlagIndex][3*iTriangle+iCorner];  vGetColor(sColor, asEdgeVertex[iVertex], asEdgeNorm[iVertex]);  glColor3f(sColor.fX, sColor.fY, sColor.fZ);  glNormal3f(asEdgeNorm[iVertex].fX,   asEdgeNorm[iVertex].fY,   asEdgeNorm[iVertex].fZ);  glVertex3f(asEdgeVertex[iVertex].fX, asEdgeVertex[iVertex].fY, asEdgeVertex[iVertex].fZ);  }  }
}  //遍历所有体素,计算所有的等值点,构造所有三角面片并渲染
GLvoid vMarchingCubes()
{  GLint iX, iY, iZ;  for(iX = 0; iX < NX-1; iX++)  for(iY = 0; iY < NY-1; iY++)  for(iZ = 0; iZ < NZ-1; iZ++)  {  vMarchCube(iX, iY, iZ, 1);  }  printf("finish one Draw ! !\n");
}
//相交边:一个顶点在等值面外,另一个在等值面内
//立方体顶点的两种状态:在等值面内,或在等值面外,立方体顶点的状态可能有2^8=256种
//下表对应的是顶点状态下,12条边的状态。
//例如:stateVertex = 0000 0001;那么0、3、8号边为相交边 stateEdge = 0001 0000 0101 = 109
GLint aiCubeEdgeFlags[256]=
{  0x000, 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,   0x190, 0x099, 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,   0x230, 0x339, 0x033, 0x13a, 0x636, 0x73f, 0x435, 0x53c, 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,   0x3a0, 0x2a9, 0x1a3, 0x0aa, 0x7a6, 0x6af, 0x5a5, 0x4ac, 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,   0x460, 0x569, 0x663, 0x76a, 0x066, 0x16f, 0x265, 0x36c, 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,   0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0x0ff, 0x3f5, 0x2fc, 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,   0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x055, 0x15c, 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,   0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0x0cc, 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,   0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc, 0x0cc, 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,   0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c, 0x15c, 0x055, 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,   0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc, 0x2fc, 0x3f5, 0x0ff, 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,   0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c, 0x36c, 0x265, 0x16f, 0x066, 0x76a, 0x663, 0x569, 0x460,   0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac, 0x4ac, 0x5a5, 0x6af, 0x7a6, 0x0aa, 0x1a3, 0x2a9, 0x3a0,   0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c, 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x033, 0x339, 0x230,   0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c, 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x099, 0x190,   0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c, 0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x000
};
// 立方体顶点每种(256种)状态对应的相交边情况,并将相交边进行排列得到顺序一致的三角面片(逆时针)
// 例如::顶点状态:0000 0011 -> 相交边状态:0011 0000 1010 = 0x30a -> 三角面片组合:1-8-3 9-8-1
GLint a2iTriangleConnectionTable[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}
}; 

2.部分输出结果

   
不同等值面绘制的图像
  
使用顶点颜色进行绘制+放缩变换
  
三角面片重建细节

面绘制经典算法:MarchingCube实现(C++ OpenGl代码篇)相关推荐

  1. 面绘制经典算法:MarchingCube实现(控制台篇)

    1.MarchingCube marchingcube是一个比较经典而古老的算法,也是面绘制中应用比较多的算法,Marchingcube发展到今天也遇到了几何拓扑.一致性的问题仍待改善.本文研究的就是 ...

  2. pagerank数据集_机器学习十大经典算法-PageRank(附实践代码)

    Yo, yo, check it out. 保证看完不晕倒... 如果公式让你脑瓜疼,请忽略公式,或者忽略脑瓜. Kagging咖金:推荐系统之关联规则(附实践代码)​zhuanlan.zhihu.c ...

  3. 常用数据结构与经典算法 简单讲解与示例代码

    数据结构与算法 数据结构与算法是一个学习计算机绕不过去的话题,而我们大学之中多数课程之中都使用伪代码进行讲解,给对我们的学习理解也是一把双刃剑,虽然可以让我们自己通过算法.思路自己写出程序,但也可能& ...

  4. Java经典算法50题(含代码)

    [程序1]    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 p ...

  5. 决胜经典算法之冒泡排序

    本场Chat是<决胜经典算法>系列的首场,也是众多经典算法里较为简单的一个. 本系列将包含如排序.查找.深度优先/广度优先搜索等等经典算法.仅仅排序部分就包含了10种经典的排序算法,适用于 ...

  6. 求全排序的经典算法“后补法”

    //用于求全排序的经典算法"后补法",代码如下: #include <stdio.h> #include <conio.h> #include <st ...

  7. 机器学习概念和经典算法,我用大白话给你讲清楚了!入门必看

    在数据领域,很多人都在说机器学习,但是只有很少的人能说清楚怎么回事.网上关于机器学习的文章,大多都是充斥各种定理的厚重学术三部曲(我搞定半个定理都够呛),或是关于人工智能.数据科学魔法以及未来工作的天 ...

  8. 从数据挖掘经典算法PageRank入门

    从数据挖掘经典算法PageRank入门Graphene PageRank是Google研发的主要应用于评估网站可靠度和重要性的一种算法,是进行网页排名的考量指标之一.本文将对PageRank的原理进行 ...

  9. java bresenham画直线_OpenGL中点Bresenham绘制直线算法

    本文实例为大家分享了OpenGL中点Bresenham绘制直线算法,供大家参考,具体内容如下 环境 macos xcode编译器 代码 #include #include #include #incl ...

最新文章

  1. 1000亿,行业巨头纷纷押宝的数据中心
  2. 打造增长核武器:承载与创造科技公司70%价值的「网络效应」
  3. Python的__getattr__方法学习
  4. 6.2.2 二叉树的创建
  5. rest laravel_如何通过测试驱动开发来构建Laravel REST API
  6. parallels desktop 缺少组件_德国警方扣留光伏组件盗贼
  7. php进阶课程,php进阶教程学习
  8. nginx location 斜杠_斜杠青年 菲斯塔车主实录
  9. 压力换算公斤单位换算_压力与重量换算(公斤换算压力)
  10. K8S 1.23 metrics-server及cadvisor 杂记
  11. 共模电感 | 关键参数的计算步骤
  12. Sniffer网络监视功能
  13. vue-nuxt-ssr 做谷歌,百度统计以及google,facebook埋点总结
  14. 将计算机设置成交换机主机名,分享:如何配置学校机房项目交换机?
  15. 商品详情页中间显示不出来
  16. Python实现两两交换链表中的节点
  17. 万丈高楼平地起,勿在浮沙筑高台--论程序员基础知识的重要性
  18. 排列组合之插板法及变形
  19. 城市信息模型基础平台(CIM)产品白皮书
  20. 史上最全Git命令学习:从基础出发,Java中高级面试题总结(全面)

热门文章

  1. Hibernate Cascade 属性
  2. Safari 10默认禁用Flash插件
  3. 手把手教你从Core Data迁移到Realm
  4. saiku、mondrian前奏之——立方体、维度、Schema的基本概念
  5. 12.10课堂学习----实例化、构造方法案例
  6. Linux环境下Redmine的安装(一)
  7. 5、线程终止方式:pthread_cleanup_push/pthread_cleanup_pop()
  8. nyist-508(余数求和)
  9. hdu-Cube(三位树状数组)
  10. FZOJ 2014年11月份月赛 ytaaa(dp + RMQ)