From d2cd6244ff8b94f9ba3da4ebf64e85a6d7521232 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 21 Sep 2022 17:20:29 +0200 Subject: [PATCH] clean up Periodic_3_mesh_3 doc --- Mesh_3/include/CGAL/refine_mesh_3.h | 2 + .../CGAL/optimize_periodic_3_mesh_3.h | 83 ---- .../doc/Periodic_3_mesh_3/Doxyfile.in | 3 +- .../include/CGAL/make_periodic_3_mesh_3.h | 350 ++++++++-------- .../include/CGAL/optimize_periodic_3_mesh_3.h | 119 ++++-- .../include/CGAL/refine_periodic_3_mesh_3.h | 377 +++++++++--------- 6 files changed, 448 insertions(+), 486 deletions(-) delete mode 100644 Periodic_3_mesh_3/doc/Periodic_3_mesh_3/CGAL/optimize_periodic_3_mesh_3.h diff --git a/Mesh_3/include/CGAL/refine_mesh_3.h b/Mesh_3/include/CGAL/refine_mesh_3.h index 9f7ebe370a2..6d97ea56937 100644 --- a/Mesh_3/include/CGAL/refine_mesh_3.h +++ b/Mesh_3/include/CGAL/refine_mesh_3.h @@ -153,6 +153,8 @@ private: * \tparam MC either a model of the concept `MeshCriteria_3` or a model * of `MeshCriteriaWithFeatures_3` if the domain has exposed features. * + * \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters + * * \param c3t3 the mesh to be refined that is modified by the refinement process. * As the refinement process only adds points to the triangulation, all * vertices of the triangulation of `c3t3` remain in the diff --git a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/CGAL/optimize_periodic_3_mesh_3.h b/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/CGAL/optimize_periodic_3_mesh_3.h deleted file mode 100644 index af1e2224ca8..00000000000 --- a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/CGAL/optimize_periodic_3_mesh_3.h +++ /dev/null @@ -1,83 +0,0 @@ -namespace CGAL { - -/*! -\ingroup PkgPeriodic3Mesh3Functions - -The function `lloyd_optimize_periodic_3_mesh_3()` is a periodic mesh optimization -process based on the minimization of a global energy function. - -This function directly calls `lloyd_optimize_mesh_3()`, but is provided for convenience. -Further information can be found on the documentation of the function `lloyd_optimize_mesh_3()`. - -\note This function requires the \ref thirdpartyEigen library. -*/ -template -CGAL::Mesh_optimization_return_code -lloyd_optimize_periodic_3_mesh_3(C3T3& c3t3, - const MD& domain, - double parameters::time_limit=0, - std::size_t parameters::max_iteration_number=0, - double parameters::convergence=0.02, - double parameters::freeze_bound = 0.01, - bool parameters::do_freeze=true); - - -/*! -\ingroup PkgPeriodic3Mesh3Functions - -The function `odt_optimize_periodic_3_mesh_3()` is a periodic mesh optimization -process based on the minimization of a global energy function. - -This function directly calls `odt_optimize_mesh_3()`, but is provided for convenience. -Further information can be found on the documentation of the function `odt_optimize_mesh_3()`. -*/ -template -Mesh_optimization_return_code -odt_optimize_periodic_3_mesh_3(C3T3& c3t3, - const MD& domain, - double parameters::time_limit=0, - std::size_t parameters::max_iteration_number=0, - double parameters::convergence=0.02, - double parameters::freeze_bound = 0.01, - bool parameters::do_freeze=true); - -/*! -\ingroup PkgPeriodic3Mesh3Functions - -The function `perturb_periodic_3_mesh_3()` is a mesh optimizer that -improves the quality of a Delaunay mesh by changing the positions of some vertices of the mesh. - -This function directly calls `perturb_mesh_3()`, but is provided for convenience. -Further information can be found on the documentation of the function `perturb_mesh_3()`. -*/ -template -CGAL::Mesh_optimization_return_code -perturb_periodic_3_mesh_3(C3T3& c3t3, - const MD& domain, - double parameters::time_limit=0, - double parameters::sliver_bound=0); - -/*! -\ingroup PkgPeriodic3Mesh3Functions - -The function `exude_periodic_3_mesh_3()` performs a sliver exudation process -on a periodic Delaunay mesh. - -The sliver exudation process consists in optimizing the weights of vertices -of the periodic weighted Delaunay triangulation in such a way that slivers disappear -and the quality of the mesh improves. - -\warning This optimizer modifies the weight of vertices of the periodic triangulation -and, if called, must be the last optimizer to be called. If the mesh is refined after -this optimization has been performed, all improvements will be lost. - -This function directly calls `exude_mesh_3()`, but is provided for convenience. -Further information can be found on the documentation of the function `exude_mesh_3()`. -*/ -template -CGAL::Mesh_optimization_return_code -exude_periodic_3_mesh_3(C3T3& c3t3, - double parameters::time_limit=0, - double parameters::sliver_bound=0); - -} /* namespace CGAL */ diff --git a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Doxyfile.in b/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Doxyfile.in index b10860987eb..64d22001a23 100644 --- a/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Doxyfile.in +++ b/Periodic_3_mesh_3/doc/Periodic_3_mesh_3/Doxyfile.in @@ -2,7 +2,8 @@ INPUT += \ ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/make_periodic_3_mesh_3.h \ - ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/refine_periodic_3_mesh_3.h + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/refine_periodic_3_mesh_3.h \ + ${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/optimize_periodic_3_mesh_3.h PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - 3D Periodic Mesh Generation" EXTRACT_ALL = false HIDE_UNDOC_CLASSES = true diff --git a/Periodic_3_mesh_3/include/CGAL/make_periodic_3_mesh_3.h b/Periodic_3_mesh_3/include/CGAL/make_periodic_3_mesh_3.h index cd0fd70a1a6..8870e19a591 100644 --- a/Periodic_3_mesh_3/include/CGAL/make_periodic_3_mesh_3.h +++ b/Periodic_3_mesh_3/include/CGAL/make_periodic_3_mesh_3.h @@ -167,186 +167,182 @@ struct C3t3_initializer // ----------------------------------- /*! -\ingroup PkgPeriodic3Mesh3Functions - -The function `make_periodic_3_mesh_3()` is a 3D periodic mesh generator. -It produces simplicial meshes which discretize 3D periodic domains. -The periodic mesh generation algorithm is a Delaunay refinement process -followed by an optimization phase. The criteria driving the Delaunay refinement -process may be tuned to achieve the user needs with respect to -the size of mesh elements, the accuracy of boundaries approximation, -etc. -The optimization phase is a sequence of optimization processes, -amongst the following available optimizers: an ODT-smoothing, -a Lloyd smoothing, a sliver perturber, and a sliver exuder. -Each optimization process can be activated or not, according to the user requirements -and available time. -By default, only the perturber and the exuder are activated. -Note that the benefits of the exuder will be lost if the mesh -is further refined afterward, and that ODT-smoothing, Lloyd-smoothing, -and sliver perturber should never be called after the sliver exuder. -In the case of further refinement, only the sliver exuder can be used. -The function outputs the mesh to an object which provides iterators to -traverse the resulting mesh data structure or can be written to a file -(see \ref Periodic_3_mesh_3_section_examples ). - - -\tparam C3T3 is required to be a model of -the concept `MeshComplex_3InTriangulation_3`. This is the return type. -The type `C3T3` is in particular required to provide a nested type -`C3T3::Triangulation` for the 3D triangulation -embedding the mesh. The vertex and cell base classes of the -triangulation `C3T3::Triangulation` are required to be models of the -concepts `MeshVertexBase_3` and `MeshCellBase_3` -respectively. - -\tparam MD is required to be a model of -the concept `MeshDomain_3`, or of the refined concept -`MeshDomainWithFeatures_3` -if the domain has corners and curves that need to be accurately represented in the mesh. -The argument `domain` -is the sole link through which the domain -to be discretized is known by the mesh generation algorithm. - -\tparam MC has to be a model of the concept -`MeshCriteria_3`, or a model of the refined concept `MeshCriteriaWithFeatures_3` if the domain has exposed features. -The argument `criteria` of type `MC` specifies the -size and shape requirements for mesh tetrahedra -and surface facets. These criteria -form the rules which drive the refinement process. All mesh elements -satisfy those criteria at the end of the refinement process. -In addition, if the domain has features, the argument -`criteria` provides a sizing field to guide the discretization -of 1-dimensional exposed features. - -\tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" - - -\param domain the domain to be discretized -\param criteria the criteria -\param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below: - -\cgalNamedParamsBegin - \cgalParamNBegin{features_options} - \cgalParamDescription{allows the user to specify whether 0 and 1-dimensional features have to be - taken into account or not - when the domain is a model of `MeshDomainWithFeatures_3`. - The type `Features` of this parameter is an internal undescribed type. - The library provides functions to construct appropriate values of that type. -
    -
  • \link parameters::features() `parameters::features(domain)` \endlink sets `features` according to the domain, - i.e.\ 0 and 1-dimensional features are taken into account if `domain` is a - `MeshDomainWithFeatures_3`. This is the default behavior - if parameter `features` is not specified. -
  • `parameters::no_features()` prevents the representation - of 0 and 1-dimensional features in the mesh. -
} - \cgalParamType{`parameters::features()' OR `parameters::features(domain)`} - \cgalParamDefault{`parameters::features(domain)`} - - \cgalParamNBegin{manifold_option} - \cgalParamDescription{allows the user to drive the meshing algorithm, - and ensure that the output mesh surface follows the given manifold criterion. - It can be activated with `parameters::manifold()`, `parameters::manifold_with_boundary()` - and `parameters::non_manifold()`. Note that the meshing algorithm cannot generate a manifold - surface if the input surface is not manifold.} - \cgalParamType{`parameters::manifold()` OR `parameters::manifold_with_boundary()` OR `parameters::non_manifold()`} - \cgalParamDefault{`parameters::non_manifold()`} - - \cgalParamNBegin{lloyd_options} - \cgalParamDescription{`parameters::lloyd()` and `parameters::no_lloyd()` are designed to - trigger or not a call to `lloyd_optimize_mesh_3()` function and to set the - parameters of this optimizer. If one parameter is not set, the default value of - `lloyd_optimize_mesh_3()` is used for this parameter.} - \cgalParamType{`parameters::lloyd()` OR `parameters::no_lloyd()`} - \cgalParamDefault{`parameters::no_lloyd()`} - - \cgalParamNBegin{odt_options} - \cgalParamDescription{`parameters::odt()` and `parameters::no_odt()` are designed to - trigger or not a call to `odt_optimize_mesh_3()` function and - to set the parameters of this optimizer. - If one parameter is not set, the default value of - `odt_optimize_mesh_3()` is used for this parameter.} - \cgalParamType{`parameters::odt()` OR `parameters::no_odt()`} - \cgalParamDefault{`parameters::no_odt()`} - - \cgalParamNBegin{perturb_options} - \cgalParamDescription{`parameters::perturb()` and `parameters::no_perturb()` are designed to - trigger or not a call to `perturb_mesh_3()` function and - to set the parameters of this optimizer. If one parameter is not set, the default value of - `perturb_mesh_3()` is used for this parameter, except for the time bound which is set to be - equal to the refinement CPU time.} - \cgalParamType{`parameters::perturb()` and `parameters::no_perturb()`} - \cgalParamDefault{`parameters::no_perturb`} - - \cgalParamNBegin{exude_options} - \cgalParamDescription{parameters::exude()` and `parameters::no_exude()` are designed to - trigger or not a call to `exude_mesh_3()` function and to override to set the - parameters of this optimizer. If one parameter is not set, the default value of - `exude_mesh_3()` is used for this parameter, except for the time bound which is set to be - equal to the refinement CPU time.} - \cgalParamType{`parameters::exude()` and `parameters::no_exude()`} - \cgalParamDefault{`parameters::no_exude`} - -\cgalNamedParamsEnd - - The optimization parameters can be passed in an arbitrary order. If one parameter -is not passed, its default value is used. The default values are -`no_lloyd()`, `no_odt()`, `perturb()` and `exude()`. - -Note that whatever may be the optimization processes activated, -they are always launched in the order that is a suborder -of the following (see user manual for further -details): *ODT-smoother*, *Lloyd-smoother*, *perturber*, and *exuder*. - -Beware that optimization of the mesh is obtained -by perturbing mesh vertices and modifying the mesh connectivity -and that this has an impact -on the strict compliance to the refinement criteria. -Though a strict compliance to mesh criteria -is guaranteed at the end of the Delaunay refinement, this may no longer be true after -some optimization processes. Also beware that the default behavior does involve some -optimization processes. - -\sa `refine_periodic_3_mesh_3()` -\sa `make_mesh_3()` -\sa `parameters::features()` -\sa `parameters::no_features()` -\sa `parameters::manifold()` -\sa `parameters::manifold_with_boundary()` -\sa `parameters::non_manifold()` -\sa `exude_mesh_3()` -\sa `perturb_mesh_3()` -\sa `lloyd_optimize_mesh_3()` -\sa `odt_optimize_mesh_3()` -\sa `parameters::exude()` -\sa `parameters::no_exude()` -\sa `parameters::perturb()` -\sa `parameters::no_perturb()` -\sa `parameters::lloyd()` -\sa `parameters::no_lloyd()` -\sa `parameters::odt()` -\sa `parameters::no_odt()` -*/ + * \ingroup PkgPeriodic3Mesh3Functions + * + * The function `make_periodic_3_mesh_3()` is a 3D periodic mesh generator. + * It produces simplicial meshes which discretize 3D periodic domains. + * The periodic mesh generation algorithm is a Delaunay refinement process + * followed by an optimization phase. The criteria driving the Delaunay refinement + * process may be tuned to achieve the user needs with respect to + * the size of mesh elements, the accuracy of boundaries approximation, + * etc. + * The optimization phase is a sequence of optimization processes, + * amongst the following available optimizers: an ODT-smoothing, + * a Lloyd smoothing, a sliver perturber, and a sliver exuder. + * Each optimization process can be activated or not, according to the user requirements + * and available time. + * By default, only the perturber and the exuder are activated. + * Note that the benefits of the exuder will be lost if the mesh + * is further refined afterward, and that ODT-smoothing, Lloyd-smoothing, + * and sliver perturber should never be called after the sliver exuder. + * In the case of further refinement, only the sliver exuder can be used. + * The function outputs the mesh to an object which provides iterators to + * traverse the resulting mesh data structure or can be written to a file + * (see \ref Periodic_3_mesh_3_section_examples ). + * + * + * \tparam C3T3 is required to be a model of + * the concept `MeshComplex_3InTriangulation_3`. This is the return type. + * The type `C3T3` is in particular required to provide a nested type + * `C3T3::Triangulation` for the 3D triangulation + * embedding the mesh. The vertex and cell base classes of the + * triangulation `C3T3::Triangulation` are required to be models of the + * concepts `MeshVertexBase_3` and `MeshCellBase_3` + * respectively. + * + * \tparam MD is required to be a model of + * the concept `MeshDomain_3`, or of the refined concept + * `MeshDomainWithFeatures_3` + * if the domain has corners and curves that need to be accurately represented in the mesh. + * The argument `domain` + * is the sole link through which the domain + * to be discretized is known by the mesh generation algorithm. + * + * \tparam MC has to be a model of the concept + * `MeshCriteria_3`, or a model of the refined concept `MeshCriteriaWithFeatures_3` if the domain has exposed features. + * The argument `criteria` of type `MC` specifies the + * size and shape requirements for mesh tetrahedra + * and surface facets. These criteria + * form the rules which drive the refinement process. All mesh elements + * satisfy those criteria at the end of the refinement process. + * In addition, if the domain has features, the argument + * `criteria` provides a sizing field to guide the discretization + * of 1-dimensional exposed features. + * + * \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" + * + * + * \param domain the domain to be discretized + * \param criteria the criteria + * \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below: + * + * \cgalNamedParamsBegin + * \cgalParamSectionBegin{Feature preservation options} + * \cgalParamDescription{If the domain is a model of `MeshDomainWithFeatures_3`, 0 and 1-dimensional features can be + * taken into account while generating the mesh. The following two named parameters control + * this option: + *
    + *
  • \link parameters::features() `parameters::features(domain)` \endlink + *
  • `parameters::no_features()` + *
} + * \cgalParamDefault{`parameters::features(domain)`} + * \cgalParamSectionEnd + * \cgalParamSectionBegin{Topological options (manifoldness)} + * \cgalParamDescription{In order to drive the meshing algorithm and ensure that the output mesh follows a desired topological criterion, + * three named parameters control this option: + *
    + *
  • `parameters::manifold()` + *
  • `parameters::manifold_with_boundary()` + *
  • `parameters::non_manifold()` + *
+ * Note that the meshing algorithm cannot generate a manifold surface if the input surface is not manifold.} + * \cgalParamDefault{`parameters::non_manifold()`} + * \cgalParamSectionEnd + * \cgalParamSectionBegin{Lloyd optimization} + * \cgalParamDescription{`lloyd_optimize_mesh_3()` can optionally be called after the meshing process. + * Two named parameters control this behavior: + *
    + *
  • `parameters::no_lloyd()` + *
  • `parameters::lloyd_optimize_mesh_3()` + *
} + * \cgalParamDefault{`parameters::no_lloyd()`} + * \cgalParamSectionEnd + * \cgalParamSectionBegin{ODT optimization} + * \cgalParamDescription{`odt_optimize_mesh_3()` can optionally be called after the meshing process. + * Two named parameters control this behavior: + *
    + *
  • `parameters::no_odt()` + *
  • `parameters::odt()` + *
} + * \cgalParamDefault{`parameters::no_odt()`} + * \cgalParamSectionEnd + * \cgalParamSectionBegin{Mesh perturbation} + * \cgalParamDescription{`perturb_mesh_3()` can optionally be called after the meshing process. + * Two named parameters control this behavior: + *
    + *
  • `parameters::no_perturb()` + *
  • `parameters::perturb()` + *
} + * \cgalParamDefault{`parameters::perturb()`} + * \cgalParamSectionEnd + * \cgalParamSectionBegin{Mesh exudation} + * \cgalParamDescription{`exude_mesh_3()` can optionally be called after the meshing process. + * Two named parameters control this behavior: + *
    + *
  • `parameters::exude()` + *
  • `parameters::no_exude()` + *
} + * \cgalParamDefault{`parameters::exude()`} + * \cgalParamSectionEnd + * \cgalNamedParamsEnd + * + * The optimization parameters can be passed in an arbitrary order. If one parameter + * is not passed, its default value is used. The default values are + * `no_lloyd()`, `no_odt()`, `perturb()` and `exude()`. + * + * Note that whatever may be the optimization processes activated, + * they are always launched in the order that is a suborder + * of the following (see user manual for further + * details): *ODT-smoother*, *Lloyd-smoother*, *perturber*, and *exuder*. + * + * Beware that optimization of the mesh is obtained + * by perturbing mesh vertices and modifying the mesh connectivity + * and that this has an impact + * on the strict compliance to the refinement criteria. + * Though a strict compliance to mesh criteria + * is guaranteed at the end of the Delaunay refinement, this may no longer be true after + * some optimization processes. Also beware that the default behavior does involve some + * optimization processes. + * + * \sa `refine_periodic_3_mesh_3()` + * \sa `make_mesh_3()` + * \sa `parameters::features()` + * \sa `parameters::no_features()` + * \sa `parameters::manifold()` + * \sa `parameters::manifold_with_boundary()` + * \sa `parameters::non_manifold()` + * \sa `exude_mesh_3()` + * \sa `perturb_mesh_3()` + * \sa `lloyd_optimize_mesh_3()` + * \sa `odt_optimize_mesh_3()` + * \sa `parameters::exude()` + * \sa `parameters::no_exude()` + * \sa `parameters::perturb()` + * \sa `parameters::no_perturb()` + * \sa `parameters::lloyd()` + * \sa `parameters::no_lloyd()` + * \sa `parameters::odt()` + * \sa `parameters::no_odt()` + */ template C3T3 make_periodic_3_mesh_3(MeshDomain& domain, MeshCriteria& criteria, const CGAL_NP_CLASS& np = parameters::default_values()) { - using parameters::choose_parameter; - using parameters::get_parameter; - C3T3 c3t3; - parameters::internal::Exude_options exude_param = choose_parameter(get_parameter(np, internal_np::exude_options_param), parameters::exude().v); - parameters::internal::Perturb_options perturb_param = choose_parameter(get_parameter(np, internal_np::perturb_options_param), parameters::perturb().v); - parameters::internal::Odt_options odt_param = choose_parameter(get_parameter(np, internal_np::odt_options_param), parameters::no_odt().v); - parameters::internal::Lloyd_options lloyd_param = choose_parameter(get_parameter(np, internal_np::lloyd_options_param), parameters::no_lloyd().v); - parameters::internal::Features_options features_param = choose_parameter(get_parameter(np, internal_np::features_options_param), parameters::features(domain).v); - parameters::internal::Mesh_3_options mesh_options_param = choose_parameter(get_parameter(np, internal_np::mesh_param), parameters::internal::Mesh_3_options()); - parameters::internal::Manifold_options manifold_options_param = choose_parameter(get_parameter(np, internal_np::manifold_param), parameters::internal::Manifold_options()); + using parameters::choose_parameter; + using parameters::get_parameter; + C3T3 c3t3; + parameters::internal::Exude_options exude_param = choose_parameter(get_parameter(np, internal_np::exude_options_param), parameters::exude().v); + parameters::internal::Perturb_options perturb_param = choose_parameter(get_parameter(np, internal_np::perturb_options_param), parameters::perturb().v); + parameters::internal::Odt_options odt_param = choose_parameter(get_parameter(np, internal_np::odt_options_param), parameters::no_odt().v); + parameters::internal::Lloyd_options lloyd_param = choose_parameter(get_parameter(np, internal_np::lloyd_options_param), parameters::no_lloyd().v); + parameters::internal::Features_options features_param = choose_parameter(get_parameter(np, internal_np::features_options_param), parameters::features(domain).v); + parameters::internal::Mesh_3_options mesh_options_param = choose_parameter(get_parameter(np, internal_np::mesh_param), parameters::internal::Mesh_3_options()); + parameters::internal::Manifold_options manifold_options_param = choose_parameter(get_parameter(np, internal_np::manifold_param), parameters::internal::Manifold_options()); - make_periodic_3_mesh_3_impl(c3t3, domain, criteria, - exude_param, perturb_param, odt_param, lloyd_param, - features_param.features(), mesh_options_param, - manifold_options_param); - return c3t3; + make_periodic_3_mesh_3_impl(c3t3, domain, criteria, + exude_param, perturb_param, odt_param, lloyd_param, + features_param.features(), mesh_options_param, + manifold_options_param); + return c3t3; } @@ -354,7 +350,7 @@ C3T3 make_periodic_3_mesh_3(MeshDomain& domain, MeshCriteria& criteria, const CG template C3T3 make_periodic_3_mesh_3(MeshDomain& domain, MeshCriteria& criteria, const CGAL_NP_CLASS& ... nps) { - return make_periodic_3_mesh_3(domain, criteria, internal_np::combine_named_parameters(nps...)); + return make_periodic_3_mesh_3(domain, criteria, internal_np::combine_named_parameters(nps...)); } diff --git a/Periodic_3_mesh_3/include/CGAL/optimize_periodic_3_mesh_3.h b/Periodic_3_mesh_3/include/CGAL/optimize_periodic_3_mesh_3.h index b989055d1bd..7ab4d9642a9 100644 --- a/Periodic_3_mesh_3/include/CGAL/optimize_periodic_3_mesh_3.h +++ b/Periodic_3_mesh_3/include/CGAL/optimize_periodic_3_mesh_3.h @@ -24,96 +24,139 @@ namespace CGAL { // ---------------------------------- pertuber --------------------------------- +/*! + * \ingroup PkgPeriodic3Mesh3Functions + * + * The function `perturb_periodic_3_mesh_3()` is a mesh optimizer that + * improves the quality of a Delaunay mesh by changing the positions of some vertices of the mesh. + * + * This function directly calls `perturb_mesh_3()`, but is provided for convenience. + * Further information can be found on the documentation of the function `perturb_mesh_3()`. + */ template Mesh_optimization_return_code perturb_periodic_3_mesh_3(C3T3& c3t3, MeshDomain& domain, const CGAL_NP_CLASS& np = parameters::default_values()) { - using parameters::choose_parameter; - using parameters::get_parameter; - double time_limit = choose_parameter(get_parameter(np,internal_np::maximum_running_time),0); - auto sliver_bound = choose_parameter(get_parameter(np,internal_np::lower_sliver_bound), parameters::default_values_for_mesh_3::perturb_sliver_bound); - auto sliver_criterion = choose_parameter(get_parameter(np, internal_np::sliver_criteria), parameters::default_values_for_mesh_3::default_sliver_criterion(c3t3,sliver_bound)); - auto perturbation_vector = choose_parameter(get_parameter(np,internal_np::perturb_vector), default_perturbation_vector(c3t3,domain,sliver_criterion)); - return perturb_mesh_3_impl(c3t3, domain, time_limit, sliver_criterion, perturbation_vector); + using parameters::choose_parameter; + using parameters::get_parameter; + double time_limit = choose_parameter(get_parameter(np,internal_np::maximum_running_time),0); + auto sliver_bound = choose_parameter(get_parameter(np,internal_np::lower_sliver_bound), parameters::default_values_for_mesh_3::perturb_sliver_bound); + auto sliver_criterion = choose_parameter(get_parameter(np, internal_np::sliver_criteria), parameters::default_values_for_mesh_3::default_sliver_criterion(c3t3,sliver_bound)); + auto perturbation_vector = choose_parameter(get_parameter(np,internal_np::perturb_vector), default_perturbation_vector(c3t3,domain,sliver_criterion)); + return perturb_mesh_3_impl(c3t3, domain, time_limit, sliver_criterion, perturbation_vector); } template Mesh_optimization_return_code perturb_periodic_3_mesh_3(C3T3& c3t3, MeshDomain& domain, const CGAL_NP_CLASS& ... nps) { - return perturb_periodic_3_mesh_3(c3t3,domain, internal_np::combine_named_parameters(nps...)); + return perturb_periodic_3_mesh_3(c3t3,domain, internal_np::combine_named_parameters(nps...)); } template Mesh_optimization_return_code perturb_periodic_3_mesh_3(const CGAL_NP_CLASS& ... nps) { - return perturb_periodic_3_mesh_3(internal_np::combine_named_parameters(nps...)); + return perturb_periodic_3_mesh_3(internal_np::combine_named_parameters(nps...)); } // ---------------------------------- exuder ----------------------------------- - +/*! + * \ingroup PkgPeriodic3Mesh3Functions + * + * The function `exude_periodic_3_mesh_3()` performs a sliver exudation process + * on a periodic Delaunay mesh. + * + * The sliver exudation process consists in optimizing the weights of vertices + * of the periodic weighted Delaunay triangulation in such a way that slivers disappear + * and the quality of the mesh improves. + * + * \warning This optimizer modifies the weight of vertices of the periodic triangulation + * and, if called, must be the last optimizer to be called. If the mesh is refined after + * this optimization has been performed, all improvements will be lost. + * + * This function directly calls `exude_mesh_3()`, but is provided for convenience. + * Further information can be found on the documentation of the function `exude_mesh_3()`. + */ template Mesh_optimization_return_code exude_periodic_3_mesh_3(C3T3& c3t3,const CGAL_NP_CLASS& np = parameters::default_values()) { - using parameters::choose_parameter; - using parameters::get_parameter; - int time_limit=choose_parameter(get_parameter(np,internal_np::maximum_running_time),0); - double sliver_bound= choose_parameter(get_parameter(np,internal_np::lower_sliver_bound),parameters::default_values_for_mesh_3::exude_sliver_bound); - return exude_mesh_3_impl(c3t3,time_limit,sliver_bound); - + using parameters::choose_parameter; + using parameters::get_parameter; + int time_limit=choose_parameter(get_parameter(np,internal_np::maximum_running_time),0); + double sliver_bound= choose_parameter(get_parameter(np,internal_np::lower_sliver_bound),parameters::default_values_for_mesh_3::exude_sliver_bound); + return exude_mesh_3_impl(c3t3,time_limit,sliver_bound); } template Mesh_optimization_return_code exude_periodic_3_mesh_3(C3T3& c3t3, const CGAL_NP_CLASS& ... nps) { - return exude_periodic_3_mesh_3(c3t3,internal_np::combine_named_parameters(nps...)); + return exude_periodic_3_mesh_3(c3t3,internal_np::combine_named_parameters(nps...)); } template Mesh_optimization_return_code exude_periodic_3_mesh_3(const CGAL_NP_CLASS& ... nps) { - return exude_periodic_3_mesh_3(internal_np::combine_named_parameters(nps...)); + return exude_periodic_3_mesh_3(internal_np::combine_named_parameters(nps...)); } // ------------------------------ odt optimizer -------------------------------- - +/*! + * \ingroup PkgPeriodic3Mesh3Functions + * + * The function `odt_optimize_periodic_3_mesh_3()` is a periodic mesh optimization + * process based on the minimization of a global energy function. + * + * This function directly calls `odt_optimize_mesh_3()`, but is provided for convenience. + * Further information can be found on the documentation of the function `odt_optimize_mesh_3()`. + */ template Mesh_optimization_return_code odt_optimize_periodic_3_mesh_3(C3T3& c3t3, MeshDomain& domain, const CGAL_NP_CLASS& np = parameters::default_values()) { - using parameters::choose_parameter; - using parameters::get_parameter; - double time_limit=choose_parameter(get_parameter(np,internal_np::maximum_running_time),0); - std::size_t max_iteration_number=choose_parameter(get_parameter(np,internal_np::number_of_iterations),0); - double convergence=choose_parameter(get_parameter(np,internal_np::convergence_ratio),0.02); - double freeze_bound=choose_parameter(get_parameter(np,internal_np::vertex_freeze_bound),0.01); - bool do_freeze=choose_parameter(get_parameter(np,internal_np::freeze),true); - return odt_optimize_mesh_3_impl(c3t3, domain, time_limit, max_iteration_number, convergence, freeze_bound, do_freeze); + using parameters::choose_parameter; + using parameters::get_parameter; + double time_limit=choose_parameter(get_parameter(np,internal_np::maximum_running_time),0); + std::size_t max_iteration_number=choose_parameter(get_parameter(np,internal_np::number_of_iterations),0); + double convergence=choose_parameter(get_parameter(np,internal_np::convergence_ratio),0.02); + double freeze_bound=choose_parameter(get_parameter(np,internal_np::vertex_freeze_bound),0.01); + bool do_freeze=choose_parameter(get_parameter(np,internal_np::freeze),true); + return odt_optimize_mesh_3_impl(c3t3, domain, time_limit, max_iteration_number, convergence, freeze_bound, do_freeze); } template Mesh_optimization_return_code odt_optimize_periodic_3_mesh_3(C3T3& c3t3, MeshDomain& domain, const CGAL_NP_CLASS& ... nps) { - return odt_optimize_periodic_3_mesh_3(c3t3, domain, internal_np::combine_named_parameters(nps...)); + return odt_optimize_periodic_3_mesh_3(c3t3, domain, internal_np::combine_named_parameters(nps...)); } template Mesh_optimization_return_code odt_optimize_periodic_3_mesh_3(const CGAL_NP_CLASS& ... nps) { - return odt_optimize_periodic_3_mesh_3(internal_np::combine_named_parameters(nps...)); + return odt_optimize_periodic_3_mesh_3(internal_np::combine_named_parameters(nps...)); } // ------------------------------- lloyd optimizer ----------------------------- +/*! + * \ingroup PkgPeriodic3Mesh3Functions + * + * The function `lloyd_optimize_periodic_3_mesh_3()` is a periodic mesh optimization + * process based on the minimization of a global energy function. + * + * This function directly calls `lloyd_optimize_mesh_3()`, but is provided for convenience. + * Further information can be found on the documentation of the function `lloyd_optimize_mesh_3()`. + * + * \note This function requires the \ref thirdpartyEigen library. +*/ template Mesh_optimization_return_code lloyd_optimize_periodic_3_mesh_3(C3T3& c3t3, MeshDomain& domain,const CGAL_NP_CLASS& np = parameters::default_values()) { - using parameters::choose_parameter; - using parameters::get_parameter; - int max_iterations = choose_parameter(get_parameter(np, internal_np::number_of_iterations), 0); - const double convergence_ratio = choose_parameter(get_parameter(np, internal_np::convergence_ratio), 0.001); - const double freeze_bound = choose_parameter(get_parameter(np, internal_np::vertex_freeze_bound), 0.001); - const double time_limit = choose_parameter(get_parameter(np, internal_np::maximum_running_time), 0.); - bool do_freeze = choose_parameter(get_parameter(np,internal_np::freeze),true); - return lloyd_optimize_mesh_3_impl(c3t3, domain, time_limit, max_iterations, convergence_ratio, freeze_bound, do_freeze); + using parameters::choose_parameter; + using parameters::get_parameter; + int max_iterations = choose_parameter(get_parameter(np, internal_np::number_of_iterations), 0); + const double convergence_ratio = choose_parameter(get_parameter(np, internal_np::convergence_ratio), 0.001); + const double freeze_bound = choose_parameter(get_parameter(np, internal_np::vertex_freeze_bound), 0.001); + const double time_limit = choose_parameter(get_parameter(np, internal_np::maximum_running_time), 0.); + bool do_freeze = choose_parameter(get_parameter(np,internal_np::freeze),true); + return lloyd_optimize_mesh_3_impl(c3t3, domain, time_limit, max_iterations, convergence_ratio, freeze_bound, do_freeze); } template Mesh_optimization_return_code lloyd_optimize_periodic_3_mesh_3(C3T3& c3t3,MeshDomain& domain, const CGAL_NP_CLASS& ... nps) { - return lloyd_optimize_periodic_3_mesh_3(c3t3,domain, internal_np::combine_named_parameters(nps...)); + return lloyd_optimize_periodic_3_mesh_3(c3t3,domain, internal_np::combine_named_parameters(nps...)); } } // namespace CGAL diff --git a/Periodic_3_mesh_3/include/CGAL/refine_periodic_3_mesh_3.h b/Periodic_3_mesh_3/include/CGAL/refine_periodic_3_mesh_3.h index a21c0a54bd2..40ac29fe83e 100644 --- a/Periodic_3_mesh_3/include/CGAL/refine_periodic_3_mesh_3.h +++ b/Periodic_3_mesh_3/include/CGAL/refine_periodic_3_mesh_3.h @@ -134,204 +134,207 @@ void project_points(C3T3& c3t3, } // namespace internal /*! -\ingroup PkgPeriodic3Mesh3Functions - -The function `refine_periodic_3_mesh_3()` is a 3D periodic -mesh generator. It produces periodic simplicial meshes which discretize -3D periodic domains. - -The periodic mesh generation algorithm is a Delaunay refinement process -followed by an optimization phase. -The criteria driving the Delaunay refinement -process may be tuned to achieve the user needs with respect to -the size of mesh elements, the accuracy of boundaries approximation, etc. - -The optimization phase is a sequence of optimization processes, -amongst the following available optimizers: an ODT-smoothing, -a Lloyd smoothing, a sliver perturber, and a sliver exuder. -Each optimization process can be activated or not, according to the user requirements -and available time. -By default, only the perturber and the exuder are activated. -Note that the benefits of the exuder will be lost if the mesh -is further refined afterward. - -\attention The function template `refine_periodic_3_mesh_3()` may be used -to refine a previously computed mesh, e.g.: -\code{.cpp} -C3T3 c3t3 = CGAL::make_periodic_3_mesh_3(domain,criteria); - -CGAL::refine_periodic_3_mesh_3(c3t3, domain, new_criteria); -\endcode - -\attention Note that the triangulation must form at all times a simplicial complex within -a single copy of the domain (see Sections \ref P3Triangulation3secspace and \ref P3Triangulation3secintro -of the manual of 3D periodic triangulations). It is the responsability of the user to provide -a triangulation that satisfies this condition when calling the refinement -function `refine_periodic_3_mesh_3`. The underlying triangulation of a mesh -complex obtained through `make_periodic_3_mesh_3()` or `refine_periodic_3_mesh_3()` -will always satisfy this condition. - - -\tparam C3T3 is required to be a model of -the concept -`MeshComplex_3InTriangulation_3`. -The argument `c3t3` is passed by -reference as this object is modified by the refinement process. As the -refinement process only adds points to the triangulation, all -vertices of the triangulation of `c3t3` remain in the -mesh during the refinement process. Object `c3t3` can be used to insert -specific points in the domain to ensure that they will be contained in the -final triangulation. -The type `C3T3` is in particular required to provide a nested type -`C3T3::Triangulation` for the 3D triangulation -embedding the mesh. The vertex and cell base classes of the -triangulation `C3T3::Triangulation` are required to be models of the -concepts `MeshVertexBase_3` and `MeshCellBase_3` -respectively. - -\tparam MD is required to be a model of -the concept `Periodic_3MeshDomain_3` or of the refined concept -`Periodic_3MeshDomainWithFeatures_3` if 0 and 1-dimensional features -of the input complex have to be accurately represented in the mesh. -The argument `domain` is the sole link through which the domain -to be discretized is known by the mesh generation algorithm. - -\tparam MC is required to be a model of the concept -`MeshCriteria_3`, or a model of the refined concept `MeshCriteriaWithFeatures_3` -if the domain has exposed features. The argument `criteria` of -type `MC` specifies the -size and shape requirements for mesh tetrahedra -and surface facets. These criteria -form the rules which drive the refinement process. All mesh elements -satisfy those criteria at the end of the refinement process. -In addition, if the domain has features, the argument -`criteria` provides a sizing field to guide the discretization -of 1-dimensional exposed features. - -\param c3t3 the mesh to be refined. -\param domain the domain to be discretized -\param criteria the criteria -\param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below: - -The following four parameters are optional optimization parameters. -They control which optimization processes are performed -and allow the user to tune the parameters of the optimization processes. -Individual optimization parameters are not described here as they are -internal types (see instead the documentation page of each optimizer). -For each optimization algorithm, there exist two global functions -that allow to enable or disable the optimizer: - -\cgalNamedParamsBegin - \cgalParamNBegin{manifold_option} - \cgalParamDescription{allows the user to drive the meshing algorithm, - and ensure that the output mesh surface follows the given manifold criterion. - It can be activated with `parameters::manifold()`, `parameters::manifold_with_boundary()` - and `parameters::non_manifold()`. Note that the meshing algorithm cannot generate a manifold - surface if the input surface is not manifold.} - \cgalParamType{`parameters::manifold()` OR `parameters::manifold_with_boundary()` OR `parameters::non_manifold()`} - \cgalParamDefault{`parameters::non_manifold()`} - - \cgalParamNBegin{lloyd_options} - \cgalParamDescription{`parameters::lloyd()` and `parameters::no_lloyd()` are designed to - trigger or not a call to `lloyd_optimize_mesh_3()` function and to set the - parameters of this optimizer. If one parameter is not set, the default value of - `lloyd_optimize_mesh_3()` is used for this parameter.} - \cgalParamType{`parameters::lloyd()` OR `parameters::no_lloyd()`} - \cgalParamDefault{`parameters::no_lloyd()'} - - \cgalParamNBegin{odt_options} - \cgalParamDescription{`parameters::odt()` and `parameters::no_odt()` are designed to - trigger or not a call to `odt_optimize_mesh_3()` function and - to set the parameters of this optimizer. - If one parameter is not set, the default value of - `odt_optimize_mesh_3()` is used for this parameter.} - \cgalParamType{`parameters::odt()` OR `parameters::no_odt()`} - \cgalParamDefault{`parameters::no_odt()`} - - \cgalParamNBegin{perturb_options} - \cgalParamDescription{`parameters::perturb()` and `parameters::no_perturb()` are designed to - trigger or not a call to `perturb_mesh_3()` function and - to set the parameters of this optimizer. If one parameter is not set, the default value of - `perturb_mesh_3()` is used for this parameter, except for the time bound which is set to be - equal to the refinement CPU time.} - \cgalParamType{`parameters::perturb()` and `parameters::no_perturb()`} - \cgalParamDefault{`parameters::no_perturb`} - - \cgalParamNBegin{exude_options} - \cgalParamDescription{parameters::exude()` and `parameters::no_exude()` are designed to - trigger or not a call to `exude_mesh_3()` function and to override to set the - parameters of this optimizer. If one parameter is not set, the default value of - `exude_mesh_3()` is used for this parameter, except for the time bound which is set to be - equal to the refinement CPU time.} - \cgalParamType{`parameters::exude()` and `parameters::no_exude()`} - \cgalParamDefault{`parameters::no_exude`} - -\cgalNamedParamsEnd - -The optimization parameters can be passed in arbitrary order. If one parameter -is not passed, its default value is used. The default values are -`no_lloyd()`, `no_odt()`, `perturb()` and `exude()`. -Note that whatever may be the optimization processes activated, -they are always launched in the order that is a suborder -of the following (see user manual for further -details): *ODT-smoother*, *Lloyd-smoother*, *perturber*, and *exuder*. - -Beware that optimization of the mesh is obtained -by perturbing mesh vertices and modifying the mesh connectivity -and that this has an impact -on the strict compliance to the refinement criteria. -Though a strict compliance to mesh criteria -is guaranteed at the end of the Delaunay refinement, this may no longer be true after -some optimization processes. Also beware that the default behavior does involve some -optimization processes. - -\sa `make_periodic_3_mesh_3()` -\sa `refine_mesh_3()` -\sa `exude_periodic_3_mesh_3()` -\sa `perturb_periodic_3_mesh_3()` -\sa `lloyd_optimize_periodic_3_mesh_3()` -\sa `odt_optimize_periodic_3_mesh_3()` -\sa `parameters::exude` -\sa `parameters::no_exude` -\sa `parameters::perturb` -\sa `parameters::no_perturb` -\sa `parameters::lloyd` -\sa `parameters::no_lloyd` -\sa `parameters::odt` -\sa `parameters::no_odt` + * \ingroup PkgPeriodic3Mesh3Functions + * + * The function `refine_periodic_3_mesh_3()` is a 3D periodic + * mesh generator. It produces periodic simplicial meshes which discretize + * 3D periodic domains. + * + * The periodic mesh generation algorithm is a Delaunay refinement process + * followed by an optimization phase. + * The criteria driving the Delaunay refinement + * process may be tuned to achieve the user needs with respect to + * the size of mesh elements, the accuracy of boundaries approximation, etc. + * + * The optimization phase is a sequence of optimization processes, + * amongst the following available optimizers: an ODT-smoothing, + * a Lloyd smoothing, a sliver perturber, and a sliver exuder. + * Each optimization process can be activated or not, according to the user requirements + * and available time. + * By default, only the perturber and the exuder are activated. + * Note that the benefits of the exuder will be lost if the mesh + * is further refined afterward. + * + * \attention The function template `refine_periodic_3_mesh_3()` may be used + * to refine a previously computed mesh, e.g.: + * \code{.cpp} + * C3T3 c3t3 = CGAL::make_periodic_3_mesh_3(domain,criteria); + * + * CGAL::refine_periodic_3_mesh_3(c3t3, domain, new_criteria); + * \endcode + * + * \attention Note that the triangulation must form at all times a simplicial complex within + * a single copy of the domain (see Sections \ref P3Triangulation3secspace and \ref P3Triangulation3secintro + * of the manual of 3D periodic triangulations). It is the responsability of the user to provide + * a triangulation that satisfies this condition when calling the refinement + * function `refine_periodic_3_mesh_3`. The underlying triangulation of a mesh + * complex obtained through `make_periodic_3_mesh_3()` or `refine_periodic_3_mesh_3()` + * will always satisfy this condition. + * + * + * \tparam C3T3 is required to be a model of + * the concept + * `MeshComplex_3InTriangulation_3`. + * The argument `c3t3` is passed by + * reference as this object is modified by the refinement process. As the + * refinement process only adds points to the triangulation, all + * vertices of the triangulation of `c3t3` remain in the + * mesh during the refinement process. Object `c3t3` can be used to insert + * specific points in the domain to ensure that they will be contained in the + * final triangulation. + * The type `C3T3` is in particular required to provide a nested type + * `C3T3::Triangulation` for the 3D triangulation + * embedding the mesh. The vertex and cell base classes of the + * triangulation `C3T3::Triangulation` are required to be models of the + * concepts `MeshVertexBase_3` and `MeshCellBase_3` + * respectively. + * + * \tparam MD is required to be a model of + * the concept `Periodic_3MeshDomain_3` or of the refined concept + * `Periodic_3MeshDomainWithFeatures_3` if 0 and 1-dimensional features + * of the input complex have to be accurately represented in the mesh. + * The argument `domain` is the sole link through which the domain + * to be discretized is known by the mesh generation algorithm. + * + * \tparam MC is required to be a model of the concept + * `MeshCriteria_3`, or a model of the refined concept `MeshCriteriaWithFeatures_3` + * if the domain has exposed features. The argument `criteria` of + * type `MC` specifies the + * size and shape requirements for mesh tetrahedra + * and surface facets. These criteria + * form the rules which drive the refinement process. All mesh elements + * satisfy those criteria at the end of the refinement process. + * In addition, if the domain has features, the argument + * `criteria` provides a sizing field to guide the discretization + * of 1-dimensional exposed features. + * + * \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters + * + * \param c3t3 the mesh to be refined. + * \param domain the domain to be discretized + * \param criteria the criteria + * \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below: + * + * The following four parameters are optional optimization parameters. + * They control which optimization processes are performed + * and allow the user to tune the parameters of the optimization processes. + * Individual optimization parameters are not described here as they are + * internal types (see instead the documentation page of each optimizer). + * For each optimization algorithm, there exist two global functions + * that allow to enable or disable the optimizer: + * + * \cgalNamedParamsBegin + * \cgalParamSectionBegin{Topological options (manifoldness)} + * \cgalParamDescription{In order to drive the meshing algorithm and ensure that the output mesh follows a desired topological criterion, + * three named parameters control this option: + *
    + *
  • `parameters::manifold()` + *
  • `parameters::manifold_with_boundary()` + *
  • `parameters::non_manifold()` + *
+ * Note that the meshing algorithm cannot generate a manifold surface if the input surface is not manifold.} + * \cgalParamDefault{`parameters::non_manifold()`} + * \cgalParamSectionEnd + * \cgalParamSectionBegin{Lloyd optimization} + * \cgalParamDescription{`lloyd_optimize_mesh_3()` can optionally be called after the meshing process. + * Two named parameters control this behavior: + *
    + *
  • `parameters::no_lloyd()` + *
  • `parameters::lloyd_optimize_mesh_3()` + *
} + * \cgalParamDefault{`parameters::no_lloyd()`} + * \cgalParamSectionEnd + * \cgalParamSectionBegin{ODT optimization} + * \cgalParamDescription{`odt_optimize_mesh_3()` can optionally be called after the meshing process. + * Two named parameters control this behavior: + *
    + *
  • `parameters::no_odt()` + *
  • `parameters::odt()` + *
} + * \cgalParamDefault{`parameters::no_odt()`} + * \cgalParamSectionEnd + * \cgalParamSectionBegin{Mesh perturbation} + * \cgalParamDescription{`perturb_mesh_3()` can optionally be called after the meshing process. + * Two named parameters control this behavior: + *
    + *
  • `parameters::no_perturb()` + *
  • `parameters::perturb()` + *
} + * \cgalParamDefault{`parameters::perturb()`} + * \cgalParamSectionEnd + * \cgalParamSectionBegin{Mesh exudation} + * \cgalParamDescription{`exude_mesh_3()` can optionally be called after the meshing process. + * Two named parameters control this behavior: + *
    + *
  • `parameters::exude()` + *
  • `parameters::no_exude()` + *
} + * \cgalParamDefault{`parameters::exude()`} + * \cgalParamSectionEnd + * \cgalNamedParamsEnd + * + * The optimization parameters can be passed in arbitrary order. If one parameter + * is not passed, its default value is used. The default values are + * `no_lloyd()`, `no_odt()`, `perturb()` and `exude()`. + * Note that whatever may be the optimization processes activated, + * they are always launched in the order that is a suborder + * of the following (see user manual for further + * details): *ODT-smoother*, *Lloyd-smoother*, *perturber*, and *exuder*. + * + * Beware that optimization of the mesh is obtained + * by perturbing mesh vertices and modifying the mesh connectivity + * and that this has an impact + * on the strict compliance to the refinement criteria. + * Though a strict compliance to mesh criteria + * is guaranteed at the end of the Delaunay refinement, this may no longer be true after + * some optimization processes. Also beware that the default behavior does involve some + * optimization processes. + * + * \sa `make_periodic_3_mesh_3()` + * \sa `refine_mesh_3()` + * \sa `exude_periodic_3_mesh_3()` + * \sa `perturb_periodic_3_mesh_3()` + * \sa `lloyd_optimize_periodic_3_mesh_3()` + * \sa `odt_optimize_periodic_3_mesh_3()` + * \sa `parameters::exude` + * \sa `parameters::no_exude` + * \sa `parameters::perturb` + * \sa `parameters::no_perturb` + * \sa `parameters::lloyd` + * \sa `parameters::no_lloyd` + * \sa `parameters::odt` + * \sa `parameters::no_odt` */ - - template void refine_periodic_3_mesh_3(C3T3& c3t3, MeshDomain& domain, MeshCriteria& criteria, const CGAL_NP_CLASS& np = parameters::default_values()) { - using parameters::choose_parameter; - using parameters::get_parameter; - parameters::internal::Exude_options exude_param = choose_parameter(get_parameter(np, internal_np::exude_options_param), parameters::no_exude().v); - parameters::internal::Perturb_options perturb_param = choose_parameter(get_parameter(np, internal_np::perturb_options_param), parameters::no_perturb().v); - parameters::internal::Odt_options odt_param = choose_parameter(get_parameter(np, internal_np::odt_options_param), parameters::no_odt().v); - parameters::internal::Lloyd_options lloyd_param = choose_parameter(get_parameter(np, internal_np::lloyd_options_param), parameters::no_lloyd().v); - bool reset = choose_parameter(get_parameter(np, internal_np::do_reset_c3t3), false); - parameters::internal::Mesh_3_options mesh_options_param = choose_parameter(get_parameter(np, internal_np::mesh_param), parameters::internal::Mesh_3_options()); - parameters::internal::Manifold_options manifold_options_param = choose_parameter(get_parameter(np, internal_np::manifold_param), parameters::internal::Manifold_options()); + using parameters::choose_parameter; + using parameters::get_parameter; + parameters::internal::Exude_options exude_param = choose_parameter(get_parameter(np, internal_np::exude_options_param), parameters::no_exude().v); + parameters::internal::Perturb_options perturb_param = choose_parameter(get_parameter(np, internal_np::perturb_options_param), parameters::no_perturb().v); + parameters::internal::Odt_options odt_param = choose_parameter(get_parameter(np, internal_np::odt_options_param), parameters::no_odt().v); + parameters::internal::Lloyd_options lloyd_param = choose_parameter(get_parameter(np, internal_np::lloyd_options_param), parameters::no_lloyd().v); + bool reset = choose_parameter(get_parameter(np, internal_np::do_reset_c3t3), false); + parameters::internal::Mesh_3_options mesh_options_param = choose_parameter(get_parameter(np, internal_np::mesh_param), parameters::internal::Mesh_3_options()); + parameters::internal::Manifold_options manifold_options_param = choose_parameter(get_parameter(np, internal_np::manifold_param), parameters::internal::Manifold_options()); - return refine_periodic_3_mesh_3_impl(c3t3, - domain, - criteria, - exude_param, - perturb_param, - odt_param, - lloyd_param, - reset, - mesh_options_param, - manifold_options_param); + return refine_periodic_3_mesh_3_impl(c3t3, + domain, + criteria, + exude_param, + perturb_param, + odt_param, + lloyd_param, + reset, + mesh_options_param, + manifold_options_param); } #ifndef DOXYGEN_RUNNING template void refine_periodic_3_mesh_3(C3T3& c3t3, MeshDomain& domain, MeshCriteria& criteria, const CGAL_NP_CLASS& ... nps) { - return refine_periodic_3_mesh_3(c3t3, domain, criteria, internal_np::combine_named_parameters(nps...)); + return refine_periodic_3_mesh_3(c3t3, domain, criteria, internal_np::combine_named_parameters(nps...)); } /** * @brief This function refines the mesh c3t3 wrt domain & criteria