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

📄 marchingcubes.cpp

📁 RBF平台
💻 CPP
📖 第 1 页 / 共 3 页
字号:
  case 12 : return s>0 ;  case 13 : return s<0 ;  case 14 : return s<0 ;  case 15 : return s<0 ;  }  return s<0 ;}//_____________________________________________________________________________//_____________________________________________________________________________// Process a unit cubevoid MarchingCubes::process_cube( )//-----------------------------------------------------------------------------{  if( _originalMC )  {    char nt = 0 ;    while( casesClassic[_lut_entry][3*nt] != -1 ) nt++ ;    add_triangle( casesClassic[_lut_entry], nt ) ;    return ;  }  int   v12 = -1 ;  _case   = cases[_lut_entry][0] ;  _config = cases[_lut_entry][1] ;  _subconfig = 0 ;  _N[_case]++ ;  switch( _case )  {  case  0 :    break ;  case  1 :    add_triangle( tiling1[_config], 1 ) ;    break ;  case  2 :    add_triangle( tiling2[_config], 2 ) ;    break ;  case  3 :    if( test_face( test3[_config]) )      add_triangle( tiling3_2[_config], 4 ) ; // 3.2    else      add_triangle( tiling3_1[_config], 2 ) ; // 3.1    break ;  case  4 :    if( test_interior( test4[_config]) )      add_triangle( tiling4_1[_config], 2 ) ; // 4.1.1    else      add_triangle( tiling4_2[_config], 6 ) ; // 4.1.2    break ;  case  5 :    add_triangle( tiling5[_config], 3 ) ;    break ;  case  6 :    if( test_face( test6[_config][0]) )      add_triangle( tiling6_2[_config], 5 ) ; // 6.2    else    {      if( test_interior( test6[_config][1]) )        add_triangle( tiling6_1_1[_config], 3 ) ; // 6.1.1      else        add_triangle( tiling6_1_2[_config], 7 ) ; // 6.1.2    }    break ;  case  7 :    if( test_face( test7[_config][0] ) ) _subconfig +=  1 ;    if( test_face( test7[_config][1] ) ) _subconfig +=  2 ;    if( test_face( test7[_config][2] ) ) _subconfig +=  4 ;    switch( _subconfig )      {      case 0 :        add_triangle( tiling7_1[_config], 3 ) ; break ;      case 1 :        add_triangle( tiling7_2[_config][0], 5 ) ; break ;      case 2 :        add_triangle( tiling7_2[_config][1], 5 ) ; break ;      case 3 :        v12 = add_c_vertex() ;        add_triangle( tiling7_3[_config][0], 9, v12 ) ; break ;      case 4 :        add_triangle( tiling7_2[_config][2], 5 ) ; break ;      case 5 :        v12 = add_c_vertex() ;        add_triangle( tiling7_3[_config][1], 9, v12 ) ; break ;      case 6 :        v12 = add_c_vertex() ;        add_triangle( tiling7_3[_config][2], 9, v12 ) ; break ;      case 7 :        if( test_interior( test7[_config][3]) )          add_triangle( tiling7_4_2[_config], 9 ) ;        else          add_triangle( tiling7_4_1[_config], 5 ) ;        break ;      };    break ;  case  8 :    add_triangle( tiling8[_config], 2 ) ;    break ;  case  9 :    add_triangle( tiling9[_config], 4 ) ;    break ;  case 10 :    if( test_face( test10[_config][0]) )    {      if( test_face( test10[_config][1]) )        add_triangle( tiling10_1_1_[_config], 4 ) ; // 10.1.1      else      {        v12 = add_c_vertex() ;        add_triangle( tiling10_2[_config], 8, v12 ) ; // 10.2      }    }    else    {      if( test_face( test10[_config][1]) )      {        v12 = add_c_vertex() ;        add_triangle( tiling10_2_[_config], 8, v12 ) ; // 10.2      }      else      {        if( test_interior( test10[_config][2]) )          add_triangle( tiling10_1_1[_config], 4 ) ; // 10.1.1        else          add_triangle( tiling10_1_2[_config], 8 ) ; // 10.1.2      }    }    break ;  case 11 :    add_triangle( tiling11[_config], 4 ) ;    break ;  case 12 :    if( test_face( test12[_config][0]) )    {      if( test_face( test12[_config][1]) )        add_triangle( tiling12_1_1_[_config], 4 ) ; // 12.1.1      else      {        v12 = add_c_vertex() ;        add_triangle( tiling12_2[_config], 8, v12 ) ; // 12.2      }    }    else    {      if( test_face( test12[_config][1]) )      {        v12 = add_c_vertex() ;        add_triangle( tiling12_2_[_config], 8, v12 ) ; // 12.2      }      else      {        if( test_interior( test12[_config][2]) )          add_triangle( tiling12_1_1[_config], 4 ) ; // 12.1.1        else          add_triangle( tiling12_1_2[_config], 8 ) ; // 12.1.2      }    }    break ;  case 13 :    if( test_face( test13[_config][0] ) ) _subconfig +=  1 ;    if( test_face( test13[_config][1] ) ) _subconfig +=  2 ;    if( test_face( test13[_config][2] ) ) _subconfig +=  4 ;    if( test_face( test13[_config][3] ) ) _subconfig +=  8 ;    if( test_face( test13[_config][4] ) ) _subconfig += 16 ;    if( test_face( test13[_config][5] ) ) _subconfig += 32 ;    switch( subconfig13[_subconfig] )    {      case 0 :/* 13.1 */        add_triangle( tiling13_1[_config], 4 ) ; break ;      case 1 :/* 13.2 */        add_triangle( tiling13_2[_config][0], 6 ) ; break ;      case 2 :/* 13.2 */        add_triangle( tiling13_2[_config][1], 6 ) ; break ;      case 3 :/* 13.2 */        add_triangle( tiling13_2[_config][2], 6 ) ; break ;      case 4 :/* 13.2 */        add_triangle( tiling13_2[_config][3], 6 ) ; break ;      case 5 :/* 13.2 */        add_triangle( tiling13_2[_config][4], 6 ) ; break ;      case 6 :/* 13.2 */        add_triangle( tiling13_2[_config][5], 6 ) ; break ;      case 7 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3[_config][0], 10, v12 ) ; break ;      case 8 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3[_config][1], 10, v12 ) ; break ;      case 9 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3[_config][2], 10, v12 ) ; break ;      case 10 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3[_config][3], 10, v12 ) ; break ;      case 11 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3[_config][4], 10, v12 ) ; break ;      case 12 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3[_config][5], 10, v12 ) ; break ;      case 13 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3[_config][6], 10, v12 ) ; break ;      case 14 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3[_config][7], 10, v12 ) ; break ;      case 15 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3[_config][8], 10, v12 ) ; break ;      case 16 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3[_config][9], 10, v12 ) ; break ;      case 17 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3[_config][10], 10, v12 ) ; break ;      case 18 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3[_config][11], 10, v12 ) ; break ;      case 19 :/* 13.4 */        v12 = add_c_vertex() ;        add_triangle( tiling13_4[_config][0], 12, v12 ) ; break ;      case 20 :/* 13.4 */        v12 = add_c_vertex() ;        add_triangle( tiling13_4[_config][1], 12, v12 ) ; break ;      case 21 :/* 13.4 */        v12 = add_c_vertex() ;        add_triangle( tiling13_4[_config][2], 12, v12 ) ; break ;      case 22 :/* 13.4 */        v12 = add_c_vertex() ;        add_triangle( tiling13_4[_config][3], 12, v12 ) ; break ;      case 23 :/* 13.5 */        _subconfig = 0 ;        if( test_interior( test13[_config][6] ) )          add_triangle( tiling13_5_1[_config][0], 6 ) ;        else          add_triangle( tiling13_5_2[_config][0], 10 ) ;        break ;      case 24 :/* 13.5 */        _subconfig = 1 ;        if( test_interior( test13[_config][6] ) )          add_triangle( tiling13_5_1[_config][1], 6 ) ;        else          add_triangle( tiling13_5_2[_config][1], 10 ) ;        break ;      case 25 :/* 13.5 */        _subconfig = 2 ;        if( test_interior( test13[_config][6] ) )          add_triangle( tiling13_5_1[_config][2], 6 ) ;        else          add_triangle( tiling13_5_2[_config][2], 10 ) ;        break ;      case 26 :/* 13.5 */        _subconfig = 3 ;        if( test_interior( test13[_config][6] ) )          add_triangle( tiling13_5_1[_config][3], 6 ) ;        else          add_triangle( tiling13_5_2[_config][3], 10 ) ;        break ;      case 27 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3_[_config][0], 10, v12 ) ; break ;      case 28 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3_[_config][1], 10, v12 ) ; break ;      case 29 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3_[_config][2], 10, v12 ) ; break ;      case 30 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3_[_config][3], 10, v12 ) ; break ;      case 31 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3_[_config][4], 10, v12 ) ; break ;      case 32 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3_[_config][5], 10, v12 ) ; break ;      case 33 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3_[_config][6], 10, v12 ) ; break ;      case 34 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3_[_config][7], 10, v12 ) ; break ;      case 35 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3_[_config][8], 10, v12 ) ; break ;      case 36 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3_[_config][9], 10, v12 ) ; break ;      case 37 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3_[_config][10], 10, v12 ) ; break ;      case 38 :/* 13.3 */        v12 = add_c_vertex() ;        add_triangle( tiling13_3_[_config][11], 10, v12 ) ; break ;      case 39 :/* 13.2 */        add_triangle( tiling13_2_[_config][0], 6 ) ; break ;      case 40 :/* 13.2 */        add_triangle( tiling13_2_[_config][1], 6 ) ; break ;      case 41 :/* 13.2 */        add_triangle( tiling13_2_[_config][2], 6 ) ; break ;      case 42 :/* 13.2 */        add_triangle( tiling13_2_[_config][3], 6 ) ; break ;      case 43 :/* 13.2 */        add_triangle( tiling13_2_[_config][4], 6 ) ; break ;      case 44 :/* 13.2 */        add_triangle( tiling13_2_[_config][5], 6 ) ; break ;      case 45 :/* 13.1 */        add_triangle( tiling13_1_[_config], 4 ) ; break ;      default :        printf("Marching Cubes: Impossible case 13?\n" ) ;  print_cube() ;      }      break ;  case 14 :    add_triangle( tiling14[_config], 4 ) ;    break ;  };}//_____________________________________________________________________________//_____________________________________________________________________________// Adding trianglesvoid MarchingCubes::add_triangle( const char* trig, char n, int v12 )//-----------------------------------------------------------------------------{  int    tv[3] ;  for( int t = 0 ; t < 3*n ; t++ )  {    switch( trig[t] )    {    case  0 : tv[ t % 3 ] = get_x_vert( _i , _j , _k ) ; break ;    case  1 : tv[ t % 3 ] = get_y_vert(_i+1, _j , _k ) ; break ;    case  2 : tv[ t % 3 ] = get_x_vert( _i ,_j+1, _k ) ; break ;    case  3 : tv[ t % 3 ] = get_y_vert( _i , _j , _k ) ; break ;    case  4 : tv[ t % 3 ] = get_x_vert( _i , _j ,_k+1) ; break ;    case  5 : tv[ t % 3 ] = get_y_vert(_i+1, _j ,_k+1) ; break ;    case  6 : tv[ t % 3 ] = get_x_vert( _i ,_j+1,_k+1) ; break ;    case  7 : tv[ t % 3 ] = get_y_vert( _i , _j ,_k+1) ; break ;    case  8 : tv[ t % 3 ] = get_z_vert( _i , _j , _k ) ; break ;    case  9 : tv[ t % 3 ] = get_z_vert(_i+1, _j , _k ) ; break ;    case 10 : tv[ t % 3 ] = get_z_vert(_i+1,_j+1, _k ) ; break ;    case 11 : tv[ t % 3 ] = get_z_vert( _i ,_j+1, _k ) ; break ;    case 12 : tv[ t % 3 ] = v12 ; break ;    default : break ;    }    if( tv[t%3] == -1 )    {      printf("Marching Cubes: invalid triangle %d\n", _ntrigs+1) ;      print_cube() ;    }    if( t%3 == 2 )    {      if( _ntrigs >= _Ntrigs )      {        Triangle *temp = _triangles ;        _triangles = new Triangle[ 2*_Ntrigs ] ;        memcpy( _triangles, temp, _Ntrigs*sizeof(Triangle) ) ;        delete[] temp ;        printf("%d allocated triangles\n", _Ntrigs) ;        _Ntrigs *= 2 ;      }      Triangle *T = _triangles + _ntrigs++ ;      T->v1    = tv[0] ;      T->v2    = tv[1] ;      T->v3    = tv[2] ;    }  }}//_____________________________________________________________________________

⌨️ 快捷键说明

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