📄 marchingcubes.cpp
字号:
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 + -