tetrahedral meshの読み込み方
.smeshをtetgenにかけると.ele, .node, .faceファイルが出力されるわけですが、
これらもごく単純なフォーマットで、次の程度のもので読み込むことが可能です。
template < class Traits > void make_softvolume( const char* basename, float mass, partix::SoftVolume< Traits >*& volume, partix::TetrahedralMesh< Traits >*& mesh ) { typedef partix::Point< Traits > point_type; typedef typename Traits::vector_type vector_type; std::string filename( basename ); mesh = new partix::TetrahedralMesh< Traits >; // .node(頂点座標)読み込み { std::ifstream ifs( ( filename + ".node" ).c_str() ); int node_count, dummy; ifs >> node_count >> dummy >> dummy >> dummy; for( int i = 0 ; i < node_count ; i++ ) { vector_type p; ifs >> dummy >> p.x >> p.y >> p.z; mesh->add_point( p, mass ); } } // .ele(tetrahedron)読み込み { std::ifstream ifs( ( filename + ".ele" ).c_str() ); int node_count, dummy; ifs >> node_count >> dummy >> dummy; for( int i = 0 ; i < node_count ; i++ ) { int i0, i1, i2, i3; ifs >> dummy >> i0 >> i1 >> i2 >> i3; mesh->add_tetrahedron( i0, i1, i2, i3 ); } } // .face(外接面)読み込み { std::ifstream ifs( ( filename + ".face" ).c_str() ); int node_count, dummy; ifs >> node_count >> dummy; for( int i = 0 ; i < node_count ; i++ ) { int i0, i1, i2; ifs >> dummy >> i0 >> i1 >> i2 >> dummy; mesh->add_face( i0, i2, i1 ); // 反転 } } mesh->setup(); volume = new partix::SoftVolume< Traits >; volume->set_mesh( mesh ); volume->regularize(); }
各フォーマットの正確な定義はhttp://tetgen.berlios.de/fformats.htmlにあります。