2017-11-17 19 views
0

CGAL을 사용하여 다음 작업을 수행하고 싶습니다. 표면 메쉬를 교차시킵니다. 컷 메쉬; 다른 표면 메쉬; 절단 된 메쉬; 절단 된 메쉬를 2 개의 다른 메쉬로 나눕니다.CGAL 슬라이서 : 메쉬 절단을 수행하는 방법은 무엇입니까?

이렇게하려면 폴리선 세트를 제공하는 CGAL Mesh Slicer을 사용하십시오. 불행히도, 슬라이서는 각 폴리 라인이 속한 절단 된 메시의면에 대한 정보를 제공하지 않습니다. 또한 슬라이서 동작을 효과적으로 수행합니다. 어떻게이 정보를 검색 할 수 있습니까?

이 정보는 폴리선을 따라 절단 된 메쉬의 세분화를 수행 한 다음 2 개의 개별 메쉬로 나누는 데 필요합니다. 여기 Cut Mesh

가 절단 된 메쉬 +를의 cutted 메쉬입니다 : 내 맥락에서

가 절단 메시는이 같은 표면 메쉬 내 코드에서 enter image description here

, 나는 각각의 얼굴에서 비행기를 생성 절단 된 메쉬로 슬라이스 작업을 수행합니다. 당신의 도움에 대한

//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

안녕하세요 @ 솔라리스, 고마워요. 분명히 clip() 함수가 예상대로 작동하지 않습니다. 나는이 상처를 수행하기 위해 노력하고있다. [link] (https://imgur.com/a/iTccj), 그러나 나는이 결과를 얻는다 : [link] (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에있는 비 문서화 된 클립() 함수를 사용해보십시오