From 086476bc3037a73b0e1fd9efd3114ec2c6fc5546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 7 Apr 2022 17:30:40 +0200 Subject: [PATCH] improve example --- .../cc_compatible_orientations.cpp | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/Polygon_mesh_processing/examples/Polygon_mesh_processing/cc_compatible_orientations.cpp b/Polygon_mesh_processing/examples/Polygon_mesh_processing/cc_compatible_orientations.cpp index a4e4afe3e3c..adee9c501d1 100644 --- a/Polygon_mesh_processing/examples/Polygon_mesh_processing/cc_compatible_orientations.cpp +++ b/Polygon_mesh_processing/examples/Polygon_mesh_processing/cc_compatible_orientations.cpp @@ -8,8 +8,7 @@ #include #include -#include -#include +#include typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef Kernel::Point_3 Point; @@ -19,14 +18,11 @@ typedef CGAL::Surface_mesh Mesh; namespace PMP = CGAL::Polygon_mesh_processing; - -int main() -{ // create a mesh with many connected connected components that should // be reoriented to define a valid closed mesh +void create_mesh_with_cc_to_orient(Mesh& mesh) +{ const std::string filename = CGAL::data_file_path("meshes/elephant.off"); - - Mesh mesh; CGAL::IO::read_polygon_mesh(filename, mesh); // turn the mesh into a triangle soup, duplicating all the vertices and shuffling orientations @@ -34,8 +30,6 @@ int main() std::vector< std::array > triangles; triangles.reserve(faces(mesh).size()); points.reserve(3*triangles.size()); - std::random_device rd; - std::mt19937 g(rd()); for (Mesh::Face_index f : mesh.faces()) { Mesh::Halfedge_index h = mesh.halfedge(f); @@ -44,31 +38,38 @@ int main() points.push_back(mesh.point(target(h,mesh))); points.push_back(mesh.point(target(mesh.next(h),mesh))); triangles.push_back( {s, s+1, s+2} ); - std::shuffle(triangles.back().begin(), triangles.back().end(), g); + if (std::rand() % 2 == 0) + std::swap(triangles.back()[0], triangles.back()[1]); } // load the soup into the mesh; mesh.clear(); PMP::polygon_soup_to_polygon_mesh(points, triangles, mesh); - CGAL::IO::write_polygon_mesh("soup.off", mesh, CGAL::parameters::stream_precision(17)); +} -// determine face orientations to be reversed to create compatibility +int main() +{ + Mesh mesh; + create_mesh_with_cc_to_orient(mesh); + CGAL::IO::write_polygon_mesh("to_orient.off", mesh, CGAL::parameters::stream_precision(17)); + + // determine face orientations to be reversed to create compatibility auto fbm = mesh.add_property_map("fbm", false).first; bool is_orientable = PMP::connected_components_compatible_orientations(mesh, fbm); assert(is_orientable); -// reverse orientation of faces with bit 1 + // reverse orientation of faces with bit 1 std::vector faces_to_reverse; for (Mesh::Face_index f : mesh.faces()) if (get(fbm, f)) faces_to_reverse.push_back(f); PMP::reverse_face_orientations(faces_to_reverse, mesh); -// there are still borders between previously incompatible faces: stitch to close the mesh + // there are still borders between previously incompatible faces: stitch to close the mesh PMP::stitch_borders(mesh); assert(CGAL::is_closed(mesh)); - CGAL::IO::write_polygon_mesh("reoriented_and_stitched.off", mesh, CGAL::parameters::stream_precision(17)); + CGAL::IO::write_polygon_mesh("oriented_and_stitched.off", mesh, CGAL::parameters::stream_precision(17)); return 0; }