From 6c4f1274ef02ced53ce45c57d80cd6e957f49d0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Mon, 15 Feb 2016 14:23:09 +0100 Subject: [PATCH] refine and fairing functions requires a triangle mesh --- .../Polygon_mesh_processing.txt | 12 ++--- .../CGAL/Polygon_mesh_processing/fair.h | 46 ++++++++++--------- .../CGAL/Polygon_mesh_processing/refine.h | 34 ++++++++------ 3 files changed, 50 insertions(+), 42 deletions(-) diff --git a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt index 94eef5cff5d..a769ba414b0 100644 --- a/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt +++ b/Polygon_mesh_processing/doc/Polygon_mesh_processing/Polygon_mesh_processing.txt @@ -72,7 +72,7 @@ The visual results of aforementioned steps are depicted by \cgalFigureRef{Mech_s \subsubsection Meshing -Refinement and fairing functions can be applied to an arbitrary region on a mesh, using : +Refinement and fairing functions can be applied to an arbitrary region on a triangle mesh, using : - `CGAL::Polygon_mesh_processing::refine()` : given a set of facets on a mesh, refines the region. - `CGAL::Polygon_mesh_processing::fair()` : given a set of vertices on a mesh, fairs the region. @@ -124,10 +124,10 @@ Isotropic remeshing. (a) Triangulated input surface mesh. \subsection MeshingExamples Meshing Examples -\subsubsection MeshingExample_1 Refine and Fair a Region on a Polygon Mesh +\subsubsection MeshingExample_1 Refine and Fair a Region on a Triangle Mesh The following example calls the functions `CGAL::Polygon_mesh_processing::refine()` -and `CGAL::Polygon_mesh_processing::fair()` for some selected regions on the input polygon mesh. +and `CGAL::Polygon_mesh_processing::fair()` for some selected regions on the input triangle mesh. \cgalExample{Polygon_mesh_processing/refine_fair_example.cpp} @@ -477,8 +477,8 @@ For each requirement, the table answers a question :
Function or Class | Pure Triangle | Self-Intersection Free | Closed :------------------------------------ | :------------: | :--------------------: | :-------: -`fair()` | no | no | no -`refine()` | no | no | no +`fair()` | yes | no | no +`refine()` | yes | no | no `triangulate_faces()` | no | no | no `isotropic_remeshing()` | no | no | no `split_long_edges()` | no | no | no @@ -494,7 +494,7 @@ Function or Class | Pure Triangle | Self-Intersection Free `stitch_borders()` | no | no | no `polygon_soup_to_polygon_mesh()` | no | no | no `orient_polygon_soup()` | no | no | no -`remove_isolated_vertices()` | no | no | no +`remove_isolated_vertices()` | no | no | no `compute_face_normal()` | no | no | no `compute_face_normals()` | no | no | no `compute_vertex_normal()` | no | no | no diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/fair.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/fair.h index 6f3d8ccee18..095a399d990 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/fair.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/fair.h @@ -41,10 +41,10 @@ namespace internal { // weight_calculator a function object to calculate weights, defaults to Cotangent weights and can be omitted template - bool fair(PolygonMesh& pmesh, + bool fair(TriangleMesh& tmesh, const VertexRange& vertices, SparseLinearSolver solver, WeightCalculator weight_calculator, @@ -52,8 +52,8 @@ namespace internal { VertexPointMap vpmap) { CGAL::Polygon_mesh_processing::internal::Fair_Polyhedron_3 - - fair_functor(pmesh, vpmap, weight_calculator); + + fair_functor(tmesh, vpmap, weight_calculator); return fair_functor.fair(vertices, solver, continuity); } @@ -61,7 +61,7 @@ namespace internal { /*! \ingroup PMP_meshing_grp - @brief fairs a region on a polygon mesh. + @brief fairs a region on a triangle mesh. The points of the selected vertices are relocated to yield an as-smooth-as-possible surface patch, based on solving a linear bi-Laplacian system with boundary constraints, @@ -76,39 +76,43 @@ namespace internal { Fairing might fail if fixed vertices, which are used as boundary conditions, do not suffice to solve constructed linear system. - Note that if the vertex range to which fairing is applied contains all the vertices of the polygon mesh, + Note that if the vertex range to which fairing is applied contains all the vertices of the triangle mesh, fairing does not fail, but the mesh gets shrinked to `CGAL::ORIGIN`. - @tparam PolygonMesh a model of `FaceGraph` and `MutableFaceGraph` + @tparam TriangleMesh a model of `FaceGraph` and `MutableFaceGraph` that has an internal property map for `CGAL::vertex_point_t` - @tparam VertexRange a range of vertex descriptors of `PolygonMesh`, model of `Range`. + @tparam VertexRange a range of vertex descriptors of `TriangleMesh`, model of `Range`. Its iterator type is `InputIterator`. @tparam NamedParameters a sequence of \ref namedparameters - @param pmesh the polygon mesh with patches to be faired + @param tmesh the triangle mesh with patches to be faired @param vertices the vertices of the patches to be faired (the positions of only those vertices will be changed) @param np optional sequence of \ref namedparameters among the ones listed below \cgalNamedParamsBegin - \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of `pmesh` \cgalParamEnd + \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of `tmesh` \cgalParamEnd \cgalParamBegin{fairing_continuity} tangential continuity of the output surface patch. The larger `fairing_continuity` gets, the more fixed vertices are required \cgalParamEnd \cgalParamBegin{sparse_linear_solver} an instance of the sparse linear solver used for fairing \cgalParamEnd \cgalNamedParamsEnd @return `true` if fairing is successful, otherwise no vertices are relocated + @pre `is_triangle_mesh(tmesh)` + @todo accuracy of solvers are not good, for example when there is no boundary condition pre_factor should fail, but it does not. */ - template - bool fair(PolygonMesh& pmesh, + bool fair(TriangleMesh& tmesh, const VertexRange& vertices, const NamedParameters& np) { using boost::get_param; using boost::choose_param; + CGAL_precondition(is_triangle_mesh(tmesh)); + #if defined(CGAL_EIGEN3_ENABLED) #if EIGEN_VERSION_AT_LEAST(3,2,0) typedef CGAL::Eigen_solver_traits::type VPMap; - typedef CGAL::internal::Cotangent_weight_with_voronoi_area_fairing + typedef typename GetVertexPointMap < TriangleMesh, NamedParameters>::type VPMap; + typedef CGAL::internal::Cotangent_weight_with_voronoi_area_fairing Default_Weight_calculator; - VPMap vpmap_ = choose_param(get_param(np, vertex_point), get(CGAL::vertex_point, pmesh)); + VPMap vpmap_ = choose_param(get_param(np, vertex_point), get(CGAL::vertex_point, tmesh)); - return internal::fair(pmesh, vertices, + return internal::fair(tmesh, vertices, choose_param(get_param(np, sparse_linear_solver), Default_solver()), - choose_param(get_param(np, weight_calculator), Default_Weight_calculator(pmesh, vpmap_)), + choose_param(get_param(np, weight_calculator), Default_Weight_calculator(tmesh, vpmap_)), choose_param(get_param(np, fairing_continuity), 1), vpmap_ ); } - template - bool fair(PolygonMesh& pmesh, const VertexRange& vertices) + template + bool fair(TriangleMesh& tmesh, const VertexRange& vertices) { - return fair(pmesh, vertices, + return fair(tmesh, vertices, CGAL::Polygon_mesh_processing::parameters::all_default()); } - + } //end namespace Polygon_mesh_processing } //end namespace CGAL diff --git a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/refine.h b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/refine.h index c8211471fdf..a3978d5072d 100644 --- a/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/refine.h +++ b/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/refine.h @@ -32,28 +32,28 @@ namespace Polygon_mesh_processing { /*! \ingroup PMP_meshing_grp - @brief refines a region of a polygon mesh + @brief refines a region of a triangle mesh - @tparam PolygonMesh model of `MutableFaceGraph` + @tparam TriangleMesh model of `MutableFaceGraph` that has an internal property map for `CGAL::vertex_point_t` @tparam FaceRange range of face descriptors, model of `Range`. Its iterator type is `InputIterator`. @tparam FaceOutputIterator model of `OutputIterator` - holding `boost::graph_traits::%face_descriptor` for patch faces + holding `boost::graph_traits::%face_descriptor` for patch faces @tparam VertexOutputIterator model of `OutputIterator` - holding `boost::graph_traits::%vertex_descriptor` for patch vertices + holding `boost::graph_traits::%vertex_descriptor` for patch vertices @tparam NamedParameters a sequence of \ref namedparameters - @param pmesh polygon mesh with patches to be refined + @param tmesh triangle mesh with patches to be refined @param faces the range of faces defining the patches to refine @param faces_out output iterator into which descriptors of new faces are recorded @param vertices_out output iterator into which descriptors of new vertices are recorded @param np optional sequence of \ref namedparameters among the ones listed below \cgalNamedParamsBegin - \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of `pmesh` + \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of `tmesh` Instance of a class model of `ReadWritePropertyMap` \cgalParamEnd - \cgalParamBegin{density_control_factor} factor to control density of the ouput mesh, + \cgalParamBegin{density_control_factor} factor to control density of the output mesh, where larger values lead to denser refinements. The density of vertices of `faces_out` is this factor times higher than the vertices of `faces.` \cgalParamEnd \cgalNamedParamsEnd @@ -61,15 +61,17 @@ namespace Polygon_mesh_processing { @return pair of `faces_out` and `vertices_out` + \pre `is_triangle_mesh(tmesh)` + @todo current algorithm iterates 10 times at most, since (I guess) there is no termination proof. */ - template std::pair - refine(PolygonMesh& pmesh, + refine(TriangleMesh& tmesh, const FaceRange& faces, FaceOutputIterator faces_out, VertexOutputIterator vertices_out, @@ -79,12 +81,14 @@ namespace Polygon_mesh_processing { using boost::choose_param; using boost::get_param; - typedef typename GetVertexPointMap::type VPmap; + CGAL_precondition(is_triangle_mesh(tmesh) ); + + typedef typename GetVertexPointMap::type VPmap; VPmap vpm = choose_pmap(get_param(np, boost::vertex_point), - pmesh, + tmesh, boost::vertex_point); - internal::Refine_Polyhedron_3 refine_functor(pmesh, vpm); + internal::Refine_Polyhedron_3 refine_functor(tmesh, vpm); refine_functor.refine(faces, faces_out, vertices_out, @@ -93,18 +97,18 @@ namespace Polygon_mesh_processing { } ///\cond SKIP_IN_MANUAL - template std::pair - refine(PolygonMesh& pmesh, + refine(TriangleMesh& tmesh, const FaceRange& faces, FaceOutputIterator faces_out, VertexOutputIterator vertices_out) { - return refine(pmesh, faces, faces_out, vertices_out, + return refine(tmesh, faces, faces_out, vertices_out, CGAL::Polygon_mesh_processing::parameters::all_default()); } ///\endcond