Merge branch 'Mesh_3-add_minimal_size_criterion_new-jtournois' into Mesh_3-min_size-jtournois

This commit is contained in:
Jane Tournois 2023-04-24 12:56:40 +01:00
commit e30ccd2cc5
20 changed files with 609 additions and 135 deletions

1
.gitignore vendored
View File

@ -1212,3 +1212,4 @@ gmon.*
Polygonal_surface_reconstruction/examples/build*
Polygonal_surface_reconstruction/test/build*
Solver_interface/examples/build*
/Mesh_3/examples/Mesh_3/indicator_0.inr.gz

View File

@ -104,6 +104,7 @@ extracted from labeled images.
### [3D Mesh Generation](https://doc.cgal.org/5.6/Manual/packages.html#PkgMesh3)
- Deprecated usage of boost parameters in favor of function named parameters.
- Added new meshing criteria `facet_min_size` and `cell_min_size` to prevent Delaunay refinement from creating simplices smaller than the prescribed bound.
### [3D Periodic Mesh Generation](https://doc.cgal.org/5.6/Manual/packages.html#PkgPeriodic3Mesh3)
- Deprecated usage of boost parameters in favor of function named parameters.

View File

@ -37,15 +37,21 @@ typedef Tr::FT FT;
/// @{
/*!
Returns an object to serve as default criteria for cells. The argument
`radius_edge_bound` is the upper bound for the radius-edge ratio
of the tetrahedra. The argument `radius_bound` is a uniform upper bound
for the circumradii of the tetrahedra in the mesh. See
section \ref introsecparam for further details.
Note that if one parameter is set to 0, then its corresponding criteria is ignored.
* Returns an object to serve as default criteria for cells.
* @param radius_edge_bound is the upper bound for the radius-edge ratio
* of the tetrahedra.
* @param radius_bound is a uniform upper bound
* for the circumradii of the tetrahedra in the mesh. See
* section \ref introsecparam for further details.
* @param min_radius_bound is a uniform lower bound for the
* circumradii of the tetrahedra in the mesh.
* Only cells with a circumradius larger than that
* bound will be refined.
* Note that if one parameter is set to 0, then its corresponding criteria is ignored.
*/
Mesh_cell_criteria_3(const FT& radius_edge_bound,
const FT& radius_bound);
const FT& radius_bound,
const FT& min_radius_bound = 0.);
/*!
Returns an object to serve as default criteria for facets. The type `SizingField` must
@ -54,7 +60,8 @@ as above, except that the radius bound parameter is a functional instead of a co
*/
template<class SizingField>
Mesh_cell_criteria_3(const FT& radius_edge_bound,
const SizingField& radius_bound);
const SizingField& radius_bound,
const FT& min_radius_bound = 0.);
/// @}

View File

@ -53,11 +53,15 @@ of the surface mesh facets.
which have to be verified by each surface facet. See
section \ref Mesh_3DelaunayRefinement for further details.
Note that if one parameter is set to 0, then its corresponding criteria is ignored.
\param min_radius_bound is a uniform lower bound for the radius of
the surface Delaunay balls. Only facets with a radius larger than that
bound will be refined.
*/
Mesh_facet_criteria_3(const FT& angle_bound,
const FT& radius_bound,
const FT& distance_bound,
Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE);
Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE,
const FT& min_radius_bound = 0.);
/*!
Returns an object to serve as criteria for facets. The types `SizingField` and
@ -69,7 +73,8 @@ as above, except that the radius and distance bound parameters are functionals i
Mesh_facet_criteria_3(const FT& angle_bound,
const SizingField& radius_bound,
const DistanceField& distance_bound,
Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE);
Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE,
const FT& min_radius_bound = 0.);
/// @}

View File

@ -164,7 +164,7 @@ if(TARGET CGAL::CGAL_ImageIO)
target_link_libraries(mesh_3D_image_variable_size
PUBLIC CGAL::Eigen3_support)
find_package(ITK QUIET COMPONENTS ITKCommon ITKThresholding ITKSmoothing ITKImageIntensity)
find_package(ITK NAMES ITK InsightToolkit QUIET COMPONENTS ITKCommon ITKThresholding ITKSmoothing ITKImageIntensity)
if(ITK_FOUND)
include(CGAL_ITK_support)
create_single_source_cgal_program("mesh_3D_weighted_image.cpp")

View File

@ -142,12 +142,20 @@ class Cell_uniform_size_criterion
public:
// Constructor
Cell_uniform_size_criterion(const FT& radius_bound)
: sq_radius_bound_(radius_bound*radius_bound) {}
Cell_uniform_size_criterion(const FT& radius_bound,
const bool is_lower_bound = false)
: sq_radius_bound_(radius_bound*radius_bound)
, is_lower_bound_(is_lower_bound)
{}
// Destructor
~Cell_uniform_size_criterion() {}
bool is_lower_bound() const
{
return is_lower_bound_;
}
protected:
virtual void do_accept(Visitor_& v) const
{
@ -182,11 +190,19 @@ protected:
const FT size = sq_radius(p, q, r, s);
if ( size > sq_radius_bound_ )
if (!is_lower_bound() && size > sq_radius_bound_ )
{
#ifdef CGAL_MESH_3_DEBUG_CELL_CRITERIA
std::cerr << "bad cell " << (void*)(ch.operator->()) << " (radius bound): size[" << size
<< "] bound[" << sq_radius_bound_ << "]\n" ;
#endif
return Is_bad(Quality(sq_radius_bound_/ size));
}
else if(is_lower_bound() && size <= sq_radius_bound_)
{
#ifdef CGAL_MESH_3_DEBUG_FACET_CRITERIA
std::cerr << "Cell too small (uniform size): sq_radius[" << size
<< "] bound[" << B_ << "]\n";
#endif
return Is_bad(Quality(sq_radius_bound_/size));
}
@ -196,6 +212,7 @@ protected:
private:
FT sq_radius_bound_;
const bool is_lower_bound_;
}; // end class Cell_uniform_size_criterion
@ -378,11 +395,6 @@ class Cell_criteria_visitor_with_features
typedef Criterion_visitor<Tr, typename Tr::Cell_handle> Base;
typedef Cell_criteria_visitor_with_features<Tr> Self;
typedef Abstract_criterion<Tr, Self> Criterion;
typedef Mesh_3::Cell_size_criterion<Tr, Self> Cell_size_criterion;
typedef Mesh_3::Cell_radius_edge_criterion<Tr, Self> Cell_radius_edge_criterion;
typedef typename Tr::Geom_traits Gt;
typedef typename Gt::FT FT;
typedef typename Tr::Weighted_point Weighted_point;
@ -501,7 +513,8 @@ public:
~Cell_criteria_visitor_with_features() {}
// visit functions
void visit(const Cell_size_criterion& criterion)
template<typename T, typename V>
void visit(const Mesh_3::Cell_size_criterion<T,V>& criterion)
{
if ( ratio_ < size_ratio_
&& (do_spheres_intersect_ || 1 == wp_nb_) )
@ -513,7 +526,8 @@ public:
Base::do_visit(criterion);
}
void visit(const Cell_radius_edge_criterion& criterion)
template<typename T, typename V>
void visit(const Mesh_3::Cell_radius_edge_criterion<T,V>& criterion)
{
if ( (wp_nb_ >= 2 && do_spheres_intersect_)
|| 1 == wp_nb_ )
@ -525,7 +539,8 @@ public:
Base::do_visit(criterion);
}
void visit(const Criterion& criterion)
template<typename T, typename V>
void visit(const Abstract_criterion<T,V>& criterion)
{
Base::do_visit(criterion);
}
@ -535,9 +550,74 @@ private:
bool do_spheres_intersect_;
FT ratio_;
FT size_ratio_;
}; // end class Cell_criterion_visitor
}; // end class Cell_criteria_visitor_with_features
template<typename Tr>
class Cell_criterion_visitor_with_radius_lower_bound
: public Cell_criteria_visitor_with_features<Tr>
{
typedef Cell_criteria_visitor_with_features<Tr> Base;
typedef Cell_criterion_visitor_with_radius_lower_bound<Tr> Self;
typedef typename Tr::Geom_traits Gt;
typedef typename Gt::FT FT;
public:
typedef typename Base::Quality Cell_quality;
typedef typename Base::Is_bad Is_cell_bad;
typedef typename Base::Handle Handle;
typedef Handle Cell_handle;
// Constructor
Cell_criterion_visitor_with_radius_lower_bound(const Tr& tr,
const Cell_handle& ch)
: Base(tr, ch)
, dont_go_further_(false)
{}
Is_cell_bad is_bad() const
{
if (dont_go_further_)
return Is_cell_bad();
else
return Base::is_bad();
}
bool go_further() const
{
if (dont_go_further_)
return false;
else
return Base::go_further();
}
// visit functions
template<typename Criterion>
void visit(const Criterion& criterion)
{
Base::visit(criterion);
}
template<typename T, typename V>
void visit(const Mesh_3::Abstract_criterion<T, V>& criterion)
{
Base::visit(criterion);
}
template<typename T, typename V>
void visit(const Mesh_3::Cell_uniform_size_criterion<T, V>& criterion)
{
Base::visit(criterion);
if (criterion.is_lower_bound() && Base::is_bad())
dont_go_further_ = true;
}
private:
bool dont_go_further_;
};// end class Cell_criterion_visitor_with_radius_lower_bound
} // end namespace Mesh_3

View File

@ -398,7 +398,16 @@ private:
public:
// Nb: the default bound of the criterion is such that the criterion
// is always fulfilled
Uniform_size_criterion(const FT b = 1e20) : B_(b * b) {}
Uniform_size_criterion(const FT b = 1e20,
const bool is_lower_bound = false)
: B_(b * b)
, is_lower_bound_(is_lower_bound)
{}
bool is_lower_bound() const
{
return is_lower_bound_;
}
protected:
virtual void do_accept(Visitor_& v) const
@ -429,11 +438,19 @@ protected:
const FT sq_radius = tr.min_squared_distance(p1, ball_center);
if ( sq_radius > B_ )
if (!is_lower_bound() && sq_radius > B_ )
{
#ifdef CGAL_MESH_3_DEBUG_FACET_CRITERIA
std::cerr << "Bad facet (uniform size): sq_radius[" << sq_radius
<< "] bound[" << B_ << "]\n";
#endif
return Is_bad(Quality(B_/sq_radius));
}
else if(is_lower_bound() && sq_radius <= B_)
{
#ifdef CGAL_MESH_3_DEBUG_FACET_CRITERIA
std::cerr << "Facet too small (uniform size): sq_radius[" << sq_radius
<< "] bound[" << B_ << "]\n";
#endif
return Is_bad(Quality(B_/sq_radius));
}
@ -443,6 +460,7 @@ protected:
private:
FT B_;
const bool is_lower_bound_;
}; // end Uniform_size_criterion
@ -635,13 +653,6 @@ class Facet_criterion_visitor_with_features
typedef Mesh_3::Criterion_visitor<Tr, typename Tr::Facet> Base;
typedef Facet_criterion_visitor_with_features<Tr> Self;
typedef Mesh_3::Abstract_criterion<Tr, Self> Criterion;
typedef Mesh_3::Curvature_size_criterion<Tr, Self> Curvature_size_criterion;
typedef Mesh_3::Aspect_ratio_criterion<Tr, Self> Aspect_ratio_criterion;
typedef Mesh_3::Facet_on_surface_criterion<Tr, Self> Facet_on_surface_criterion;
typedef Mesh_3::Facet_size_criterion<Tr, Self> Facet_size_criterion;
typedef Mesh_3::Facet_on_same_surface_criterion<Tr, Self> Facet_on_same_surface_criterion;
typedef typename Tr::Geom_traits Gt;
typedef typename Gt::FT FT;
@ -736,11 +747,9 @@ public:
}
}
// Destructor
~Facet_criterion_visitor_with_features() {}
// visit functions
void visit(const Criterion& criterion)
template<typename T, typename V>
void visit(const Mesh_3::Abstract_criterion<T, V>& criterion)
{
if ( 3 == wp_nb_ && do_spheres_intersect_ )
{
@ -751,7 +760,8 @@ public:
Base::do_visit(criterion);
}
void visit(const Curvature_size_criterion& criterion)
template<typename T, typename V>
void visit(const Mesh_3::Curvature_size_criterion<T, V>& criterion)
{
if ( ratio_ < approx_ratio_
&& (do_spheres_intersect_ || 1 == wp_nb_ ) )
@ -763,7 +773,8 @@ public:
Base::do_visit(criterion);
}
void visit(const Aspect_ratio_criterion& criterion)
template<typename T, typename V>
void visit(const Mesh_3::Aspect_ratio_criterion<T, V>& criterion)
{
if ( ratio_ < angle_ratio_
&& (do_spheres_intersect_ || 1 == wp_nb_) )
@ -775,7 +786,8 @@ public:
Base::do_visit(criterion);
}
void visit(const Facet_size_criterion& criterion)
template<typename T, typename V>
void visit(const Mesh_3::Facet_size_criterion<T, V>& criterion)
{
if ( ratio_ < size_ratio_
&& (do_spheres_intersect_ || 1 == wp_nb_) )
@ -798,6 +810,74 @@ private:
}; // end class Facet_criterion_visitor
template <typename Tr>
class Facet_criterion_visitor_with_radius_lower_bound
: public Facet_criterion_visitor_with_features<Tr>
{
typedef Facet_criterion_visitor_with_features<Tr> Base;
typedef Facet_criterion_visitor_with_radius_lower_bound<Tr> Self;
typedef typename Tr::Geom_traits Gt;
typedef typename Gt::FT FT;
public:
typedef typename Base::Quality Facet_quality;
typedef typename Base::Is_bad Is_facet_bad;
typedef typename Base::Handle Handle;
typedef Handle Facet;
// Constructor
Facet_criterion_visitor_with_radius_lower_bound(const Tr& tr, const Facet& fh)
: Base(tr, fh)
, dont_go_further_(false)
{}
Is_facet_bad is_bad() const
{
if (dont_go_further_)
return Is_facet_bad();
else
return Base::is_bad();
}
bool go_further() const
{
if (dont_go_further_)
return false;
else
return Base::go_further();
}
// visit functions
template<typename Criterion>
void visit(const Criterion& criterion)
{
Base::visit(criterion);
}
template<typename T, typename V>
void visit(const Mesh_3::Abstract_criterion<T, V>& criterion)
{
Base::visit(criterion);
}
template<typename T, typename V>
void visit(const Mesh_3::Uniform_size_criterion<T, V>& criterion)
{
Base::visit(criterion);
if (criterion.is_lower_bound() && Base::is_bad())
dont_go_further_ = true;
}
private:
bool dont_go_further_;
};// end class Facet_criterion_visitor_with_radius_lower_bound
} // end namespace Mesh_3
} // end namespace CGAL

View File

@ -28,7 +28,7 @@
namespace CGAL {
template <typename Tr,
typename Visitor_ = Mesh_3::Cell_criteria_visitor_with_features<Tr> >
typename Visitor_ = Mesh_3::Cell_criterion_visitor_with_radius_lower_bound<Tr> >
class Mesh_cell_criteria_3
{
public:
@ -53,8 +53,12 @@ public:
* @param radius_bound the radius bound (tet sizing)
*/
Mesh_cell_criteria_3(const FT& radius_edge_bound,
const FT& radius_bound)
const FT& radius_bound,
const FT& min_radius_bound = 0.)
{
if (FT(0) != min_radius_bound)
init_min_radius(min_radius_bound);
if ( FT(0) != radius_bound )
init_radius(radius_bound);
@ -67,11 +71,15 @@ public:
template <typename Sizing_field>
Mesh_cell_criteria_3(const FT& radius_edge_bound,
const Sizing_field& radius_bound,
const FT& min_radius_bound = 0.,
std::enable_if_t<
Mesh_3::Is_mesh_domain_field_3<Tr,Sizing_field>::value
>* = 0
)
{
if (FT(0) != min_radius_bound)
init_min_radius(min_radius_bound);
init_radius(radius_bound);
if ( FT(0) != radius_edge_bound )
@ -118,6 +126,13 @@ private:
criteria_.add(new Radius_criterion(radius_bound));
}
void init_min_radius(const FT& min_radius_bound)
{
typedef Mesh_3::Cell_uniform_size_criterion<Tr, Visitor> Radius_criterion;
criteria_.add(new Radius_criterion(min_radius_bound, true/*lower bound*/));
}
private:
Criteria criteria_;

View File

@ -78,12 +78,14 @@ public:
parameters::choose_parameter(parameters::get_parameter_reference(np, internal_np::facet_sizing_field_param),
parameters::choose_parameter(parameters::get_parameter(np, internal_np::sizing_field_param), FT(0)))),
parameters::choose_parameter(parameters::get_parameter_reference(np, internal_np::facet_distance_param), FT(0)),
parameters::choose_parameter(parameters::get_parameter(np, internal_np::facet_topology_param), CGAL::FACET_VERTICES_ON_SURFACE)),
parameters::choose_parameter(parameters::get_parameter(np, internal_np::facet_topology_param), CGAL::FACET_VERTICES_ON_SURFACE),
parameters::choose_parameter(parameters::get_parameter(np, internal_np::facet_min_size_param), FT(0))),
cell_criteria_(parameters::choose_parameter(parameters::get_parameter(np, internal_np::cell_radius_edge_ratio_param),
parameters::choose_parameter(parameters::get_parameter(np, internal_np::cell_radius_edge_param), FT(0))),
parameters::choose_parameter(parameters::get_parameter(np, internal_np::cell_size_param),
parameters::choose_parameter(parameters::get_parameter_reference(np, internal_np::cell_sizing_field_param),
parameters::choose_parameter(parameters::get_parameter_reference(np, internal_np::sizing_field_param), FT(0)))))
parameters::choose_parameter(parameters::get_parameter_reference(np, internal_np::sizing_field_param), FT(0)))),
parameters::choose_parameter(parameters::get_parameter(np, internal_np::cell_min_size_param), FT(0)))
{ }
#ifndef CGAL_NO_DEPRECATED_CODE
@ -261,6 +263,12 @@ typedef Mesh_cell_criteria_3<Tr> Cell_criteria;
* \cgalParamDescription{a scalar field (resp. a constant) describing
* a space varying (resp. a uniform) upper-bound or for the radii of the surface Delaunay balls.}
* \cgalParamNEnd
* \cgalParamNBegin{facet_min_size}
* \cgalParamDescription{a constant describing a uniform lower-bound for the radii of the surface Delaunay balls.
* Only facets with a radius larger than this bound will be refined.
* If a facet is too small with respect to this criterion,
* it will not be refined whether the other criteria are met or not.}
* \cgalParamNEnd
* \cgalParamNBegin{facet_distance}
* \cgalParamDescription{a scalar field (resp. a constant) describing a space varying (resp. a uniform)
* upper bound for the distance between the facet circumcenter and the center of its surface
@ -279,6 +287,13 @@ typedef Mesh_cell_criteria_3<Tr> Cell_criteria;
* \cgalParamDescription{ a scalar field (resp. a constant) describing
* a space varying (resp. a uniform) upper-bound for the circumradii of the mesh tetrahedra.}
* \cgalParamNEnd
* \cgalParamNBegin{cell_min_size}
* \cgalParamDescription{ a constant describing a uniform lower-bound for the radii of the circumradii
* of the mesh tetrahedra.
* Only tetrahedra with a circumradius larger than this bound will be refined.
* If a cell is too small with respect to this criterion,
* it will not be refined whether the other criteria are met or not.}
* \cgalParamNEnd
* \cgalNamedParamsEnd
*/
template<typename CGAL_NP_TEMPLATE_PARAMETERS>

View File

@ -28,7 +28,7 @@
namespace CGAL {
template<typename Tr,
typename Visitor_ = Mesh_3::Facet_criterion_visitor_with_features<Tr> >
typename Visitor_ = Mesh_3::Facet_criterion_visitor_with_radius_lower_bound<Tr> >
class Mesh_facet_criteria_3
{
public:
@ -55,9 +55,12 @@ public:
Mesh_facet_criteria_3(const FT& angle_bound,
const Sizing_field & radius_bound,
const Sizing_field2& distance_bound,
const Mesh_facet_topology topology =
FACET_VERTICES_ON_SURFACE)
const Mesh_facet_topology topology = FACET_VERTICES_ON_SURFACE,
const FT& min_radius_bound = 0.)
{
if (FT(0) != min_radius_bound)
init_min_radius(min_radius_bound);
if ( FT(0) != angle_bound )
init_aspect(angle_bound);
@ -113,6 +116,12 @@ private:
criteria_.add(new Variable_size_criterion(radius_bound));
}
void init_min_radius(const FT& min_radius_bound)
{
typedef Mesh_3::Uniform_size_criterion<Tr, Visitor> Uniform_size_criterion;
criteria_.add(new Uniform_size_criterion(min_radius_bound, true/*lower bound*/));
}
void init_distance(const FT& distance_bound, Tag_false)
{
if(FT(0) == distance_bound) return;

View File

@ -34,6 +34,7 @@ if(CGAL_ImageIO_USE_ZLIB)
create_single_source_cgal_program( "test_meshing_3D_image_with_features.cpp" )
create_single_source_cgal_program( "test_meshing_3D_gray_image.cpp" )
create_single_source_cgal_program( "test_meshing_3D_gray_image_deprecated.cpp" )
create_single_source_cgal_program( "test_min_size_criteria.cpp")
else()
message(STATUS "NOTICE: The test 'test_meshing_3D_image' requires the ZLIB library, and will not be compiled.")
endif()
@ -82,7 +83,9 @@ foreach(target
test_mesh_3_issue_1554
test_mesh_polyhedral_domain_with_features_deprecated
test_mesh_cell_base_3
test_meshing_with_one_step.cpp)
test_meshing_with_one_step
test_min_size_criteria
)
if(TARGET ${target})
target_link_libraries(${target} PUBLIC CGAL::Eigen3_support)
endif()
@ -105,6 +108,7 @@ if(TARGET CGAL::TBB_support)
test_mesh_3_issue_1554
test_mesh_polyhedral_domain_with_features_deprecated
test_mesh_cell_base_3
test_min_size_criteria
)
if(TARGET ${target})
target_link_libraries(${target} PUBLIC CGAL::TBB_support)

View File

@ -141,12 +141,15 @@ int main()
Mc fc10(facet_angle = 10.1,
facet_distance = 10.2,
facet_size = 10.3,
facet_min_size = 0.2,
facet_sizing_field = Fsf(10.4),
sizing_field = 10.5);
// Test construction from int
Mc fc11(facet_size = 11);
Mc fc11b(facet_size = 11, facet_min_size = 1);
Mc fc12(facet_sizing_field = 12);
Mc fc12b(facet_sizing_field = 12, facet_min_size = 2);
Mc fc13(sizing_field = 13);
// Test topological criterion creation
@ -197,11 +200,14 @@ int main()
sizing_field = Csf(9.2) );
Mc cc10(cell_radius_edge_ratio = 10.1,
cell_size = 10.2,
cell_min_size = 0.1,
cell_sizing_field = Csf(10.3),
sizing_field = 10.4);
// Test construction from int
Mc cc11(cell_size = 11);
Mc cc11b(cell_size = 11, cell_min_size = 1);
Mc cc12(cell_sizing_field = 12);
Mc cc12b(cell_sizing_field = 12, cell_min_size = 2);
Mc cc13(sizing_field = 13);
}

View File

@ -0,0 +1,148 @@
// Copyright (c) 2009 INRIA Sophia-Antipolis (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org).
//
// $URL$
// $Id$
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
//
// Author(s) : Jane Tournois
//
//******************************************************************************
// File Description :
//
//******************************************************************************
#include "test_meshing_utilities.h"
#include <CGAL/Image_3.h>
#include <CGAL/Labeled_mesh_domain_3.h>
#include <CGAL/use.h>
#include <CGAL/Mesh_criteria_3.h>
template <typename Concurrency_tag = CGAL::Sequential_tag>
struct Image_tester : public Tester<K_e_i>
{
public:
void image() const
{
using Image = CGAL::Image_3;
using Mesh_domain = CGAL::Labeled_mesh_domain_3<K_e_i>;
using Tr = typename CGAL::Mesh_triangulation_3<
Mesh_domain,
CGAL::Kernel_traits<Mesh_domain>::Kernel,
Concurrency_tag>::type;
using C3t3 = CGAL::Mesh_complex_3_in_triangulation_3<Tr>;
using Gt = typename Tr::Geom_traits;
using FT = typename Tr::Geom_traits::FT;
using Bare_point = typename Tr::Bare_point;
using Mesh_criteria = CGAL::Mesh_criteria_3<Tr>;
using Facet_criteria = typename Mesh_criteria::Facet_criteria;
using Cell_criteria = typename Mesh_criteria::Cell_criteria;
//-------------------------------------------------------
// Data generation
//-------------------------------------------------------
Image image;
image.read(CGAL::data_file_path("images/liver.inr.gz"));
std::cout << "\tSeed is\t"
<< CGAL::get_default_random().get_seed() << std::endl;
Mesh_domain domain = Mesh_domain::create_labeled_image_mesh_domain
(image,
CGAL::parameters::relative_error_bound = 1e-9,
CGAL::parameters::p_rng = &CGAL::get_default_random());
// Set mesh criteria
const double fangle = 25;
const double fsize = 20 * image.vx();
const double fapprox = image.vx();
const CGAL::Mesh_facet_topology ftopo = CGAL::FACET_VERTICES_ON_SURFACE;
const double fminsize = 0.5 * image.vx();
const double cshape = 4.;
const double csize = 25 * image.vx();
const double cminsize = 0.5 * image.vx();
Facet_criteria facet_criteria(fangle, fsize, fapprox, ftopo, fminsize);
Cell_criteria cell_criteria(cshape, csize, cminsize);
Mesh_criteria criteria(facet_criteria, cell_criteria);
// Mesh generation
C3t3 c3t3 = CGAL::make_mesh_3<C3t3>(domain, criteria,
CGAL::parameters::no_exude(),
CGAL::parameters::no_perturb());
const Tr& tr = c3t3.triangulation();
typename Gt::Construct_point_3 cp = tr.geom_traits().construct_point_3_object();
typename Gt::Compute_squared_radius_3 sq_radius = tr.geom_traits().compute_squared_radius_3_object();
double max_sq_facet_radius = 0.;
double max_sq_cell_radius = 0.;
for (auto f : c3t3.facets_in_complex())
{
const Bare_point p1 = cp(tr.point(f.first, (f.second + 1) & 3));
const Bare_point& ball_center = f.first->get_facet_surface_center(f.second);
const FT sqr = tr.min_squared_distance(p1, ball_center);
max_sq_facet_radius = (std::max)(max_sq_facet_radius, sqr);
}
for (auto c : c3t3.cells_in_complex())
{
const Bare_point& p = cp(tr.point(c, 0));
const Bare_point& q = cp(tr.point(c, 1));
const Bare_point& r = cp(tr.point(c, 2));
const Bare_point& s = cp(tr.point(c, 3));
const FT sqr = sq_radius(p, q, r, s);
max_sq_cell_radius = (std::max)(max_sq_cell_radius, sqr);
}
const std::size_t nbv = c3t3.triangulation().number_of_vertices();
std::cout << "C3t3 initial = " << nbv << std::endl;
//new criteria with really small facet_size and cell_size
//compared to actual elements size
const double c3t3_fsize = CGAL::approximate_sqrt(max_sq_facet_radius);
const double c3t3_csize = CGAL::approximate_sqrt(max_sq_cell_radius);
//use the other construction API
Mesh_criteria new_criteria(CGAL::parameters::facet_size = 0.01 * c3t3_fsize,
CGAL::parameters::facet_min_size = 1.00001 * c3t3_fsize,
CGAL::parameters::cell_size = 0.01 * c3t3_csize,
CGAL::parameters::cell_min_size = 1.00001 * c3t3_csize);
CGAL::refine_mesh_3(c3t3, domain, new_criteria,
CGAL::parameters::no_perturb(),
CGAL::parameters::no_exude());
const std::size_t nbv2 = c3t3.triangulation().number_of_vertices();
std::cout << "C3t3 after refinement = " << nbv2 << std::endl;
assert(nbv == nbv2);
}
};
int main()
{
Image_tester<> test_epic;
std::cerr << "Mesh generation from a 3D image:\n";
test_epic.image();
#ifdef CGAL_LINKED_WITH_TBB
Image_tester<CGAL::Parallel_tag> test_epic_p;
std::cerr << "Parallel mesh generation from a 3D image:\n";
test_epic_p.image();
#endif
return EXIT_SUCCESS;
}

View File

@ -28,7 +28,7 @@ target_link_libraries(
${OPENGL_gl_LIBRARY})
target_include_directories(mesh_3_plugin PRIVATE include)
find_package(ITK QUIET COMPONENTS ITKCommon ITKThresholding ITKSmoothing ITKImageIntensity)
find_package(ITK NAMES ITK InsightToolkit QUIET COMPONENTS ITKCommon ITKThresholding ITKSmoothing ITKImageIntensity)
if(ITK_FOUND)
include(CGAL_ITK_support)
target_link_libraries(mesh_3_plugin PUBLIC CGAL::ITK_support)

View File

@ -203,7 +203,9 @@ private:
int approx_decimals;
double edges_sizing;
double facets_sizing;
double facets_min_sizing;
double tets_sizing;
double tets_min_sizing;
double tets_shape;
bool manifold_criterion;
CGAL::Mesh_facet_topology facet_topology;
@ -421,6 +423,8 @@ void Mesh_3_plugin::set_defaults() {
facets_sizing = get_approximate(diag * 0.05, 2, sizing_decimals);
edges_sizing = facets_sizing;
tets_sizing = facets_sizing;
facets_min_sizing = 0.1 * facets_sizing;
tets_min_sizing = 0.1 * tets_sizing;
angle = 25.;
sharp_edges_angle_bound = 60.;
approx = get_approximate(diag * 0.005, 2, approx_decimals);
@ -491,6 +495,11 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
ui.facetSizing,
SLOT(setEnabled(bool)));
connect(ui.noFacetMinSizing,
SIGNAL(toggled(bool)),
ui.facetMinSizing,
SLOT(setEnabled(bool)));
connect(
ui.noAngle, SIGNAL(toggled(bool)), ui.facetAngle, SLOT(setEnabled(bool)));
@ -499,6 +508,11 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
ui.tetSizing,
SLOT(setEnabled(bool)));
connect(ui.noTetMinSizing,
SIGNAL(toggled(bool)),
ui.tetMinSizing,
SLOT(setEnabled(bool)));
connect(ui.noTetShape,
SIGNAL(toggled(bool)),
ui.tetShape,
@ -556,11 +570,13 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
ui.facetSizing->setRange(diag * 10e-6, // min
diag); // max
ui.facetSizing->setValue(facets_sizing);
ui.facetMinSizing->setValue(facets_min_sizing);
ui.edgeSizing->setValue(edges_sizing);
ui.tetSizing->setRange(diag * 10e-6, // min
diag); // max
ui.tetSizing->setValue(tets_sizing); // default value
ui.tetMinSizing->setValue(tets_min_sizing);
ui.approx->setRange(diag * 10e-7, // min
diag); // max
@ -662,9 +678,11 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
edges_sizing =
!ui.noEdgeSizing->isChecked() ? DBL_MAX : ui.edgeSizing->value();
facets_sizing = !ui.noFacetSizing->isChecked() ? 0 : ui.facetSizing->value();
facets_min_sizing = !ui.noFacetMinSizing->isChecked() ? 0 : ui.facetMinSizing->value();
approx = !ui.noApprox->isChecked() ? 0 : ui.approx->value();
tets_shape = !ui.noTetShape->isChecked() ? 0 : ui.tetShape->value();
tets_sizing = !ui.noTetSizing->isChecked() ? 0 : ui.tetSizing->value();
tets_min_sizing = !ui.noTetMinSizing->isChecked() ? 0 : ui.tetMinSizing->value();
const int pe_ci = ui.protectEdges->currentIndex();
protect_borders = ui.protect->isChecked()
@ -739,8 +757,10 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
item_name,
angle,
facets_sizing,
facets_min_sizing,
approx,
tets_sizing,
tets_min_sizing,
edges_sizing,
tets_shape,
protect_features,
@ -757,8 +777,10 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
item_name,
angle,
facets_sizing,
facets_min_sizing,
approx,
tets_sizing,
tets_min_sizing,
edges_sizing,
tets_shape,
protect_features,
@ -781,8 +803,10 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
thread = cgal_code_mesh_3(pFunction,
angle,
facets_sizing,
facets_min_sizing,
approx,
tets_sizing,
tets_min_sizing,
edges_sizing,
tets_shape,
manifold,
@ -821,8 +845,10 @@ void Mesh_3_plugin::mesh_3(const Mesh_type mesh_type,
(img_polylines_item == nullptr) ? plc : img_polylines_item->polylines,
angle,
facets_sizing,
facets_min_sizing,
approx,
tets_sizing,
tets_min_sizing,
edges_sizing,
tets_shape,
protect_features,

View File

@ -39,8 +39,10 @@ Meshing_thread* cgal_code_mesh_3(QList<const SMesh*> pMeshes,
QString filename,
const double facet_angle,
const double facet_sizing,
const double facet_min_sizing,
const double facet_approx,
const double tet_sizing,
const double tet_min_sizing,
const double edge_size,
const double tet_shape,
bool protect_features,
@ -120,6 +122,8 @@ Meshing_thread* cgal_code_mesh_3(QList<const SMesh*> pMeshes,
param.facet_sizing = facet_sizing;
param.facet_approx = facet_approx;
param.tet_sizing = tet_sizing;
param.facet_min_sizing = facet_min_sizing;
param.tet_min_sizing = tet_min_sizing;
param.tet_shape = tet_shape;
param.edge_sizing = edge_size;
param.manifold = manifold;
@ -138,8 +142,10 @@ Meshing_thread* cgal_code_mesh_3(const QList<const SMesh*> pMeshes,
QString filename,
const double facet_angle,
const double facet_sizing,
const double facet_min_sizing,
const double facet_approx,
const double tet_sizing,
const double tet_min_sizing,
const double edge_size,
const double tet_shape,
bool protect_features,
@ -214,6 +220,8 @@ Meshing_thread* cgal_code_mesh_3(const QList<const SMesh*> pMeshes,
param.facet_sizing = facet_sizing;
param.facet_approx = facet_approx;
param.tet_sizing = tet_sizing;
param.facet_min_sizing = facet_min_sizing;
param.tet_min_sizing = tet_min_sizing;
param.tet_shape = tet_shape;
param.edge_sizing = edge_size;
param.manifold = manifold;
@ -233,8 +241,10 @@ Meshing_thread* cgal_code_mesh_3(const QList<const SMesh*> pMeshes,
Meshing_thread* cgal_code_mesh_3(const Implicit_function_interface* pfunction,
const double facet_angle,
const double facet_sizing,
const double facet_min_sizing,
const double facet_approx,
const double tet_sizing,
const double tet_min_sizing,
const double edge_size,
const double tet_shape,
const int manifold,
@ -261,8 +271,10 @@ Meshing_thread* cgal_code_mesh_3(const Implicit_function_interface* pfunction,
param.protect_features = false;
param.facet_angle = facet_angle;
param.facet_sizing = facet_sizing;
param.facet_min_sizing = facet_min_sizing;
param.facet_approx = facet_approx;
param.tet_sizing = tet_sizing;
param.tet_min_sizing = tet_min_sizing;
param.tet_shape = tet_shape;
param.edge_sizing = edge_size;
param.manifold = manifold;
@ -289,8 +301,10 @@ Meshing_thread* cgal_code_mesh_3(const Image* pImage,
const Polylines_container& polylines,
const double facet_angle,
const double facet_sizing,
const double facet_min_sizing,
const double facet_approx,
const double tet_sizing,
const double tet_min_sizing,
const double edge_size,
const double tet_shape,
bool protect_features, //detect_polylines
@ -312,8 +326,12 @@ Meshing_thread* cgal_code_mesh_3(const Image* pImage,
param.detect_connected_components = detect_connected_components;
param.facet_angle = facet_angle;
param.facet_sizing = facet_sizing;
param.facet_min_sizing = facet_min_sizing;
param.facet_approx = facet_approx;
param.tet_sizing = tet_sizing;
param.tet_min_sizing = tet_min_sizing;
param.facet_min_sizing = facet_min_sizing;
param.tet_min_sizing = tet_min_sizing;
param.edge_sizing = edge_size;
param.tet_shape = tet_shape;
param.manifold = manifold;

View File

@ -26,8 +26,10 @@ Meshing_thread* cgal_code_mesh_3(QList<const SMesh*> pMeshes,
QString filename,
const double facet_angle,
const double facet_sizing,
const double facet_min_sizing,
const double facet_approx,
const double tet_sizing,
const double tet_min_sizing,
const double edge_size,
const double tet_shape,
bool protect_features,
@ -41,8 +43,10 @@ Meshing_thread* cgal_code_mesh_3(const QList<const SMesh*> pMeshes,
QString filename,
const double facet_angle,
const double facet_sizing,
const double facet_min_sizing,
const double facet_approx,
const double tet_sizing,
const double tet_min_sizing,
const double edge_size,
const double tet_shape,
bool protect_features,
@ -55,8 +59,10 @@ Meshing_thread* cgal_code_mesh_3(const QList<const SMesh*> pMeshes,
Meshing_thread* cgal_code_mesh_3(const Implicit_function_interface* pfunction,
const double facet_angle,
const double facet_sizing,
const double facet_min_sizing,
const double facet_approx,
const double tet_sizing,
const double tet_min_sizing,
const double edge_size,
const double tet_shape,
const int manifold,
@ -68,8 +74,10 @@ Meshing_thread* cgal_code_mesh_3(const CGAL::Image_3* pImage,
const Polylines_container& polylines,
const double facet_angle,
const double facet_sizing,
const double facet_min_sizing,
const double facet_approx,
const double tet_sizing,
const double tet_min_sizing,
const double edge_size,
const double tet_shape,
bool protect_features,

View File

@ -44,10 +44,12 @@ struct Mesh_parameters
{
double facet_angle;
double facet_sizing;
double facet_min_sizing;
double facet_approx;
double tet_shape;
double tet_sizing;
double tet_min_sizing;
double edge_sizing;
bool protect_features;
bool detect_connected_components;
@ -139,9 +141,11 @@ log() const
<< QString("edge max size: %1").arg(edge_sizing)
<< QString("facet min angle: %1").arg(facet_angle)
<< QString("facet max size: %1").arg(facet_sizing)
<< QString("facet min size: %1").arg(facet_min_sizing)
<< QString("facet approx error: %1").arg(facet_approx)
<< QString("tet shape (radius-edge): %1").arg(tet_shape)
<< QString("tet max size: %1").arg(tet_sizing)
<< QString("tet min size: %1").arg(tet_min_sizing)
<< QString("detect connected components: %1")
.arg(detect_connected_components)
<< QString("protect features: %1").arg(protect_features);
@ -296,9 +300,12 @@ launch()
Mesh_criteria criteria(edge_criteria(p_.edge_sizing, Tag()),
Facet_criteria(p_.facet_angle,
p_.facet_sizing,
p_.facet_approx),
p_.facet_approx,
CGAL::FACET_VERTICES_ON_SURFACE,
p_.facet_min_sizing),
Cell_criteria(p_.tet_shape,
p_.tet_sizing));
p_.tet_sizing,
p_.tet_min_sizing));
tweak_criteria(criteria, Tag());
initialize(criteria, Tag());

View File

@ -9,8 +9,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>568</width>
<height>1049</height>
<width>799</width>
<height>1231</height>
</rect>
</property>
<property name="sizePolicy">
@ -185,60 +185,15 @@
<property name="title">
<string>Surface</string>
</property>
<layout class="QGridLayout" name="gridLayout_2" rowstretch="0,0,0,0,0,0,0,0,0,0" columnstretch="0,1,0">
<item row="2" column="2">
<widget class="QCheckBox" name="noFacetSizing">
<property name="toolTip">
<string>Enable/Disable parameter</string>
</property>
<layout class="QGridLayout" name="gridLayout_2" rowstretch="0,0,0,0,0,0,0,0,0,0,0" columnstretch="0,1,0">
<item row="1" column="1">
<widget class="DoubleEdit" name="approx">
<property name="text">
<string/>
</property>
<property name="checked">
<bool>true</bool>
<string>0.0017</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="approxLabel">
<property name="text">
<string>Approximation &amp;error</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>approx</cstring>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QCheckBox" name="noApprox">
<property name="toolTip">
<string>Enable/Disable parameter</string>
</property>
<property name="text">
<string/>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="angleLabel">
<property name="text">
<string>Facet min. &amp;angle (deg)</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>facetAngle</cstring>
</property>
</widget>
</item>
<item row="9" column="0" colspan="3">
<item row="10" column="0" colspan="3">
<widget class="QFrame" name="advanced">
<property name="visible">
<bool>true</bool>
@ -299,15 +254,21 @@
</layout>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="checkBox">
<item row="1" column="0">
<widget class="QLabel" name="approxLabel">
<property name="text">
<string>See advanced &amp;controls...</string>
<string>Approximation &amp;error</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>approx</cstring>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QCheckBox" name="noAngle">
<item row="1" column="2">
<widget class="QCheckBox" name="noApprox">
<property name="toolTip">
<string>Enable/Disable parameter</string>
</property>
@ -319,6 +280,43 @@
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="angleLabel">
<property name="text">
<string>Facet min. &amp;angle (deg)</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>facetAngle</cstring>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QCheckBox" name="checkBox">
<property name="text">
<string>See advanced &amp;controls...</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="DoubleEdit" name="facetAngle">
<property name="inputMask">
<string/>
</property>
<property name="text">
<string>25.00</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="DoubleEdit" name="facetSizing">
<property name="text">
<string>0.065</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="sizingLabel">
<property name="text">
@ -332,27 +330,50 @@
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="DoubleEdit" name="facetSizing">
<item row="4" column="2">
<widget class="QCheckBox" name="noAngle">
<property name="toolTip">
<string>Enable/Disable parameter</string>
</property>
<property name="text">
<string>0.065</string>
<string/>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QCheckBox" name="noFacetSizing">
<property name="toolTip">
<string>Enable/Disable parameter</string>
</property>
<property name="text">
<string/>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="0" alignment="Qt::AlignRight">
<widget class="QLabel" name="sizingMinLabel">
<property name="text">
<string>Facet min. size</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="DoubleEdit" name="facetAngle">
<property name="inputMask">
<string/>
</property>
<widget class="DoubleEdit" name="facetMinSizing">
<property name="text">
<string>25.00</string>
<string>0.00</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="DoubleEdit" name="approx">
<item row="3" column="2">
<widget class="QCheckBox" name="noFacetMinSizing">
<property name="text">
<string>0.0017</string>
<string/>
</property>
</widget>
</item>
@ -365,6 +386,33 @@
<string>Volume</string>
</property>
<layout class="QGridLayout" name="gridLayout_3" columnstretch="0,1,0">
<item row="2" column="1">
<widget class="DoubleEdit" name="tetShape">
<property name="text">
<string>3.00</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="DoubleEdit" name="tetSizing">
<property name="text">
<string>0.00</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="tetSizingLabel">
<property name="text">
<string>&amp;Tetrahedron max. size</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>tetSizing</cstring>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QCheckBox" name="noTetSizing">
<property name="toolTip">
@ -378,7 +426,7 @@
</property>
</widget>
</item>
<item row="1" column="2">
<item row="2" column="2">
<widget class="QCheckBox" name="noTetShape">
<property name="toolTip">
<string>Enable/Disable parameter</string>
@ -391,8 +439,8 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<item row="2" column="0">
<widget class="QLabel" name="tetShapeLabel">
<property name="text">
<string>Tetrahedron shape (radius-edge ratio)</string>
</property>
@ -401,30 +449,24 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<item row="1" column="0" alignment="Qt::AlignRight">
<widget class="QLabel" name="tetMinSizingLabel">
<property name="text">
<string>&amp;Tetrahedron max. size</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>tetSizing</cstring>
<string>Tetrahedron min. size</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="DoubleEdit" name="tetSizing">
<item row="1" column="1">
<widget class="DoubleEdit" name="tetMinSizing">
<property name="text">
<string>0.00</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="DoubleEdit" name="tetShape">
<item row="1" column="2">
<widget class="QCheckBox" name="noTetMinSizing">
<property name="text">
<string>3.00</string>
<string/>
</property>
</widget>
</item>

View File

@ -340,12 +340,14 @@ CGAL_add_named_parameter_with_compatibility(edge_size_param_t, edge_size_param,
CGAL_add_named_parameter_with_compatibility_ref_only(edge_sizing_field_param_t, edge_sizing_field_param, edge_sizing_field)
CGAL_add_named_parameter_with_compatibility(facet_angle_param_t, facet_angle_param, facet_angle)
CGAL_add_named_parameter_with_compatibility(facet_size_param_t, facet_size_param, facet_size)
CGAL_add_named_parameter_with_compatibility(facet_min_size_param_t, facet_min_size_param, facet_min_size)
CGAL_add_named_parameter_with_compatibility_ref_only(facet_sizing_field_param_t, facet_sizing_field_param, facet_sizing_field)
CGAL_add_named_parameter_with_compatibility_ref_only(facet_distance_param_t, facet_distance_param, facet_distance)
CGAL_add_named_parameter_with_compatibility(facet_topology_param_t, facet_topology_param, facet_topology)
CGAL_add_named_parameter_with_compatibility(cell_radius_edge_param_t, cell_radius_edge_param, cell_radius_edge)
CGAL_add_named_parameter_with_compatibility(cell_radius_edge_ratio_param_t, cell_radius_edge_ratio_param, cell_radius_edge_ratio)
CGAL_add_named_parameter_with_compatibility(cell_size_param_t, cell_size_param, cell_size)
CGAL_add_named_parameter_with_compatibility(cell_min_size_param_t, cell_min_size_param, cell_min_size)
CGAL_add_named_parameter_with_compatibility_ref_only(cell_sizing_field_param_t, cell_sizing_field_param, cell_sizing_field)
CGAL_add_named_parameter_with_compatibility_ref_only(sizing_field_param_t, sizing_field_param, sizing_field)