// Copyright (c) 2013 GeometryFactory (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // // $URL: https://github.com/CGAL/cgal/blob/v5.1/Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/refine.h $ // $Id: refine.h 48bd92b 2020-04-13T13:03:05+02:00 Mael Rouxel-Labbé // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // // Author(s) : Ilker O. Yaz #ifndef CGAL_POLYGON_MESH_PROCESSING_REFINE_H #define CGAL_POLYGON_MESH_PROCESSING_REFINE_H #include #include #include #include namespace CGAL { namespace Polygon_mesh_processing { /*! \ingroup PMP_meshing_grp @brief refines a region of a triangle mesh @tparam TriangleMesh model of `MutableFaceGraph` @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 @tparam VertexOutputIterator model of `OutputIterator` holding `boost::graph_traits::%vertex_descriptor` for patch vertices @tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" @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 an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below \cgalNamedParamsBegin \cgalParamNBegin{vertex_point_map} \cgalParamDescription{a property map associating points to the vertices of `tmesh`} \cgalParamType{a class model of `ReadWritePropertyMap` with `boost::graph_traits::%vertex_descriptor` as key type and `%Point_3` as value type} \cgalParamDefault{`boost::get(CGAL::vertex_point, tmesh)`} \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` must be available in `TriangleMesh`.} \cgalParamNEnd \cgalParamNBegin{density_control_factor} \cgalParamDescription{a factor to control density of the output mesh, where larger values lead to denser refinements} \cgalParamType{double} \cgalParamDefault{\f$ \sqrt{2}\f$} \cgalParamExtra{The density of vertices of `faces_out` is this factor times higher than the vertices of `faces`.} \cgalParamNEnd \cgalNamedParamsEnd @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(TriangleMesh& tmesh, const FaceRange& faces, FaceOutputIterator faces_out, VertexOutputIterator vertices_out, const NamedParameters& np) { using parameters::choose_parameter; using parameters::get_parameter; CGAL_precondition(is_triangle_mesh(tmesh) ); typedef typename GetVertexPointMap::type VPmap; VPmap vpm = choose_parameter(get_parameter(np, internal_np::vertex_point), get_property_map(vertex_point, tmesh)); internal::Refine_Polyhedron_3 refine_functor(tmesh, vpm); refine_functor.refine(faces, faces_out, vertices_out, choose_parameter(get_parameter(np, internal_np::density_control_factor), CGAL::sqrt(2.))); return std::make_pair(faces_out, vertices_out); } ///\cond SKIP_IN_MANUAL template std::pair refine(TriangleMesh& tmesh, const FaceRange& faces, FaceOutputIterator faces_out, VertexOutputIterator vertices_out) { return refine(tmesh, faces, faces_out, vertices_out, CGAL::Polygon_mesh_processing::parameters::all_default()); } ///\endcond }//end namespace Polygon_mesh_processing }//end namespace CGAL #endif //CGAL_POLYGON_MESH_PROCESSING_REFINE_H