Triangle Remeshing
2022-04-23
출처: https://doc.cgal.org/latest/Mesh_3/index.html#Chapter_3D_Mesh_Generation
triangle 로 이루어진 파트가 있을때.. 아래와 같이 CGAL을 이용하여 remshing 가능..
컴파일…
% g++ -Wa,-mbig-obj -O2 ./remesh.cpp -lgmp -lmpfr -lgmp
코드…
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> #include <CGAL/Mesh_triangulation_3.h> #include <CGAL/Mesh_complex_3_in_triangulation_3.h> #include <CGAL/Mesh_criteria_3.h> #include <CGAL/Polyhedral_mesh_domain_with_features_3.h> #include <CGAL/make_mesh_3.h> #include <CGAL/IO/output_to_vtu.h> // Domain typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Mesh_polyhedron_3<K>::type Polyhedron; typedef CGAL::Polyhedral_mesh_domain_with_features_3<K> Mesh_domain; #ifdef CGAL_CONCURRENT_MESH_3 typedef CGAL::Parallel_tag Concurrency_tag; #else typedef CGAL::Sequential_tag Concurrency_tag; #endif // Triangulation typedef CGAL::Mesh_triangulation_3<Mesh_domain,CGAL::Default,Concurrency_tag>::type Tr; typedef CGAL::Mesh_complex_3_in_triangulation_3< Tr,Mesh_domain::Corner_index,Mesh_domain::Curve_index> C3t3; // Criteria typedef CGAL::Mesh_criteria_3<Tr> Mesh_criteria; // To avoid verbose function and named parameters call using namespace CGAL::parameters; int main(int argc, char*argv[]) { const std::string fname = (argc>1)?argv[1]:CGAL::data_file_path("a.off"); std::ifstream input(fname); Polyhedron polyhedron; input >> polyhedron; if(input.fail()){ std::cerr << "Error: Cannot read file " << fname << std::endl; return EXIT_FAILURE; } if (!CGAL::is_triangle_mesh(polyhedron)){ std::cerr << "Input geometry is not triangulated." << std::endl; return EXIT_FAILURE; } // Create domain Mesh_domain domain(polyhedron); // Get sharp features domain.detect_features(); // Mesh criteria Mesh_criteria criteria(edge_size = 1, facet_angle = 25, facet_size = 1, facet_distance = 1); // Mesh generation C3t3 c3t3 = CGAL::make_mesh_3<C3t3>(domain, criteria); // Output the facets of the c3t3 to an OFF file. The facets will not be // oriented. std::ofstream off_file("out.off"); c3t3.output_boundary_to_off(off_file); return off_file.fail() ? EXIT_FAILURE : EXIT_SUCCESS; }
Categorized as: Programming
답글 남기기