move code so that we can reinject mesh_3 parameters functions into NFP class

This commit is contained in:
Sébastien Loriot 2022-09-26 20:09:58 +02:00
parent 300fbb1131
commit 54a6462273
13 changed files with 731 additions and 663 deletions

View File

@ -107,7 +107,7 @@ void initialize_triangulation_from_labeled_image(C3T3& c3t3,
if(protect_features) {
init_tr_from_labeled_image_call_init_features
(c3t3, domain, criteria,
CGAL::Mesh_3::internal::Has_features<Mesh_domain>());
CGAL::internal::Has_features<Mesh_domain>());
}
const double max_v = (std::max)((std::max)(image.vx(),

View File

@ -22,7 +22,7 @@
#include <CGAL/enum.h>
#include <CGAL/tags.h>
#include <CGAL/SMDS_3/Has_features.h>
#include <CGAL/STL_Extension/internal/Has_features.h>
#include <boost/type_traits/is_same.hpp>
namespace CGAL {
@ -33,7 +33,7 @@ template<typename Triangulation, typename MeshDomain>
bool has_non_protecting_weights(const Triangulation& tr,
const MeshDomain&)
{
const bool with_features = Has_features<MeshDomain>::value;
const bool with_features = ::CGAL::internal::Has_features<MeshDomain>::value;
typedef typename Triangulation::FT FT;
typedef typename Triangulation::Weighted_point Weighted_point;

View File

@ -13,556 +13,22 @@
#include <CGAL/license/Mesh_3.h>
#include <CGAL/Mesh_error_code.h>
#include <CGAL/Mesh_3/parameters_defaults.h>
#include <CGAL/Mesh_3/sliver_criteria.h>
#include <CGAL/Named_function_parameters.h>
#include <CGAL/SMDS_3/Has_features.h>
#include <CGAL/STL_Extension/internal/Has_features.h>
namespace CGAL {
namespace parameters {
namespace internal {
#define CGAL_NP_BASE internal_np::No_property
#define CGAL_NP_BUILD(P, V) P(V)
#include <CGAL/STL_Extension/internal/mesh_parameters_interface.h>
const int undef_parameter = -1;
#undef CGAL_NP_BASE
#undef CGAL_NP_BUILD
// Helpers
struct Optimization_options_base
{
Optimization_options_base(bool b)
: b_(b), time_limit_(undef_parameter), bound_(undef_parameter) {}
} } // end of CGAL::parameters namespace
operator bool() const { return b_; }
bool is_time_limit_set() const { return time_limit_ != undef_parameter; }
void set_time_limit(double d) { time_limit_ = d; }
double time_limit() const { return time_limit_; }
bool is_bound_set() const { return bound_ != undef_parameter; }
void set_bound(double d) { bound_ = d; }
double bound() const { return bound_; }
private:
bool b_;
double time_limit_;
double bound_;
};
struct Global_optimization_options_base
{
Global_optimization_options_base()
: convergence_(undef_parameter), max_it_nb_(undef_parameter) {}
bool is_convergence_set() const { return convergence_ != undef_parameter; }
void set_convergence(double d) { convergence_ = d; }
double convergence() const { return convergence_; }
bool is_max_iteration_number_set() const { return max_it_nb_ != undef_parameter; }
void set_max_iteration_number(int i) { max_it_nb_ = i; }
int max_iteration_number() const { return max_it_nb_; }
private:
double convergence_;
int max_it_nb_;
};
// Perturb
struct Perturb_options : public Optimization_options_base
{
Perturb_options(bool b) : Optimization_options_base(b) {}
};
// Exude
struct Exude_options : public Optimization_options_base
{
Exude_options(bool b) : Optimization_options_base(b) {}
};
// Odt
struct Odt_options : public Optimization_options_base
, public Global_optimization_options_base
{
Odt_options(bool b) : Optimization_options_base(b)
, Global_optimization_options_base() {}
};
// Lloyd
struct Lloyd_options : public Optimization_options_base
, public Global_optimization_options_base
{
Lloyd_options(bool b) : Optimization_options_base(b)
, Global_optimization_options_base() {}
};
// Manifold
struct Manifold_options {
enum {
NON_MANIFOLD = 0,
MANIFOLD_WITH_BOUNDARY = 8,
NO_BOUNDARY = 16,
MANIFOLD = 24
};
Manifold_options(const int topology)
: mesh_topology(topology)
{}
Manifold_options()
: mesh_topology(NON_MANIFOLD)
{}
int mesh_topology;
};
// Various Mesh_3 option
struct Mesh_3_options {
#ifndef CGAL_NO_ATOMIC
typedef std::atomic<bool>* Pointer_to_stop_atomic_boolean_t;
#else
typedef bool* Pointer_to_stop_atomic_boolean_t;
#endif
Mesh_3_options(bool nonlinear = false)
// This parameter `nonlinear` adds a compatibility with previous
// API of the constructor of `C3t3_initializer`.
// -- Laurent Rineau, 2019/05/03
: dump_after_init_prefix()
, dump_after_refine_surface_prefix()
, dump_after_refine_prefix()
, dump_after_glob_opt_prefix()
, dump_after_perturb_prefix()
, dump_after_exude_prefix()
, number_of_initial_points(-1)
, nonlinear_growth_of_balls(nonlinear)
, maximal_number_of_vertices(0)
, pointer_to_error_code(0)
#ifndef CGAL_NO_ATOMIC
, pointer_to_stop_atomic_boolean(0)
#endif
{}
std::string dump_after_init_prefix;
std::string dump_after_refine_surface_prefix;
std::string dump_after_refine_prefix;
std::string dump_after_glob_opt_prefix;
std::string dump_after_perturb_prefix;
std::string dump_after_exude_prefix;
int number_of_initial_points;
bool nonlinear_growth_of_balls;
std::size_t maximal_number_of_vertices;
Mesh_error_code* pointer_to_error_code;
#ifndef CGAL_NO_ATOMIC
Pointer_to_stop_atomic_boolean_t pointer_to_stop_atomic_boolean;
#endif
}; // end struct Mesh_3_options
// Features
struct Features_options
{
Features_options(bool b) : b_(b) {}
bool features() const { return b_; }
private:
bool b_;
};
// -----------------------------------
// Features generator
// -----------------------------------
// struct Features_option_generator
template <typename HasFeatures>
struct Features_options_generator {};
template<>
struct Features_options_generator<CGAL::Tag_true>
{
Features_options operator()() { return Features_options(true); }
};
template<>
struct Features_options_generator<CGAL::Tag_false>
{
Features_options operator()() { return Features_options(false); }
};
// struct Domain_features_generator is designed to handle cases where
// MeshDomain::Has_features is not a valid type
template< typename MeshDomain, bool MeshDomainHasHasFeatures >
struct Domain_features_generator {};
template< typename MeshDomain >
struct Domain_features_generator< MeshDomain, false >
{
Features_options operator()()
{
return Features_options_generator<CGAL::Tag_false>()();
}
};
template< typename MeshDomain >
struct Domain_features_generator< MeshDomain, true >
{
Features_options operator()()
{
return Features_options_generator<typename MeshDomain::Has_features>()();
}
};
} // end namespace internal
// -----------------------------------
// Reset_c3t3 (undocumented)
// -----------------------------------
inline
Named_function_parameters<bool, internal_np::do_reset_c3t3_t>
reset_c3t3()
{
return Named_function_parameters<bool, internal_np::do_reset_c3t3_t>(true);
}
inline
Named_function_parameters<bool, internal_np::do_reset_c3t3_t>
no_reset_c3t3()
{
return Named_function_parameters<bool, internal_np::do_reset_c3t3_t>(false);
}
// -----------------------------------
// Perturb
// -----------------------------------
template<typename CGAL_NP_TEMPLATE_PARAMETERS>
Named_function_parameters<internal::Perturb_options, internal_np::perturb_options_param_t>
perturb(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),internal::undef_parameter);
double sliver_bound = choose_parameter(get_parameter(np,internal_np::lower_sliver_bound),default_values_for_mesh_3::perturb_sliver_bound);
internal::Perturb_options options(true);
if ( internal::undef_parameter != time_limit)
options.set_time_limit(time_limit);
options.set_bound(sliver_bound);
typedef Named_function_parameters<internal::Perturb_options, internal_np::perturb_options_param_t> Param;
return Param(options);
}
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
Named_function_parameters<internal::Perturb_options, internal_np::perturb_options_param_t>
perturb(const CGAL_NP_CLASS& ... nps)
{
return perturb(internal_np::combine_named_parameters(nps...));
}
inline Named_function_parameters<internal::Perturb_options, internal_np::perturb_options_param_t>
no_perturb()
{
typedef Named_function_parameters<internal::Perturb_options, internal_np::perturb_options_param_t> Param;
return Param(internal::Perturb_options(false));
}
#ifndef CGAL_NO_DEPRECATED_CODE
CGAL_DEPRECATED
inline
Named_function_parameters<internal::Perturb_options, internal_np::perturb_options_param_t>
perturb(double time_limit_,
double sliver_bound_=0)
{
return perturb(time_limit(time_limit_).
sliver_bound(sliver_bound_));
}
#endif
// -----------------------------------
// Exude
// -----------------------------------
template<typename CGAL_NP_TEMPLATE_PARAMETERS>
Named_function_parameters<internal::Exude_options, internal_np::exude_options_param_t>
exude(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),internal::undef_parameter);
double sliver_bound = choose_parameter(get_parameter(np,internal_np::lower_sliver_bound),default_values_for_mesh_3::perturb_sliver_bound);
internal::Exude_options options(true);
if ( internal::undef_parameter != time_limit)
options.set_time_limit(time_limit);
options.set_bound(sliver_bound);
typedef Named_function_parameters<internal::Exude_options, internal_np::exude_options_param_t> Param;
return Param(options);
}
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
Named_function_parameters<internal::Exude_options, internal_np::exude_options_param_t>
exude(const CGAL_NP_CLASS& ... nps)
{
return exude(internal_np::combine_named_parameters(nps...));
}
inline Named_function_parameters<internal::Exude_options, internal_np::exude_options_param_t>
no_exude()
{
typedef Named_function_parameters<internal::Exude_options, internal_np::exude_options_param_t> Param;
return Param(internal::Exude_options(false));
}
#ifndef CGAL_NO_DEPRECATED_CODE
CGAL_DEPRECATED
inline
Named_function_parameters<internal::Exude_options, internal_np::exude_options_param_t>
exude(double time_limit_,
double sliver_bound_ = 0)
{
return exude(time_limit(time_limit_).sliver_bound(sliver_bound_));
}
#endif
// -----------------------------------
// Odt
// -----------------------------------
template<typename CGAL_NP_TEMPLATE_PARAMETERS>
Named_function_parameters<internal::Odt_options, internal_np::odt_options_param_t>
odt(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);
double freeze_bound = choose_parameter(get_parameter(np,internal_np::vertex_freeze_bound),default_values_for_mesh_3::odt_freeze_ratio);
double convergence = choose_parameter(get_parameter(np,internal_np::convergence_ratio), default_values_for_mesh_3::odt_convergence_ratio);
int max_iteration_number = choose_parameter(get_parameter(np,internal_np::number_of_iterations), 0);
internal::Odt_options options(true);
options.set_time_limit(time_limit);
options.set_bound(freeze_bound);
options.set_convergence(convergence);
options.set_max_iteration_number(max_iteration_number);
typedef Named_function_parameters<internal::Odt_options, internal_np::odt_options_param_t> Param;
return Param(options);
}
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
Named_function_parameters<internal::Odt_options, internal_np::odt_options_param_t>
odt(const CGAL_NP_CLASS& ... nps)
{
return odt(internal_np::combine_named_parameters(nps...));
}
inline Named_function_parameters<internal::Odt_options, internal_np::odt_options_param_t>
no_odt()
{
typedef Named_function_parameters<internal::Odt_options, internal_np::odt_options_param_t> Param;
return Param(internal::Odt_options(false));
}
#ifndef CGAL_NO_DEPRECATED_CODE
CGAL_DEPRECATED
inline
Named_function_parameters<internal::Odt_options, internal_np::odt_options_param_t>
odt(double time_limit_,
std::size_t max_iteration_number_ = 0,
double convergence_ = 0.02,
double freeze_bound_ = 0.01,
bool do_freeze_ = true)
{
return odt(time_limit(time_limit_).
max_iteration_number(max_iteration_number_).
convergence(convergence_).
freeze_bound(freeze_bound_).
do_freeze(do_freeze_));
}
#endif
// -----------------------------------
// Lloyd
// -----------------------------------
template<typename CGAL_NP_TEMPLATE_PARAMETERS>
Named_function_parameters<internal::Lloyd_options, internal_np::lloyd_options_param_t>
lloyd(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);
double freeze_bound = choose_parameter(get_parameter(np,internal_np::vertex_freeze_bound),default_values_for_mesh_3::lloyd_freeze_ratio);
double convergence = choose_parameter(get_parameter(np,internal_np::convergence_ratio), default_values_for_mesh_3::lloyd_convergence_ratio);
int max_iteration_number = choose_parameter(get_parameter(np,internal_np::number_of_iterations), 0);
internal::Lloyd_options options(true);
options.set_time_limit(time_limit);
options.set_bound(freeze_bound);
options.set_convergence(convergence);
options.set_max_iteration_number(max_iteration_number);
typedef Named_function_parameters<internal::Lloyd_options, internal_np::lloyd_options_param_t> Param;
return Param(options);
}
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
Named_function_parameters<internal::Lloyd_options, internal_np::lloyd_options_param_t>
lloyd(const CGAL_NP_CLASS& ... nps)
{
return lloyd(internal_np::combine_named_parameters(nps...));
}
inline Named_function_parameters<internal::Lloyd_options, internal_np::lloyd_options_param_t>
no_lloyd()
{
typedef Named_function_parameters<internal::Lloyd_options, internal_np::lloyd_options_param_t> Param;
return Param(internal::Lloyd_options(false));
}
#ifndef CGAL_NO_DEPRECATED_CODE
CGAL_DEPRECATED
inline
Named_function_parameters<internal::Lloyd_options, internal_np::lloyd_options_param_t>
lloyd(double time_limit_,
std::size_t max_iteration_number_ = 0,
double convergence_ = 0.02,
double freeze_bound_ = 0.01,
bool do_freeze_= true)
{
return lloyd(time_limit(time_limit_).
max_iteration_number(max_iteration_number_).
convergence(convergence_).
freeze_bound(freeze_bound_).
do_freeze(do_freeze_));
}
#endif
// -----------------------------------
// Manifold options
// -----------------------------------
template<typename CGAL_NP_TEMPLATE_PARAMETERS>
Named_function_parameters<internal::Manifold_options, internal_np::manifold_param_t>
manifold_options(const CGAL_NP_CLASS& np = parameters::default_values())
{
using parameters::choose_parameter;
using parameters::get_parameter;
int mesh_topology = choose_parameter(get_parameter(np, internal_np::mesh_topology_number), -1);
internal::Manifold_options options;
options.mesh_topology = mesh_topology;
typedef Named_function_parameters<internal::Manifold_options, internal_np::manifold_param_t> Param;
return Param(options);
}
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
Named_function_parameters<internal::Manifold_options, internal_np::manifold_param_t>
manifold_options(const CGAL_NP_CLASS& ... nps)
{
return manifold_options(internal_np::combine_named_parameters(nps...));
}
inline Named_function_parameters<internal::Manifold_options, internal_np::manifold_param_t>
manifold()
{
typedef Named_function_parameters<internal::Manifold_options, internal_np::manifold_param_t> Param;
return Param(internal::Manifold_options(internal::Manifold_options::MANIFOLD));
}
inline Named_function_parameters<internal::Manifold_options, internal_np::manifold_param_t>
manifold_with_boundary()
{
typedef Named_function_parameters<internal::Manifold_options, internal_np::manifold_param_t> Param;
return Param(internal::Manifold_options(
internal::Manifold_options::MANIFOLD_WITH_BOUNDARY));
}
inline Named_function_parameters<internal::Manifold_options, internal_np::manifold_param_t>
non_manifold()
{
typedef Named_function_parameters<internal::Manifold_options, internal_np::manifold_param_t> Param;
return Param(internal::Manifold_options(internal::Manifold_options::NON_MANIFOLD));
}
// -----------------------------------
// Mesh options
// -----------------------------------
// Undocumented parameter for refine_mesh_3 and make_mesh_3.
// Allows to dump the mesh at given stage of the mesh generation
// algorithm.
template<typename CGAL_NP_TEMPLATE_PARAMETERS>
Named_function_parameters<internal::Mesh_3_options, internal_np::mesh_param_t>
mesh_3_options(const CGAL_NP_CLASS& np = parameters::default_values())
{
using parameters::choose_parameter;
using parameters::get_parameter;
internal::Mesh_3_options options;
options.dump_after_init_prefix=choose_parameter(get_parameter(np, internal_np::dump_after_init_prefix_param), "");
options.dump_after_refine_surface_prefix=choose_parameter(get_parameter(np, internal_np::dump_after_refine_surface_prefix_param), "");
options.dump_after_refine_prefix=choose_parameter(get_parameter(np, internal_np::dump_after_refine_prefix_param), "");
options.dump_after_glob_opt_prefix=choose_parameter(get_parameter(np, internal_np::dump_after_glob_opt_prefix_param), "");
options.dump_after_perturb_prefix=choose_parameter(get_parameter(np, internal_np::dump_after_perturb_prefix_param), "");
options.dump_after_exude_prefix=choose_parameter(get_parameter(np, internal_np::dump_after_refine_surface_prefix_param), "");
options.number_of_initial_points=choose_parameter(get_parameter(np, internal_np::number_of_initial_points_param), -1);
options.nonlinear_growth_of_balls = choose_parameter(get_parameter(np, internal_np::nonlinear_growth_of_balls_param), false);
options.maximal_number_of_vertices=choose_parameter(get_parameter(np, internal_np::maximal_number_of_vertices_param), 0);
options.pointer_to_error_code=choose_parameter(get_parameter(np, internal_np::pointer_to_error_code_param), ((Mesh_error_code*)0));
#ifndef CGAL_NO_ATOMIC
options.pointer_to_stop_atomic_boolean=choose_parameter(get_parameter(np, internal_np::pointer_to_stop_atomic_boolean_param),
((internal::Mesh_3_options::Pointer_to_stop_atomic_boolean_t)0));
#endif
typedef Named_function_parameters<internal::Mesh_3_options, internal_np::mesh_param_t> Param;
return Param(options);
}
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
Named_function_parameters<internal::Mesh_3_options, internal_np::mesh_param_t>
mesh_3_options(const CGAL_NP_CLASS& ... nps)
{
return mesh_3_options(internal_np::combine_named_parameters(nps...));
}
// Undocumented parameter for refine_mesh_3 and make_mesh_3.
// Default Mesh_3_options: dump at every stage of the mesh generation.
inline
Named_function_parameters<internal::Mesh_3_options, internal_np::mesh_param_t>
mesh_3_dump()
{
typedef Named_function_parameters<internal::Mesh_3_options, internal_np::mesh_param_t> Param;
internal::Mesh_3_options options;
options.dump_after_init_prefix = "mesh_dump_after_init";
options.dump_after_refine_surface_prefix = "mesh_dump_after_refine_surface";
options.dump_after_refine_prefix = "mesh_dump_after_refine";
options.dump_after_glob_opt_prefix = "mesh_dump_after_glob_opt";
options.dump_after_perturb_prefix = "mesh_dump_after_perturb";
options.dump_after_exude_prefix = "mesh_dump_after_exude";
return Param(options);
}
// -----------------------------------
// Features_options
// -----------------------------------
inline Named_function_parameters<internal::Features_options, internal_np::features_option_param_t>
features() {
typedef Named_function_parameters<internal::Features_options, internal_np::features_option_param_t> Param;
return Param(internal::Features_options(true));
}
inline Named_function_parameters<internal::Features_options, internal_np::features_option_param_t>
no_features() {
typedef Named_function_parameters<internal::Features_options, internal_np::features_option_param_t> Param;
return Param(internal::Features_options(false)); }
template < typename MeshDomain >
inline Named_function_parameters<internal::Features_options, internal_np::features_option_param_t>
features(const MeshDomain& /*domain*/)
{
typedef typename internal::Domain_features_generator<MeshDomain,
CGAL::Mesh_3::internal::has_Has_features<MeshDomain>::value > Generator;
typedef Named_function_parameters<internal::Features_options, internal_np::features_option_param_t> Param;
return Param(Generator()());
}
} } //namespace CGAL::parameters
#endif //CGAL_MESH_3_PARAMETERS_H

View File

@ -23,6 +23,9 @@
#include <CGAL/Mesh_3/sliver_criteria.h>
// see also default_values_for_mesh_3 namespace
// in CGAL/STL_Extension/internal/mesh_option_classes.h
namespace CGAL {
namespace parameters { namespace default_values_for_mesh_3 {
@ -30,7 +33,6 @@ namespace parameters { namespace default_values_for_mesh_3 {
const double exude_sliver_bound = 0.;
// perturb_mesh_3
const double perturb_sliver_bound = 0.;
template<typename C3T3>
CGAL::Mesh_3::Min_dihedral_angle_criterion
<typename C3T3::Triangulation>
@ -43,14 +45,6 @@ CGAL::Mesh_3::Min_dihedral_angle_criterion
// global optimizers
const bool do_freeze = true;
// lloyd_optimize_mesh_3
const double lloyd_freeze_ratio = 0.01;
const double lloyd_convergence_ratio = 0.02;
// odt_optimize_mesh_3
const double odt_freeze_ratio = 0.01;
const double odt_convergence_ratio = 0.02;
} } // end namespace parameters::default_values_for_mesh_3
} // end namespace CGAL

View File

@ -14,17 +14,13 @@
#include <CGAL/license/Mesh_3.h>
#include <CGAL/STL_Extension/internal/mesh_option_classes.h>
#include <string>
#include <sstream>
namespace CGAL {
enum Mesh_error_code {
CGAL_MESH_3_NO_ERROR = 0,
CGAL_MESH_3_MAXIMAL_NUMBER_OF_VERTICES_REACHED,
CGAL_MESH_3_STOPPED
};
inline
std::string mesh_error_string(const Mesh_error_code& error_code) {
switch(error_code) {

View File

@ -25,7 +25,7 @@
#include <CGAL/refine_mesh_3.h>
#include <CGAL/tags.h>
#include <CGAL/Mesh_3/Protect_edges_sizing_field.h>
#include <CGAL/SMDS_3/Has_features.h>
#include <CGAL/STL_Extension/internal/Has_features.h>
#include <CGAL/Mesh_3/C3T3_helpers.h>
#include <boost/mpl/has_xxx.hpp>
@ -494,7 +494,7 @@ void make_mesh_3_impl(C3T3& c3t3,
C3T3,
MeshDomain,
MeshCriteria,
Mesh_3::internal::has_Has_features<MeshDomain>::value > () (c3t3,
::CGAL::internal::has_Has_features<MeshDomain>::value > () (c3t3,
domain,
criteria,
with_features,

View File

@ -382,11 +382,11 @@ void make_periodic_3_mesh_3_impl(C3T3& c3t3,
// Initialize c3t3
Periodic_3_mesh_3::internal::C3t3_initializer<
C3T3, MeshDomain, MeshCriteria,
Mesh_3::internal::has_Has_features<MeshDomain>::value>()(c3t3,
domain,
criteria,
with_features,
mesh_options);
internal::has_Has_features<MeshDomain>::value>()(c3t3,
domain,
criteria,
with_features,
mesh_options);
// Build mesher and launch refinement process
refine_periodic_3_mesh_3(c3t3, domain, criteria,

View File

@ -226,7 +226,7 @@ initialize(const Mesh_criteria& criteria, Mesh_fnt::Domain_tag)
C3t3,
Domain,
Mesh_criteria,
CGAL::Mesh_3::internal::has_Has_features<Domain>::value >()
CGAL::internal::has_Has_features<Domain>::value >()
(c3t3_,
*domain_,
criteria,

View File

@ -26,7 +26,7 @@
#include <boost/variant/variant.hpp>
#include <boost/variant/get.hpp>
#include <boost/variant/apply_visitor.hpp>
#include <CGAL/SMDS_3/Has_features.h>
#include <CGAL/STL_Extension/internal/Has_features.h>
#include <CGAL/IO/io.h>
#include <tuple>
@ -53,7 +53,7 @@ struct Index_generator<T, T>
typedef Index type;
};
template <typename MD, bool has_feature = Has_features<MD>::value>
template <typename MD, bool has_feature = ::CGAL::internal::Has_features<MD>::value>
struct Indices_tuple_generator
{
using type = std::tuple<typename MD::Subdomain_index,
@ -152,7 +152,7 @@ template <typename T>
const T& get_index(const T& x) { return x; }
template <typename Mesh_domain,
bool has_feature = Has_features<Mesh_domain>::value>
bool has_feature = ::CGAL::internal::Has_features<Mesh_domain>::value>
struct Read_mesh_domain_index {
// here we have has_feature==true
@ -181,7 +181,7 @@ struct Read_mesh_domain_index {
// Read_mesh_domain_index<Mesh_domain, true>
template <typename Mesh_domain,
bool has_feature = Has_features<Mesh_domain>::value>
bool has_feature = ::CGAL::internal::Has_features<Mesh_domain>::value>
struct Write_mesh_domain_index {
// here we have has_feature==true

View File

@ -17,6 +17,7 @@
#endif
#include <CGAL/tags.h>
#include <CGAL/STL_Extension/internal/mesh_option_classes.h>
#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/if.hpp>
@ -242,11 +243,93 @@ get_parameter_reference_impl(const Named_params_impl<T, Tag, Base>& np, Query_ta
return get_parameter_reference_impl(static_cast<const typename Base::base&>(np), tag);
}
} // end of internal_np namespace
template <typename T, typename Tag, typename Base = internal_np::No_property>
struct Named_function_parameters;
namespace parameters{
typedef Named_function_parameters<bool, internal_np::all_default_t> Default_named_parameters;
Default_named_parameters
inline default_values();
// function to extract a parameter
template <typename T, typename Tag, typename Base, typename Query_tag>
typename internal_np::Get_param<internal_np::Named_params_impl<T, Tag, Base>, Query_tag>::type
get_parameter(const Named_function_parameters<T, Tag, Base>& np, Query_tag tag)
{
return internal_np::get_parameter_impl(static_cast<const internal_np::Named_params_impl<T, Tag, Base>&>(np), tag);
}
template <typename T, typename Tag, typename Base, typename Query_tag>
typename internal_np::Get_param<internal_np::Named_params_impl<T, Tag, Base>, Query_tag>::reference
get_parameter_reference(const Named_function_parameters<T, Tag, Base>& np, Query_tag tag)
{
return internal_np::get_parameter_reference_impl(
static_cast<const internal_np::Named_params_impl<T, Tag, Base>&>(np),
tag);
}
// Two parameters, non-trivial default value
template <typename D>
D& choose_parameter(const internal_np::Param_not_found&, D& d)
{
return d;
}
template <typename D>
const D& choose_parameter(const internal_np::Param_not_found&, const D& d)
{
return d;
}
template <typename D>
D choose_parameter(const internal_np::Param_not_found&, D&& d)
{
return std::forward<D>(d);
}
template <typename T, typename D>
T& choose_parameter(T& t, D&)
{
return t;
}
template <typename T, typename D>
const T& choose_parameter(const T& t, const D&)
{
return t;
}
// single parameter so that we can avoid a default construction
template <typename D>
D choose_parameter(const internal_np::Param_not_found&)
{
return D();
}
template <typename D, typename T>
const T& choose_parameter(const T& t)
{
return t;
}
} // parameters namespace
namespace internal_np {
template <typename Tag, typename K, typename ... NPS>
auto
combine_named_parameters(const Named_function_parameters<K, Tag>& np, const NPS& ... nps)
{
return np.combine(nps ...);
}
} // end of internal_np namespace
template <typename T, typename Tag, typename Base = internal_np::No_property>
template <typename T, typename Tag, typename Base>
struct Named_function_parameters
: internal_np::Named_params_impl<T, Tag, Base>
{
@ -299,6 +382,15 @@ struct Named_function_parameters
#undef CGAL_add_named_parameter_with_compatibility_ref_only
#undef CGAL_add_extra_named_parameter_with_compatibility
// inject mesh specific named parameter functions
#define CGAL_NP_BASE self
#define CGAL_NP_BUILD(P, V) P(V, *this)
#include <CGAL/STL_Extension/internal/mesh_parameters_interface.h>
#undef CGAL_NP_BASE
#undef CGAL_NP_BUILD
template <typename OT, typename OTag>
Named_function_parameters<OT, OTag, self>
combine(const Named_function_parameters<OT,OTag>& np) const
@ -319,7 +411,11 @@ struct Named_function_parameters
namespace parameters {
typedef Named_function_parameters<bool, internal_np::all_default_t> Default_named_parameters;
Default_named_parameters
inline default_values()
{
return Default_named_parameters();
}
#ifndef CGAL_NO_DEPRECATED_CODE
Default_named_parameters
@ -329,12 +425,6 @@ inline all_default()
}
#endif
Default_named_parameters
inline default_values()
{
return Default_named_parameters();
}
template <typename T, typename Tag, typename Base>
Named_function_parameters<T,Tag,Base>
inline no_parameters(Named_function_parameters<T,Tag,Base>)
@ -405,67 +495,6 @@ struct Boost_parameter_compatibility_wrapper<Tag, true>
#undef CGAL_add_named_parameter_with_compatibility
#undef CGAL_add_named_parameter_with_compatibility_ref_only
// function to extract a parameter
template <typename T, typename Tag, typename Base, typename Query_tag>
typename internal_np::Get_param<internal_np::Named_params_impl<T, Tag, Base>, Query_tag>::type
get_parameter(const Named_function_parameters<T, Tag, Base>& np, Query_tag tag)
{
return internal_np::get_parameter_impl(static_cast<const internal_np::Named_params_impl<T, Tag, Base>&>(np), tag);
}
template <typename T, typename Tag, typename Base, typename Query_tag>
typename internal_np::Get_param<internal_np::Named_params_impl<T, Tag, Base>, Query_tag>::reference
get_parameter_reference(const Named_function_parameters<T, Tag, Base>& np, Query_tag tag)
{
return internal_np::get_parameter_reference_impl(
static_cast<const internal_np::Named_params_impl<T, Tag, Base>&>(np),
tag);
}
// Two parameters, non-trivial default value
template <typename D>
D& choose_parameter(const internal_np::Param_not_found&, D& d)
{
return d;
}
template <typename D>
const D& choose_parameter(const internal_np::Param_not_found&, const D& d)
{
return d;
}
template <typename D>
D choose_parameter(const internal_np::Param_not_found&, D&& d)
{
return std::forward<D>(d);
}
template <typename T, typename D>
T& choose_parameter(T& t, D&)
{
return t;
}
template <typename T, typename D>
const T& choose_parameter(const T& t, const D&)
{
return t;
}
// single parameter so that we can avoid a default construction
template <typename D>
D choose_parameter(const internal_np::Param_not_found&)
{
return D();
}
template <typename D, typename T>
const T& choose_parameter(const T& t)
{
return t;
}
// Version with three parameters for dynamic property maps
template <typename D, typename Dynamic_tag, typename PolygonMesh>
D choose_parameter(const internal_np::Param_not_found&, Dynamic_tag tag, PolygonMesh& pm)
@ -493,17 +522,6 @@ struct is_default_parameter
} // end of parameters namespace
namespace internal_np {
template <typename Tag, typename K, typename ... NPS>
auto
combine_named_parameters(const Named_function_parameters<K, Tag>& np, const NPS& ... nps)
{
return np.combine(nps ...);
}
} // end of internal_np namespace
#ifndef CGAL_NO_DEPRECATED_CODE
namespace Polygon_mesh_processing {
@ -526,7 +544,7 @@ namespace boost
}
#endif
// For disambiguation using SFINAR
// For disambiguation using SFINAE
BOOST_MPL_HAS_XXX_TRAIT_DEF(CGAL_Named_function_parameters_class)
template<class T>
CGAL_CPP17_INLINE constexpr bool is_named_function_parameter = has_CGAL_Named_function_parameters_class<T>::value;

View File

@ -6,21 +6,17 @@
//
// $URL$
// $Id$
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Stéphane Tayeb, Laurent Rineau
#ifndef CGAL_MESH_3_HAS_FEATURES_H
#define CGAL_MESH_3_HAS_FEATURES_H
#include <CGAL/license/SMDS_3.h>
#ifndef CGAL_HAS_FEATURES_H
#define CGAL_HAS_FEATURES_H
#include <boost/mpl/has_xxx.hpp>
#include <CGAL/tags.h>
namespace CGAL {
namespace Mesh_3 {
namespace internal {
// A type has_Has_features to check if type 'Has_features' is a nested
@ -40,7 +36,6 @@ namespace internal {
{};
} // end namespace internal
} // end namespace Mesh_3
} // end namespace CGAL
#endif // CGAL_MESH_3_HAS_FEATURES_H

View File

@ -0,0 +1,229 @@
// Copyright (c) 2009 INRIA Sophia-Antipolis (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org).
//
// $URL$
// $Id$
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
//
#ifndef CGAL_MESH_OPTION_CLASSES_H
#define CGAL_MESH_OPTION_CLASSES_H
#include <CGAL/STL_Extension/internal/Has_features.h>
namespace CGAL {
enum Mesh_error_code {
CGAL_MESH_3_NO_ERROR = 0,
CGAL_MESH_3_MAXIMAL_NUMBER_OF_VERTICES_REACHED,
CGAL_MESH_3_STOPPED
};
namespace parameters {
namespace internal {
const int undef_parameter = -1;
// Helpers
struct Optimization_options_base
{
Optimization_options_base(bool b)
: b_(b), time_limit_(undef_parameter), bound_(undef_parameter) {}
operator bool() const { return b_; }
bool is_time_limit_set() const { return time_limit_ != undef_parameter; }
void set_time_limit(double d) { time_limit_ = d; }
double time_limit() const { return time_limit_; }
bool is_bound_set() const { return bound_ != undef_parameter; }
void set_bound(double d) { bound_ = d; }
double bound() const { return bound_; }
private:
bool b_;
double time_limit_;
double bound_;
};
struct Global_optimization_options_base
{
Global_optimization_options_base()
: convergence_(undef_parameter), max_it_nb_(undef_parameter) {}
bool is_convergence_set() const { return convergence_ != undef_parameter; }
void set_convergence(double d) { convergence_ = d; }
double convergence() const { return convergence_; }
bool is_max_iteration_number_set() const { return max_it_nb_ != undef_parameter; }
void set_max_iteration_number(int i) { max_it_nb_ = i; }
int max_iteration_number() const { return max_it_nb_; }
private:
double convergence_;
int max_it_nb_;
};
// Perturb
struct Perturb_options : public Optimization_options_base
{
Perturb_options(bool b) : Optimization_options_base(b) {}
};
// Exude
struct Exude_options : public Optimization_options_base
{
Exude_options(bool b) : Optimization_options_base(b) {}
};
// Odt
struct Odt_options : public Optimization_options_base
, public Global_optimization_options_base
{
Odt_options(bool b) : Optimization_options_base(b)
, Global_optimization_options_base() {}
};
// Lloyd
struct Lloyd_options : public Optimization_options_base
, public Global_optimization_options_base
{
Lloyd_options(bool b) : Optimization_options_base(b)
, Global_optimization_options_base() {}
};
// Manifold
struct Manifold_options {
enum {
NON_MANIFOLD = 0,
MANIFOLD_WITH_BOUNDARY = 8,
NO_BOUNDARY = 16,
MANIFOLD = 24
};
Manifold_options(const int topology)
: mesh_topology(topology)
{}
Manifold_options()
: mesh_topology(NON_MANIFOLD)
{}
int mesh_topology;
};
// Various Mesh_3 option
struct Mesh_3_options {
#ifndef CGAL_NO_ATOMIC
typedef std::atomic<bool>* Pointer_to_stop_atomic_boolean_t;
#else
typedef bool* Pointer_to_stop_atomic_boolean_t;
#endif
Mesh_3_options(bool nonlinear = false)
// This parameter `nonlinear` adds a compatibility with previous
// API of the constructor of `C3t3_initializer`.
// -- Laurent Rineau, 2019/05/03
: dump_after_init_prefix()
, dump_after_refine_surface_prefix()
, dump_after_refine_prefix()
, dump_after_glob_opt_prefix()
, dump_after_perturb_prefix()
, dump_after_exude_prefix()
, number_of_initial_points(-1)
, nonlinear_growth_of_balls(nonlinear)
, maximal_number_of_vertices(0)
, pointer_to_error_code(0)
#ifndef CGAL_NO_ATOMIC
, pointer_to_stop_atomic_boolean(0)
#endif
{}
std::string dump_after_init_prefix;
std::string dump_after_refine_surface_prefix;
std::string dump_after_refine_prefix;
std::string dump_after_glob_opt_prefix;
std::string dump_after_perturb_prefix;
std::string dump_after_exude_prefix;
int number_of_initial_points;
bool nonlinear_growth_of_balls;
std::size_t maximal_number_of_vertices;
Mesh_error_code* pointer_to_error_code;
#ifndef CGAL_NO_ATOMIC
Pointer_to_stop_atomic_boolean_t pointer_to_stop_atomic_boolean;
#endif
}; // end struct Mesh_3_options
// Features
struct Features_options
{
Features_options(bool b) : b_(b) {}
bool features() const { return b_; }
private:
bool b_;
};
// -----------------------------------
// Features generator
// -----------------------------------
// struct Features_option_generator
template <typename HasFeatures>
struct Features_options_generator {};
template<>
struct Features_options_generator<CGAL::Tag_true>
{
Features_options operator()() { return Features_options(true); }
};
template<>
struct Features_options_generator<CGAL::Tag_false>
{
Features_options operator()() { return Features_options(false); }
};
// struct Domain_features_generator is designed to handle cases where
// MeshDomain::Has_features is not a valid type
template< typename MeshDomain, bool MeshDomainHasHasFeatures >
struct Domain_features_generator {};
template< typename MeshDomain >
struct Domain_features_generator< MeshDomain, false >
{
Features_options operator()()
{
return Features_options_generator<CGAL::Tag_false>()();
}
};
template< typename MeshDomain >
struct Domain_features_generator< MeshDomain, true >
{
Features_options operator()()
{
return Features_options_generator<typename MeshDomain::Has_features>()();
}
};
} // end namespace internal
namespace default_values_for_mesh_3 {
// perturb_mesh_3
const double perturb_sliver_bound = 0.;
// lloyd_optimize_mesh_3
const double lloyd_freeze_ratio = 0.01;
const double lloyd_convergence_ratio = 0.02;
// odt_optimize_mesh_3
const double odt_freeze_ratio = 0.01;
const double odt_convergence_ratio = 0.02;
} } } //namespace CGAL::parameters::def
#endif

View File

@ -0,0 +1,370 @@
// Copyright (c) 2017 GeometryFactory (France). All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL$
// $Id$
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
//
//
// List of named parameters special functions used in meshing packages of CGAL
// no guard on purpose as they are injected both in the parameter namespace
// and the Named_function_parameters class.
// -----------------------------------
// Reset_c3t3 (undocumented)
// -----------------------------------
inline
Named_function_parameters<bool, ::CGAL::internal_np::do_reset_c3t3_t, CGAL_NP_BASE>
reset_c3t3()
{
typedef Named_function_parameters<bool, ::CGAL::internal_np::do_reset_c3t3_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param, true);
}
inline
Named_function_parameters<bool, ::CGAL::internal_np::do_reset_c3t3_t, CGAL_NP_BASE>
no_reset_c3t3()
{
typedef Named_function_parameters<bool, ::CGAL::internal_np::do_reset_c3t3_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param, false);
}
// -----------------------------------
// Perturb
// -----------------------------------
template<typename CGAL_NP_TEMPLATE_PARAMETERS>
Named_function_parameters<::CGAL::parameters::internal::Perturb_options, ::CGAL::internal_np::perturb_options_param_t, CGAL_NP_BASE>
perturb(const CGAL_NP_CLASS& np = parameters::default_values())
{
using ::CGAL::parameters::choose_parameter;
using ::CGAL::parameters::get_parameter;
double time_limit = choose_parameter(get_parameter(np,::CGAL::internal_np::maximum_running_time),::CGAL::parameters::internal::undef_parameter);
double sliver_bound = choose_parameter(get_parameter(np,::CGAL::internal_np::lower_sliver_bound),::CGAL::parameters::default_values_for_mesh_3::perturb_sliver_bound);
::CGAL::parameters::internal::Perturb_options options(true);
if ( ::CGAL::parameters::internal::undef_parameter != time_limit)
options.set_time_limit(time_limit);
options.set_bound(sliver_bound);
typedef Named_function_parameters<::CGAL::parameters::internal::Perturb_options, ::CGAL::internal_np::perturb_options_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param, options);
}
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
Named_function_parameters<::CGAL::parameters::internal::Perturb_options, ::CGAL::internal_np::perturb_options_param_t, CGAL_NP_BASE>
perturb(const CGAL_NP_CLASS& ... nps)
{
return perturb(::CGAL::internal_np::combine_named_parameters(nps...));
}
inline Named_function_parameters<::CGAL::parameters::internal::Perturb_options, ::CGAL::internal_np::perturb_options_param_t, CGAL_NP_BASE>
no_perturb()
{
typedef Named_function_parameters<::CGAL::parameters::internal::Perturb_options, ::CGAL::internal_np::perturb_options_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param,::CGAL::parameters::internal::Perturb_options(false));
}
#ifndef CGAL_NO_DEPRECATED_CODE
CGAL_DEPRECATED
inline
Named_function_parameters<::CGAL::parameters::internal::Perturb_options, ::CGAL::internal_np::perturb_options_param_t, CGAL_NP_BASE>
perturb(double time_limit_,
double sliver_bound_=0)
{
return perturb(time_limit(time_limit_).
sliver_bound(sliver_bound_));
}
#endif
// -----------------------------------
// Exude
// -----------------------------------
template<typename CGAL_NP_TEMPLATE_PARAMETERS>
Named_function_parameters<::CGAL::parameters::internal::Exude_options, ::CGAL::internal_np::exude_options_param_t, CGAL_NP_BASE>
exude(const CGAL_NP_CLASS& np = parameters::default_values())
{
using ::CGAL::parameters::choose_parameter;
using ::CGAL::parameters::get_parameter;
double time_limit = choose_parameter(get_parameter(np,::CGAL::internal_np::maximum_running_time),::CGAL::parameters::internal::undef_parameter);
double sliver_bound = choose_parameter(get_parameter(np,::CGAL::internal_np::lower_sliver_bound),::CGAL::parameters::default_values_for_mesh_3::perturb_sliver_bound);
::CGAL::parameters::internal::Exude_options options(true);
if ( ::CGAL::parameters::internal::undef_parameter != time_limit)
options.set_time_limit(time_limit);
options.set_bound(sliver_bound);
typedef Named_function_parameters<::CGAL::parameters::internal::Exude_options, ::CGAL::internal_np::exude_options_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param, options);
}
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
Named_function_parameters<::CGAL::parameters::internal::Exude_options, ::CGAL::internal_np::exude_options_param_t, CGAL_NP_BASE>
exude(const CGAL_NP_CLASS& ... nps)
{
return exude(::CGAL::internal_np::combine_named_parameters(nps...));
}
inline Named_function_parameters<::CGAL::parameters::internal::Exude_options, ::CGAL::internal_np::exude_options_param_t, CGAL_NP_BASE>
no_exude()
{
typedef Named_function_parameters<::CGAL::parameters::internal::Exude_options, ::CGAL::internal_np::exude_options_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param,::CGAL::parameters::internal::Exude_options(false));
}
#ifndef CGAL_NO_DEPRECATED_CODE
CGAL_DEPRECATED
inline
Named_function_parameters<::CGAL::parameters::internal::Exude_options, ::CGAL::internal_np::exude_options_param_t, CGAL_NP_BASE>
exude(double time_limit_,
double sliver_bound_ = 0)
{
return exude(time_limit(time_limit_).sliver_bound(sliver_bound_));
}
#endif
// -----------------------------------
// Odt
// -----------------------------------
template<typename CGAL_NP_TEMPLATE_PARAMETERS>
Named_function_parameters<::CGAL::parameters::internal::Odt_options, ::CGAL::internal_np::odt_options_param_t, CGAL_NP_BASE>
odt(const CGAL_NP_CLASS& np = parameters::default_values())
{
using ::CGAL::parameters::choose_parameter;
using ::CGAL::parameters::get_parameter;
double time_limit = choose_parameter(get_parameter(np,::CGAL::internal_np::maximum_running_time),0);
double freeze_bound = choose_parameter(get_parameter(np,::CGAL::internal_np::vertex_freeze_bound),::CGAL::parameters::default_values_for_mesh_3::odt_freeze_ratio);
double convergence = choose_parameter(get_parameter(np,::CGAL::internal_np::convergence_ratio), ::CGAL::parameters::default_values_for_mesh_3::odt_convergence_ratio);
int max_iteration_number = choose_parameter(get_parameter(np,::CGAL::internal_np::number_of_iterations), 0);
::CGAL::parameters::internal::Odt_options options(true);
options.set_time_limit(time_limit);
options.set_bound(freeze_bound);
options.set_convergence(convergence);
options.set_max_iteration_number(max_iteration_number);
typedef Named_function_parameters<::CGAL::parameters::internal::Odt_options, ::CGAL::internal_np::odt_options_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param,options);
}
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
Named_function_parameters<::CGAL::parameters::internal::Odt_options, ::CGAL::internal_np::odt_options_param_t, CGAL_NP_BASE>
odt(const CGAL_NP_CLASS& ... nps)
{
return odt(::CGAL::internal_np::combine_named_parameters(nps...));
}
inline Named_function_parameters<::CGAL::parameters::internal::Odt_options, ::CGAL::internal_np::odt_options_param_t, CGAL_NP_BASE>
no_odt()
{
typedef Named_function_parameters<::CGAL::parameters::internal::Odt_options, ::CGAL::internal_np::odt_options_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param,::CGAL::parameters::internal::Odt_options(false));
}
#ifndef CGAL_NO_DEPRECATED_CODE
CGAL_DEPRECATED
inline
Named_function_parameters<::CGAL::parameters::internal::Odt_options, ::CGAL::internal_np::odt_options_param_t, CGAL_NP_BASE>
odt(double time_limit_,
std::size_t max_iteration_number_ = 0,
double convergence_ = 0.02,
double freeze_bound_ = 0.01,
bool do_freeze_ = true)
{
return odt(time_limit(time_limit_).
max_iteration_number(max_iteration_number_).
convergence(convergence_).
freeze_bound(freeze_bound_).
do_freeze(do_freeze_));
}
#endif
// -----------------------------------
// Lloyd
// -----------------------------------
template<typename CGAL_NP_TEMPLATE_PARAMETERS>
Named_function_parameters<::CGAL::parameters::internal::Lloyd_options, ::CGAL::internal_np::lloyd_options_param_t, CGAL_NP_BASE>
lloyd(const CGAL_NP_CLASS& np = parameters::default_values())
{
using ::CGAL::parameters::choose_parameter;
using ::CGAL::parameters::get_parameter;
double time_limit = choose_parameter(get_parameter(np,::CGAL::internal_np::maximum_running_time),0);
double freeze_bound = choose_parameter(get_parameter(np,::CGAL::internal_np::vertex_freeze_bound),::CGAL::parameters::default_values_for_mesh_3::lloyd_freeze_ratio);
double convergence = choose_parameter(get_parameter(np,::CGAL::internal_np::convergence_ratio), ::CGAL::parameters::default_values_for_mesh_3::lloyd_convergence_ratio);
int max_iteration_number = choose_parameter(get_parameter(np,::CGAL::internal_np::number_of_iterations), 0);
::CGAL::parameters::internal::Lloyd_options options(true);
options.set_time_limit(time_limit);
options.set_bound(freeze_bound);
options.set_convergence(convergence);
options.set_max_iteration_number(max_iteration_number);
typedef Named_function_parameters<::CGAL::parameters::internal::Lloyd_options, ::CGAL::internal_np::lloyd_options_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param, options);
}
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
Named_function_parameters<::CGAL::parameters::internal::Lloyd_options, ::CGAL::internal_np::lloyd_options_param_t, CGAL_NP_BASE>
lloyd(const CGAL_NP_CLASS& ... nps)
{
return lloyd(::CGAL::internal_np::combine_named_parameters(nps...));
}
inline Named_function_parameters<::CGAL::parameters::internal::Lloyd_options, ::CGAL::internal_np::lloyd_options_param_t, CGAL_NP_BASE>
no_lloyd()
{
typedef Named_function_parameters<::CGAL::parameters::internal::Lloyd_options, ::CGAL::internal_np::lloyd_options_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param, ::CGAL::parameters::internal::Lloyd_options(false));
}
#ifndef CGAL_NO_DEPRECATED_CODE
CGAL_DEPRECATED
inline
Named_function_parameters<::CGAL::parameters::internal::Lloyd_options, ::CGAL::internal_np::lloyd_options_param_t, CGAL_NP_BASE>
lloyd(double time_limit_,
std::size_t max_iteration_number_ = 0,
double convergence_ = 0.02,
double freeze_bound_ = 0.01,
bool do_freeze_= true)
{
return lloyd(time_limit(time_limit_).
max_iteration_number(max_iteration_number_).
convergence(convergence_).
freeze_bound(freeze_bound_).
do_freeze(do_freeze_));
}
#endif
// -----------------------------------
// Manifold options
// -----------------------------------
template<typename CGAL_NP_TEMPLATE_PARAMETERS>
Named_function_parameters<::CGAL::parameters::internal::Manifold_options, ::CGAL::internal_np::manifold_param_t, CGAL_NP_BASE>
manifold_options(const CGAL_NP_CLASS& np = parameters::default_values())
{
using ::CGAL::parameters::choose_parameter;
using ::CGAL::parameters::get_parameter;
int mesh_topology = choose_parameter(get_parameter(np, ::CGAL::internal_np::mesh_topology_number), -1);
::CGAL::parameters::internal::Manifold_options options;
options.mesh_topology = mesh_topology;
typedef Named_function_parameters<::CGAL::parameters::internal::Manifold_options, ::CGAL::internal_np::manifold_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param, options);
}
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
Named_function_parameters<::CGAL::parameters::internal::Manifold_options, ::CGAL::internal_np::manifold_param_t, CGAL_NP_BASE>
manifold_options(const CGAL_NP_CLASS& ... nps)
{
return manifold_options(::CGAL::internal_np::combine_named_parameters(nps...));
}
inline Named_function_parameters<::CGAL::parameters::internal::Manifold_options, ::CGAL::internal_np::manifold_param_t, CGAL_NP_BASE>
manifold()
{
typedef Named_function_parameters<::CGAL::parameters::internal::Manifold_options, ::CGAL::internal_np::manifold_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param, ::CGAL::parameters::internal::Manifold_options(::CGAL::parameters::internal::Manifold_options::MANIFOLD));
}
inline Named_function_parameters<::CGAL::parameters::internal::Manifold_options, ::CGAL::internal_np::manifold_param_t, CGAL_NP_BASE>
manifold_with_boundary()
{
typedef Named_function_parameters<::CGAL::parameters::internal::Manifold_options, ::CGAL::internal_np::manifold_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param,::CGAL::parameters::internal::Manifold_options(
::CGAL::parameters::internal::Manifold_options::MANIFOLD_WITH_BOUNDARY));
}
inline Named_function_parameters<::CGAL::parameters::internal::Manifold_options, ::CGAL::internal_np::manifold_param_t, CGAL_NP_BASE>
non_manifold()
{
typedef Named_function_parameters<::CGAL::parameters::internal::Manifold_options, ::CGAL::internal_np::manifold_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param, ::CGAL::parameters::internal::Manifold_options(::CGAL::parameters::internal::Manifold_options::NON_MANIFOLD));
}
// -----------------------------------
// Mesh options
// -----------------------------------
// Undocumented parameter for refine_mesh_3 and make_mesh_3.
// Allows to dump the mesh at given stage of the mesh generation
// algorithm.
template<typename CGAL_NP_TEMPLATE_PARAMETERS>
Named_function_parameters<::CGAL::parameters::internal::Mesh_3_options, ::CGAL::internal_np::mesh_param_t, CGAL_NP_BASE>
mesh_3_options(const CGAL_NP_CLASS& np = parameters::default_values())
{
using ::CGAL::parameters::choose_parameter;
using ::CGAL::parameters::get_parameter;
::CGAL::parameters::internal::Mesh_3_options options;
options.dump_after_init_prefix=choose_parameter(get_parameter(np, ::CGAL::internal_np::dump_after_init_prefix_param), "");
options.dump_after_refine_surface_prefix=choose_parameter(get_parameter(np, ::CGAL::internal_np::dump_after_refine_surface_prefix_param), "");
options.dump_after_refine_prefix=choose_parameter(get_parameter(np, ::CGAL::internal_np::dump_after_refine_prefix_param), "");
options.dump_after_glob_opt_prefix=choose_parameter(get_parameter(np, ::CGAL::internal_np::dump_after_glob_opt_prefix_param), "");
options.dump_after_perturb_prefix=choose_parameter(get_parameter(np, ::CGAL::internal_np::dump_after_perturb_prefix_param), "");
options.dump_after_exude_prefix=choose_parameter(get_parameter(np, ::CGAL::internal_np::dump_after_refine_surface_prefix_param), "");
options.number_of_initial_points=choose_parameter(get_parameter(np, ::CGAL::internal_np::number_of_initial_points_param), -1);
options.nonlinear_growth_of_balls = choose_parameter(get_parameter(np, ::CGAL::internal_np::nonlinear_growth_of_balls_param), false);
options.maximal_number_of_vertices=choose_parameter(get_parameter(np, ::CGAL::internal_np::maximal_number_of_vertices_param), 0);
options.pointer_to_error_code=choose_parameter(get_parameter(np, ::CGAL::internal_np::pointer_to_error_code_param), ((Mesh_error_code*)0));
#ifndef CGAL_NO_ATOMIC
options.pointer_to_stop_atomic_boolean=choose_parameter(get_parameter(np, ::CGAL::internal_np::pointer_to_stop_atomic_boolean_param),
((::CGAL::parameters::internal::Mesh_3_options::Pointer_to_stop_atomic_boolean_t)0));
#endif
typedef Named_function_parameters<::CGAL::parameters::internal::Mesh_3_options, ::CGAL::internal_np::mesh_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param, options);
}
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
Named_function_parameters<::CGAL::parameters::internal::Mesh_3_options, ::CGAL::internal_np::mesh_param_t, CGAL_NP_BASE>
mesh_3_options(const CGAL_NP_CLASS& ... nps)
{
return mesh_3_options(::CGAL::internal_np::combine_named_parameters(nps...));
}
// Undocumented parameter for refine_mesh_3 and make_mesh_3.
// Default Mesh_3_options: dump at every stage of the mesh generation.
inline
Named_function_parameters<::CGAL::parameters::internal::Mesh_3_options, ::CGAL::internal_np::mesh_param_t, CGAL_NP_BASE>
mesh_3_dump()
{
typedef Named_function_parameters<::CGAL::parameters::internal::Mesh_3_options, ::CGAL::internal_np::mesh_param_t, CGAL_NP_BASE> Param;
::CGAL::parameters::internal::Mesh_3_options options;
options.dump_after_init_prefix = "mesh_dump_after_init";
options.dump_after_refine_surface_prefix = "mesh_dump_after_refine_surface";
options.dump_after_refine_prefix = "mesh_dump_after_refine";
options.dump_after_glob_opt_prefix = "mesh_dump_after_glob_opt";
options.dump_after_perturb_prefix = "mesh_dump_after_perturb";
options.dump_after_exude_prefix = "mesh_dump_after_exude";
return CGAL_NP_BUILD(Param, options);
}
// -----------------------------------
// Features_options
// -----------------------------------
inline Named_function_parameters<::CGAL::parameters::internal::Features_options, ::CGAL::internal_np::features_option_param_t, CGAL_NP_BASE>
features() {
typedef Named_function_parameters<::CGAL::parameters::internal::Features_options, ::CGAL::internal_np::features_option_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param, ::CGAL::parameters::internal::Features_options(true));
}
inline Named_function_parameters<::CGAL::parameters::internal::Features_options, ::CGAL::internal_np::features_option_param_t, CGAL_NP_BASE>
no_features() {
typedef Named_function_parameters<::CGAL::parameters::internal::Features_options, ::CGAL::internal_np::features_option_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param, ::CGAL::parameters::internal::Features_options(false)); }
template < typename MeshDomain >
inline Named_function_parameters<::CGAL::parameters::internal::Features_options, ::CGAL::internal_np::features_option_param_t, CGAL_NP_BASE>
features(const MeshDomain& /*domain*/)
{
typedef typename ::CGAL::parameters::internal::Domain_features_generator<MeshDomain,
CGAL::internal::has_Has_features<MeshDomain>::value > Generator;
typedef Named_function_parameters<::CGAL::parameters::internal::Features_options, ::CGAL::internal_np::features_option_param_t, CGAL_NP_BASE> Param;
return CGAL_NP_BUILD(Param,Generator()());
}