2017-11-17 9 views
0

私は、CGALを使って次のアクションを実行したいと考えています。 サーフェスメッシュを交差させます。カットメッシュ。別の表面メッシュと;カットメッシュ。カットされたメッシュを2つの異なるメッシュで分割する。CGALスライサー:メッシュカットを実行するには?

これを行うには、CGAL Mesh Slicerを使用して、私にポリラインセットを与えます。残念なことに、スライサーは、各ポリラインが属する切断されたメッシュのどの面に関する情報を提供しない。さらに、効果的にスライサー動作を実行することができます。 この情報はどのように取得できますか?

この情報は、ポリラインに沿ってカットメッシュの細分化を実行し、次に2つの別々のメッシュでの分割を実行するために必要です。ここCut Mesh

カットメッシュ+ cuttedメッシュである:私の文脈において

カットメッシュは、このような表面メッシュである私のコードで enter image description here

、Iは各面から平面を生成します切断されたメッシュを用いてスライス操作を実行する。あなたの助けのための

//Import off files and instantiate meshes 
    const char* filename1 = "test.off"; 
    const char* filename2 = "cutMesh2.off"; 
    std::ifstream input(filename1); 
    Mesh cuttedMesh, cutMesh; 
    if (!input || !(input >> cuttedMesh)) 
    { 
     std::cerr << "First mesh is not a valid off file." << std::endl; 
     return 0; 
    } 
    input.close(); 
    input.open(filename2); 
    if (!input || !(input >> cutMesh)) 
    { 
     std::cerr << "Second mesh is not a valid off file." << std::endl; 
     return 0; 
    } 
    input.close(); 
    // AABB Slicer constructor from the cutted mesh 
    AABB_tree tree(edges(cuttedMesh).first, edges(cuttedMesh).second, cuttedMesh); 
    tree.accelerate_distance_queries(); 
    CGAL::Polygon_mesh_slicer<Mesh, K> slicer_aabb(cuttedMesh, tree); 

    std::cout << cutMesh.num_vertices()<< std::endl; 
    // For each face of the cut mesh 
    BOOST_FOREACH(face_descriptor f, faces(cutMesh)) 
    { 
     std::cout << "Face " << f << std::endl; 
     Point points [3]; 
     int i = 0; 
     //for each point of the current face 
     BOOST_FOREACH(vertex_descriptor v, CGAL::vertices_around_face(cutMesh.halfedge(f), cutMesh)) 
     { 
      points[i]= cutMesh.point(v); 
      ++i; 
     } 
     Polylines polylines; 
     // Perform the slice between the current face of the cut mesh and the cutted mesh 
     slicer_aabb(K::Plane_3(points[0],points[1],points[2]), std::back_inserter(polylines)); 
     std::cout << "the slicer intersects " << polylines.size() << " polylines" << std::endl; 

     //for each polyline computed by this face of the cutmesh 
     BOOST_FOREACH(Polyline_type polyline,polylines) 
     { 
      std::cout << "Polyline : " << polyline.size() << " points"<< std::endl; 

      BOOST_FOREACH(Point point, polyline) 
      { 
       std::cout << "Point : " << point << std::endl; 
      } 
     } 
     std::cout << std::endl; 
     polylines.clear(); 
    } 

ありがとう:

は、ここに私のコードです。

+0

'Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/clip.h'にある、文書化されていない' clip() '関数を試してみてください。 – sloriot

+0

こんにちは@Sloriot、ありがとう。クリップ()関数が期待どおりに動作していないようです。私はこのカットを実行しようとしている:[リンク](https://imgur.com/a/iTccj)、私はこの結果を得る:[リンク](https://imgur.com/a/wy9Pj)。ご覧のとおり、ランタンの上部が消えました...私が使用しているファイルは次のとおりです。[link](https://1drv.ms/f/s!AmohQtwadi_ThL1dtl15EbG42QpbsQ) –

+0

プレーンクリッパーの向きをそのまま他の部分。 – sloriot

答えて

1

ポストに対する答えがsloriotによって提案されている:

/含む/ CGAL/Polygon_mesh_processing /internal/clip.h

Polygon_mesh_processingに位置する非文書クリップ()関数を使用してみてください
関連する問題