From 46e771534d64574a347aaf321c23f0fcbda1d991 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 21 Nov 2023 16:53:46 +0100 Subject: [PATCH] add example --- .../mesh_and_remesh_with_adaptive_sizing.cpp | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 Tetrahedral_remeshing/examples/Tetrahedral_remeshing/mesh_and_remesh_with_adaptive_sizing.cpp diff --git a/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/mesh_and_remesh_with_adaptive_sizing.cpp b/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/mesh_and_remesh_with_adaptive_sizing.cpp new file mode 100644 index 000000000000..125c088b1473 --- /dev/null +++ b/Tetrahedral_remeshing/examples/Tetrahedral_remeshing/mesh_and_remesh_with_adaptive_sizing.cpp @@ -0,0 +1,94 @@ +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include + +// Domain +using K = CGAL::Exact_predicates_inexact_constructions_kernel; +using Point = K::Point_3; +using FT = K::FT; +using Polyhedron = CGAL::Polyhedron_3; +using Mesh_domain = CGAL::Polyhedral_mesh_domain_3; + +// Triangulation for Meshing +using Tr = CGAL::Mesh_triangulation_3::type; +using C3t3 = CGAL::Mesh_complex_3_in_triangulation_3; + +// Criteria +using Mesh_criteria = CGAL::Mesh_criteria_3; + +// Triangulation for Remeshing +using T3 = CGAL::Triangulation_3; + +// 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("meshes/elk.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); + + std::cout << "Meshing..."; + std::cout.flush(); + + // Mesh criteria + Mesh_criteria criteria(facet_angle = 25, + facet_distance = 0.2, + cell_radius_edge_ratio = 3); + + // Mesh generation + C3t3 c3t3 = CGAL::make_mesh_3(domain, criteria, no_perturb().no_exude()); + + std::cout << "\rMeshing done." << std::endl; + + T3 tr = CGAL::convert_to_triangulation_3(std::move(c3t3)); + //note we use the move semantic, with std::move(c3t3), + // to avoid a copy of the triangulation by the function + // `CGAL::convert_to_triangulation_3()` + // After the call to this function, c3t3 is an empty and valid C3t3. + //It is possible to use : CGAL::convert_to_triangulation_3(c3t3), + // Then the triangulation is copied and duplicated, and c3t3 remains as is. + + std::cout << "Remeshing..."; + std::cout.flush(); + + CGAL::Tetrahedral_remeshing::Adaptive_remeshing_sizing_field + adaptive_field(tr); + + CGAL::tetrahedral_isotropic_remeshing(tr, + adaptive_field, + CGAL::parameters::number_of_iterations(5)); + + std::cout << "\rRemeshing done." << std::endl; + + std::ofstream osr("out_remeshing.mesh"); + CGAL::IO::write_MEDIT(osr, tr); + osr.close(); + + return EXIT_SUCCESS; +}