CGAL 4.7 - 3D Mesh Generation: Mesh Generation Functions

\( \newcommand{\E}{\mathrm{E}} \) \( \newcommand{\A}{\mathrm{A}} \) \( \newcommand{\R}{\mathrm{R}} \) \( \newcommand{\N}{\mathrm{N}} \) \( \newcommand{\Q}{\mathrm{Q}} \) \( \newcommand{\Z}{\mathrm{Z}} \) \( \def\ccSum #1#2#3{ \sum_{#1}^{#2}{#3} } \def\ccProd #1#2#3{ \sum_{#1}^{#2}{#3} }\)

CGAL 4.7 - 3D Mesh Generation

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
Functions
Mesh Generation Functions
3D Mesh Generation Reference

##

The two main functions to generate a mesh are `make_mesh_3()` and `refine_mesh_3()`.

The other functions allow to optimize an existing mesh.

## Functions

template<typename C3T3 >
Mesh_optimization_return_code | CGAL::exude_mesh_3 (C3T3 &c3t3, double parameters::time_limit=0, double parameters::sliver_bound=0)
| The function `exude_mesh_3()` performs a sliver exudation process on a Delaunay mesh. More...
template<typename C3T3 , typename MeshDomain_3 >
Mesh_optimization_return_code | CGAL::lloyd_optimize_mesh_3 (C3T3 &c3t3, MeshDomain_3 domain, double parameters::time_limit=0, std::size_t parameters::max_iteration_number=0, double parameters::convergence=0.02, double parameters::freeze_bound=0.01, bool parameters::do_freeze=true)
| The function `lloyd_optimize_mesh_3()` is a mesh optimization process based on the minimization of a global energy function. More...
template<class C3T3 , class MeshDomain_3 , class MeshCriteria >
C3T3 | CGAL::make_mesh_3 (MeshDomain_3 domain, MeshCriteria criteria, parameters::internal::Features_options features=parameters::features(domain), parameters::internal::Lloyd_options lloyd=parameters::no_lloyd(), parameters::internal::Odt_options odt=parameters::no_odt(), parameters::internal::Perturb_options perturb=parameters::perturb(), parameters::internal::Exude_options exude=parameters::exude())
| The function `make_mesh_3()` is a 3D mesh generator. More...
template<typename C3T3 , typename MeshDomain_3 >
Mesh_optimization_return_code | CGAL::odt_optimize_mesh_3 (C3T3 &c3t3, MeshDomain_3 domain, double parameters::time_limit=0, std::size_t parameters::max_iteration_number=0, double parameters::convergence=0.02, double parameters::freeze_bound=0.01, bool parameters::do_freeze=true)
| The function `odt_optimize_mesh_3()` is a mesh optimization process based on the minimization of a global energy function. More...
template<typename C3T3 , typename MeshDomain_3 >
Mesh_optimization_return_code | CGAL::perturb_mesh_3 (C3T3 &c3t3, MeshDomain_3 domain, double parameters::time_limit=0, double parameters::sliver_bound=0)
| The function `perturb_mesh_3()` is a mesh optimizer that improves the quality of a Delaunay mesh by changing the mesh vertices positions. More...
template<class C3T3 , class MeshDomain_3 , class MeshCriteria >
void | CGAL::refine_mesh_3 (C3T3 &c3t3, MeshDomain_3 mesh_domain, MeshCriteria mesh_criteria, parameters::internal::Lloyd_options lloyd=parameters::no_lloyd(), parameters::internal::Odt_options odt=parameters::no_odt(), parameters::internal::Perturb_options perturb=parameters::perturb(), parameters::internal::Exude_options exude=parameters::exude())
| The function `refine_mesh_3()` is a 3D mesh generator. More...

## Function Documentation

template<typename C3T3 >

Mesh_optimization_return_code CGAL::exude_mesh_3 | ( | C3T3 & | c3t3,
|  | double parameters::time_limit | = `0`,
|  | double parameters::sliver_bound | = `0`
| ) |  |

The function `exude_mesh_3()` performs a sliver exudation process on a Delaunay mesh.

The sliver exudation process consists in turning the Delaunay triangulation into a weighted Delaunay triangulation and optimizing the weights of vertices in such a way that slivers disappear and the quality of the mesh improves.

Precondition
  `time_limit` \( \geq\) 0 and 0 \( \leq\) `sliver_bound` \( \leq\) 180

Template Parameters

  C3T3 | is required to be a model of the concept `MeshComplex_3InTriangulation_3`. The argument `c3t3`, passed by reference, provides the initial mesh and is modified by the algorithm to represent the final optimized mesh.

The function has two optional parameters which are named parameters (we use the Boost.Parameter library). Therefore, when calling the function, the parameters can be provided in any order provided that the names of the parameters are used (see example at the bottom of this page).

Named Parameters

- `parameters::time_limit` is used to set up, in seconds, a CPU time limit after which the optimization process is stopped. This time is measured using the `Timer` class. The default value is 0 and means that there is no time limit.
- `parameters::sliver_bound` is designed to give, in degree, a targeted lower bound on dihedral angles of mesh cells. The exudation process considers in turn all the mesh cells that have a smallest dihedral angle less than `sliver_bound` and tries to make them disappear by weighting their vertices. The optimization process stops when every cell in the mesh achieves this quality. The default value is 0 and means that there is no targeted bound: the exuder then runs as long as it can improve the smallest dihedral angles of the set of cells incident to some vertices.

Returns
  The function `exude_mesh_3()` returns a value of type `CGAL::Mesh_optimization_return_code` which is:
  - `CGAL::BOUND_REACHED` when the targeted bound for the smallest dihedral angle in the mesh is reached.
  - `CGAL::TIME_LIMIT_REACHED` when the time limit is reached.
  - `CGAL::CANT_IMPROVE_ANYMORE` when exudation process stops because it can no longer improve the smallest dihedral angle of the set of cells incident to some vertex in the mesh.

Example

// Exude without sliver_bound, using at most 10s CPU time
exude_mesh_3(c3t3,
parameters::time_limit=10);

See Also
  `CGAL::Mesh_optimization_return_code`
  `CGAL::make_mesh_3()`
  `CGAL::refine_mesh_3()`
  `CGAL::perturb_mesh_3()`
  `CGAL::lloyd_optimize_mesh_3()`
  `CGAL::odt_optimize_mesh_3()`

`#include <CGAL/exude_mesh_3.h>`

Examples:
  Mesh_3/mesh_implicit_domains.cpp, Mesh_3/mesh_implicit_domains_2.cpp, Mesh_3/mesh_implicit_ellipsoid.cpp, and Mesh_3/mesh_optimization_lloyd_example.cpp.

template<typename C3T3 , typename MeshDomain_3 >

Mesh_optimization_return_code CGAL::lloyd_optimize_mesh_3 | ( | C3T3 & | c3t3,
|  | MeshDomain_3 | domain,
|  | double parameters::time_limit | = `0`,
|  | std::size_t parameters::max_iteration_number | = `0`,
|  | double parameters::convergence | = `0.02`,
|  | double parameters::freeze_bound | = `0.01`,
|  | bool parameters::do_freeze | = `true`
| ) |  |

The function `lloyd_optimize_mesh_3()` is a mesh optimization process based on the minimization of a global energy function.

In `lloyd_optimize_mesh_3()`, the minimized global energy may be interpreted as the \( L^1\)-norm of the error achieved when the function \( x^2\) is interpolated on the mesh domain using a piecewise linear function which is linear in each cell of the Voronoi diagram of the mesh vertices.

The optimizer `lloyd_optimize_mesh_3()` works in iterative steps. At each iteration, mesh vertices are moved into positions that bring to zero the energy gradient and the Delaunay triangulation is updated. Vertices on the mesh boundaries are handled in a special way so as to preserve an accurate representation of the domain boundaries.

Precondition
  `time_limit` \( \geq\) 0 and 0 \( \leq\) `convergence` \( \leq\) 1 and 0 \( \leq\) `freeze_bound` \( \leq\) 1

Template Parameters

  C3T3 | is required to be a model of the concept `MeshComplex_3InTriangulation_3`. The argument `c3t3`, passed by reference, provides the initial mesh and is modified by the algorithm to represent the final optimized mesh.
  MeshDomain_3 | is required to be a model of the concept `MeshDomain_3`. The argument `domain` must be the `MeshDomain_3` object used to create the `c3t3` parameter.

The function has four optional parameters which are named parameters (we use the Boost.Parameter library). Therefore, when calling the function, the parameters can be provided in any order provided that the names of the parameters are used (see example at the bottom of this page).

Named Parameters

- `parameters::time_limit` is used to set up, in seconds, a CPU time limit after which the optimization process is stopped. This time is measured using `Timer`. The default value is 0 and means that there is no time limit.
- `parameters::max_iteration_number` sets a limit on the number of performed iterations. The default value of 0 means that there is no limit on the number of performed iterations.
- `parameters::convergence` is a stopping criterion based on convergence: the optimization process is stopped, when at the last iteration, the displacement of any vertex is less than a given percentage of the length of the shortest edge incident to that vertex. The parameter `convergence` gives the threshold ratio.
- `parameters::freeze_bound` is designed to reduce running time of each optimization iteration. Any vertex that has a displacement less than a given percentage of the length (the of its shortest incident edge, is frozen (i.e. is not relocated). The parameter `freeze_bound` gives the threshold ratio.
- `parameters::do_freeze` completes the `freeze_bound` parameter. If it is set to `true` (default value), frozen vertices will not move anymore in next iterations. Otherwise, at each iteration, any vertex that moves, unfreezes all its incident vertices.

Returns
  The function `lloyd_optimize_mesh_3()` returns a value of type `CGAL::Mesh_optimization_return_code` which is:
  - `CGAL::TIME_LIMIT_REACHED` when the time limit is reached.
  - `CGAL::MAX_ITERATION_NUMBER_REACHED` when `lloyd_optimize_mesh_3()` stops because it has performed `max_iteration_number` iterations.
  - `CGAL::CONVERGENCE_REACHED` when `lloyd_optimize_mesh_3()` stops because the convergence criterion is achieved.
  - `CGAL::ALL_VERTICES_FROZEN` when all vertices have been frozen, when the `do_freeze` parameter is set to true.
  - `CGAL::CANT_IMPROVE_ANYMORE` when `lloyd_optimize_mesh_3()` stops because most vertices have been frozen, and no better convergence can be reached.

Example

// Lloyd-smoothing until convergence reaches 0.01, freezing vertices which
// move less than 0.001*shortest_incident_edge_length
lloyd_optimize_mesh_3(c3t3,
domain,
parameters::convergence=0.01,
parameters::freeze_bound=0.001,
parameters::do_freeze=true);

See Also
  `CGAL::Mesh_optimization_return_code`
  `CGAL::make_mesh_3()`
  `CGAL::refine_mesh_3()`
  `CGAL::exude_mesh_3()`
  `CGAL::perturb_mesh_3()`
  `CGAL::odt_optimize_mesh_3()`

`#include <CGAL/lloyd_optimize_mesh_3.h>`

Examples:
  Mesh_3/mesh_optimization_lloyd_example.cpp.

template<class C3T3 , class MeshDomain_3 , class MeshCriteria >

C3T3 CGAL::make_mesh_3 | ( | MeshDomain_3 | domain,
|  | MeshCriteria | criteria,
|  | parameters::internal::Features_options | features = `parameters::features(domain)`,
|  | parameters::internal::Lloyd_options | lloyd = `parameters::no_lloyd()`,
|  | parameters::internal::Odt_options | odt = `parameters::no_odt()`,
|  | parameters::internal::Perturb_options | perturb = `parameters::perturb()`,
|  | parameters::internal::Exude_options | exude = `parameters::exude()`
| ) |  |

The function `make_mesh_3()` is a 3D mesh generator.

It produces simplicial meshes which discretize 3D domains.

The mesh generation algorithm is a Delaunay refinement process followed by an optimization phase. The criteria driving the Delaunay refinement process may be tuned to achieve the user needs with respect to the size of mesh elements, the accuracy of boundaries approximation, etc.

The optimization phase is a sequence of optimization processes, including possibly a Lloyd smoothing, an odt-smoothing, a perturber and an exuder. Each optimization process can be activated or not, according to the user requirements and available time. By default, only the perturber and the exuder are activated. Note that the benefits of the exuder will be lost if the mesh is further refined afterward.

The function outputs the mesh to an object which provides iterators to traverse the resulting mesh data structure or can be written to a file (see Examples ).

Template Parameters

  C3T3 | is required to be a model of the concept `MeshComplex_3InTriangulation_3`. This is the return type. The type `C3T3` is in particular required to provide a nested type `C3T3::Triangulation` for the 3D triangulation embedding the mesh. The vertex and cell base classes of the triangulation `C3T3::Triangulation` are required to be models of the concepts `MeshVertexBase_3` and `MeshCellBase_3` respectively.
  MeshDomain_3 | is required to be a model of the concept `MeshDomain_3`, or of the refined concept `MeshDomainWithFeatures_3` if the domain has corners and curve segments that need to be accurately represented in the mesh. The argument `domain` is the sole link through which the domain to be discretized is known by the mesh generation algorithm.
  MeshCriteria | has to be a model of the concept `MeshCriteria_3`, or a model of the refined concept `MeshCriteriaWithFeatures_3` if the domain has exposed features. The argument `criteria` of type `MeshCriteria` specifies the size and shape requirements for mesh tetrahedra and surface facets. These criteria form the rules which drive the refinement process. All mesh elements satisfy those criteria at the end of the refinement process. In addition, if the domain has features, the argument `criteria` provides a sizing field to guide the discretization of 1-dimensional exposed features.

Named Parameters

- `features` allows the user to specify if 0 and 1-dimensional features actually have to be taken into account or not when the domain is a model of `MeshDomainWithFeatures_3`. The type `Features` of this parameter is an internal undescribed type. The library provides functions to construct appropriate values of that type.
  - `parameters::features(domain)` sets `features` according to the domain, i.e. 0 and 1-dimensional features are taken into account if `domain` is a `MeshDomainWithFeatures_3`. This is the default behavior if parameter `features` is not specified.
  - `parameters::no_features()` prevents the representation of 0 and 1-dimensional features in the mesh.

The four additional parameters are optimization parameters. They control which optimization processes are performed and allow the user to tune the parameters of the optimization processes. We do not describe the types of optimization parameters as they are internal types. The package defines two global functions for each optimization parameter to generate appropriate value of this parameter.

- `lloyd` `parameters::lloyd()` and `parameters::no_lloyd()` are designed to trigger or not a call to `lloyd_optimize_mesh_3()` function and to set the parameters of this optimizer. If one parameter is not set, the default value of `lloyd_optimize_mesh_3()` is used for this parameter.
- `odt` `parameters::odt()` and `parameters::no_odt()` are designed to trigger or not a call to `CGAL::odt_optimize_mesh_3` function and to set the parameters of this optimizer If one parameter is not set, the default value of `odt_optimize_mesh_3()` is used for this parameter.
- `perturb` `parameters::perturb()` and `parameters::no_perturb()` are designed to trigger or not a call to `CGAL::perturb_mesh_3` function and to set the parameters of this optimizer. If one parameter is not set, the default value of `CGAL::perturb_mesh_3` is used for this parameter, except for the time bound which is set to be equal to the refinement CPU time.
- `exude` `parameters::exude()` and `parameters::no_exude()` are designed to trigger or not a call to `exude_mesh_3()` function and to override to set the parameters of this optimizer. If one parameter is not set, the default value of `exude_mesh_3()` is used for this parameter, except for the time bound which is set to be equal to the refinement CPU time.

The optimization parameters can be passed in an arbitrary order. If one parameter is not passed, its default value is used. The default values are `no_lloyd()`, `no_odt()`, `perturb()` and `exude()`.

Note that whatever may be the optimization processes activated, they are always launched in the order that is a suborder of the following (see user manual for further details): lloyd*, odt, perturb, exude.

Also beware, that optimization of the mesh is obtained by perturbing mesh vertices and modifying the mesh connectivity and that this has an impact on the strict compliance to the refinement criteria. Though a strict compliance to mesh criteria is granted at the end of the Delaunay refinement, this may no longer be true after some optimization processes. Also beware that the default behavior does involve some optimization processes.

See Also
  `refine_mesh_3()`
  `parameters::features()`
  `parameters::no_features()`
  `exude_mesh_3()`
  `perturb_mesh_3()`
  `lloyd_optimize_mesh_3()`
  `odt_optimize_mesh_3()`
  `parameters::exude()`
  `parameters::no_exude()`
  `parameters::perturb()`
  `parameters::no_perturb()`
  `parameters::lloyd()`
  `parameters::no_lloyd()`
  `parameters::odt()`
  `parameters::no_odt()`

`#include <CGAL/make_mesh_3.h>`

template<typename C3T3 , typename MeshDomain_3 >

Mesh_optimization_return_code CGAL::odt_optimize_mesh_3 | ( | C3T3 & | c3t3,
|  | MeshDomain_3 | domain,
|  | double parameters::time_limit | = `0`,
|  | std::size_t parameters::max_iteration_number | = `0`,
|  | double parameters::convergence | = `0.02`,
|  | double parameters::freeze_bound | = `0.01`,
|  | bool parameters::do_freeze | = `true`
| ) |  |

The function `odt_optimize_mesh_3()` is a mesh optimization process based on the minimization of a global energy function.

In `odt_optimize_mesh_3()`, the minimized global energy may be interpreted as the \( L^1\)-norm of the error achieved when the function \( x^2\) is interpolated on the mesh domain using a piecewise linear function which is linear in each mesh cell.

The optimizer `odt_optimize_mesh_3()` works in iterative steps. At each iteration, mesh vertices are moved into positions that bring to zero the energy gradient and the Delaunay triangulation is updated. Vertices on the mesh boundaries are handled in a special way so as to preserve an accurate representation of the domain boundaries.

Precondition
  `time_limit` \( \geq\) 0 and 0 \( \leq\) `convergence` \( \leq\) 1 and 0 \( \leq\) `freeze_bound` \( \leq\) 1

Template Parameters

  C3T3 | is required to be a model of the concept `MeshComplex_3InTriangulation_3`. The argument `c3t3`, passed by reference, provides the initial mesh and is modified by the algorithm to represent the final optimized mesh.
  MeshDomain_3 | is required to be a model of the concept `MeshDomain_3`. The argument `domain` must be the `MeshDomain_3` object used to create the `c3t3` parameter.

The function has four optional parameters which are named parameters (we use the Boost.Parameter library). Therefore, when calling the function, the parameters can be provided in any order provided that the names of the parameters are used (see example at the bottom of this page).

Named Parameters

- `parameters::time_limit` is used to set up, in seconds, a CPU time limit after which the optimization process is stopped. This time is measured using `Timer`. The default value is 0 and means that there is no time limit.
- `parameters::max_iteration_number` sets a limit on the number of performed iterations. The default value of 0 means that there is no limit on the number of performed iterations.
- `parameters::convergence` is a stopping criterion based on convergence: the optimization process is stopped, when at the last iteration, the displacement of any vertex is less than a given percentage of the length the shortest edge incident to that vertex. The parameter `convergence` gives the threshold ratio.
- `parameters::freeze_bound` is designed to reduce running time of each optimization iteration. Any vertex that has a displacement less than a given percentage of the length (the of its shortest incident edge, is frozen (i.e. is not relocated). The parameter `freeze_bound` gives the threshold ratio.
- `parameters::do_freeze` completes the `freeze_bound` parameter. If it is set to `true` (default value), frozen vertices will not move anymore in next iterations. Otherwise, at each iteration, any vertex that moves, unfreezes all its incident vertices.

Returns
  The function `odt_optimize_mesh_3()` returns a value of type `CGAL::Mesh_optimization_return_code` which is:
  - `CGAL::TIME_LIMIT_REACHED` when the time limit is reached.
  - `CGAL::MAX_ITERATION_NUMBER_REACHED` when `odt_optimize_mesh_3()` stops because it has performed `max_iteration_number` iterations.
  - `CGAL::CONVERGENCE_REACHED` when `odt_optimize_mesh_3()` stops because the convergence criterion is achieved.
  - `CGAL::ALL_VERTICES_FROZEN` when all vertices have been frozen, when the `do_freeze` parameter is set to true.
  - `CGAL::CANT_IMPROVE_ANYMORE` when `odt_optimize_mesh_3()` stops because most vertices have been frozen, and no better convergence can be reached.

Example

// 100 iterations of Odt-smoothing
odt_optimize_mesh_3(c3t3,
domain,
parameters::max_iteration_number = 100,
parameters::convergence = 0);

See Also
  `CGAL::Mesh_optimization_return_code`
  `CGAL::make_mesh_3()`
  `CGAL::refine_mesh_3()`
  `CGAL::exude_mesh_3()`
  `CGAL::perturb_mesh_3()`
  `CGAL::lloyd_optimize_mesh_3()`

`#include <CGAL/odt_optimize_mesh_3.h>`

template<typename C3T3 , typename MeshDomain_3 >

Mesh_optimization_return_code CGAL::perturb_mesh_3 | ( | C3T3 & | c3t3,
|  | MeshDomain_3 | domain,
|  | double parameters::time_limit | = `0`,
|  | double parameters::sliver_bound | = `0`
| ) |  |

The function `perturb_mesh_3()` is a mesh optimizer that improves the quality of a Delaunay mesh by changing the mesh vertices positions.

The perturber tries to improve the dihedral angles of the worst cells in the mesh degree by degree: the step number `n` is considered as successful if after this step the worst tetrahedron of the mesh has a minimal dihedral angle larger than `n` degrees. The perturber exits if this is not the case.

Precondition
  `time_limit` \( \geq\) 0 and 0 \( \leq\) `sliver_bound` \( \leq\) 180

Template Parameters

  C3T3 | is required to be a model of the concept `MeshComplex_3InTriangulation_3`. The argument `c3t3`, passed by reference, provides the initial mesh and is modified by the algorithm to represent the final optimized mesh.
  MeshDomain_3 | is required to be a model of the concept `MeshDomain_3`. The argument `domain` must be the `MeshDomain_3` object used to create the `c3t3` parameter.

The function has two optional parameters which are named parameters (we use the Boost.Parameter library). Therefore, when calling the function, the parameters can be provided in any order provided that the names of the parameters are used (see example at the bottom of this page).

Named Parameters

- `parameters::time_limit` is used to set up, in seconds, a CPU time limit after which the optimization process is stopped. This time is measured using `Timer`. The default value is 0 and means that there is no time limit.
- `parameters::sliver_bound` is designed to give, in degree, a targeted lower bound on dihedral angles of mesh cells. The function `perturb_mesh_3()` runs as long as steps are successful and step number `sliver_bound` (after which the worst tetrahedron in the mesh has a smallest angle larger than `sliver_bound` degrees) has not been reached. The default value is 0 and means that there is no targeted bound: the perturber then runs as long as steps are successful.

Returns
  The function `perturb_mesh_3()` returns a value of type `CGAL::Mesh_optimization_return_code` which is:
  - `CGAL::BOUND_REACHED` when the targeted bound for the smallest dihedral angle in the mesh is reached.
  - `CGAL::TIME_LIMIT_REACHED` when the time limit is reached.
  - `CGAL::CANT_IMPROVE_ANYMORE` when the perturbation process stops because the last step is unsuccessful.

Example

// Perturb until every dihedral angle of the mesh is >= 10 degrees
// No time bound is set
perturb_mesh_3(c3t3,
domain,
parameters::sliver_bound = 10);

See Also
  `CGAL::Mesh_optimization_return_code`
  `CGAL::make_mesh_3()`
  `CGAL::refine_mesh_3()`
  `CGAL::exude_mesh_3()`
  `CGAL::lloyd_optimize_mesh_3()`
  `CGAL::odt_optimize_mesh_3()`

`#include <CGAL/perturb_mesh_3.h>`

Examples:
  Mesh_3/mesh_implicit_domains.cpp, Mesh_3/mesh_implicit_domains_2.cpp, Mesh_3/mesh_implicit_ellipsoid.cpp, and Mesh_3/mesh_optimization_example.cpp.

template<class C3T3 , class MeshDomain_3 , class MeshCriteria >

void CGAL::refine_mesh_3 | ( | C3T3 & | c3t3,
|  | MeshDomain_3 | mesh_domain,
|  | MeshCriteria | mesh_criteria,
|  | parameters::internal::Lloyd_options | lloyd = `parameters::no_lloyd()`,
|  | parameters::internal::Odt_options | odt = `parameters::no_odt()`,
|  | parameters::internal::Perturb_options | perturb = `parameters::perturb()`,
|  | parameters::internal::Exude_options | exude = `parameters::exude()`
| ) |  |

The function `refine_mesh_3()` is a 3D mesh generator.

It produces simplicial meshes which discretize 3D domains.

The mesh generation algorithm is a Delaunay refinement process followed by an optimization phase. The criteria driving the Delaunay refinement process may be tuned to achieve the user needs with respect to the size of mesh elements, the accuracy of boundaries approximation, etc.

The optimization phase is a succession of optimization processes, including possibly a Lloyd smoothing, an odt-smoothing, a perturber and an exuder. Each optimization process can be activated or not, according to the user requirements and available time. By default, only the perturber and the exuder are activated. Note that the benefits of the exuder will be lost if the mesh is further refined afterward.

Attention
  The function template `refine_mesh_3()` may be used to refine a previously computed mesh, e.g.:

C3T3 c3t3 = CGAL::make_mesh_3<C3T3>(domain,criteria);
CGAL::refine_mesh_3(c3t3, domain, new_criteria);

Please note that we guarantee the result if and only if the domain does not change from one refinement to the next one.

Template Parameters

  C3T3 | is required to be a model of the concept `MeshComplex_3InTriangulation_3`. The argument `c3t3` is passed by reference as this object is modified by the refinement process. As the refinement process only adds points to the triangulation, all vertices of the triangulation of `c3t3` remain in the mesh during the refinement process. Object `c3t3` can be used to insert specific points in the domain to ensure that they will be contained in the final triangulation. The type `C3T3` is in particular required to provide a nested type `C3T3::Triangulation` for the 3D triangulation embedding the mesh. The vertex and cell base classes of the triangulation `C3T3::Triangulation` are required to be models of the concepts `MeshVertexBase_3` and `MeshCellBase_3` respectively.
  MeshDomain_3 | is required to be a model of the concept `MeshDomain_3` or of the refined concept `MeshDomainWithFeatures_3` if 0 and 1-dimensional features of the input complex have to be accurately represented in the mesh. The argument `domain` is the sole link through which the domain to be discretized is known by the mesh generation algorithm.
  MeshCriteria | has to be a model of the concept `MeshCriteria_3`, or a model of the refined concept `MeshCriteriaWithFeatures_3` if the domain has exposed features. The argument `criteria` of type `MeshCriteria` specifies the size and shape requirements for mesh tetrahedra and surface facets. These criteria form the rules which drive the refinement process. All mesh elements satisfy those criteria at the end of the refinement process. In addition, if the domain has features, the argument `criteria` provides a sizing field to guide the discretization of 1-dimensional exposed features.

The four additional parameters are optimization parameters. They control which optimization processes are performed and allow the user to tune the parameters of the optimization processes. We do not describe the types of optimization parameters as they are internal types. The package defines two global functions for each optimization parameter to generate appropriate value of this parameter.

Named Parameters

- `lloyd` `parameters::lloyd()` and `parameters::no_lloyd()` are designed to trigger or not a call to `lloyd_optimize_mesh_3()` function and to set the parameters of this optimizer. If one parameter is not set, the default value of `lloyd_optimize_mesh_3()` is used for this parameter.
- `odt` `parameters::odt()` and `parameters::no_odt()` are designed to trigger or not a call to `odt_optimize_mesh_3()` function and to set the parameters of this optimizer If one parameter is not set, the default value of `odt_optimize_mesh_3()` is used for this parameter.
- `perturb` `parameters::perturb()` and `parameters::no_perturb()` are designed to trigger or not a call to `perturb_mesh_3()` function and to set the parameters of this optimizer. If one parameter is not set, the default value of `perturb_mesh_3()` is used for this parameter, except for the time bound which is set to be equal to the refinement CPU time.
- `exude` `parameters::exude()` and `parameters::no_exude()` are designed to trigger or not a call to `exude_mesh_3()` function and to override to set the parameters of this optimizer. If one parameter is not set, the default value of `exude_mesh_3()` is used for this parameter, except for the time bound which is set to be equal to the refinement CPU time.

The optimization parameters can be passed in arbitrary order. If one parameter is not passed, its default value is used. The default values are `no_lloyd()`, `no_odt()`, `perturb()` and `exude()`. Note that whatever may be the optimization processes activated, they are always launched in the order that is a suborder of the following (see user manual for further details): lloyd*, odt, perturb, exude.

Beware that optimization of the mesh is obtained by perturbing mesh vertices and modifying the mesh connectivity and that this has an impact on the strict compliance to the refinement criteria. Though a strict compliance to mesh criteria is granted at the end of the Delaunay refinement, this may no longer be true after some optimization processes. Also beware that the default behavior does involve some optimization processes.

See Also
  `CGAL::make_mesh_3()`
  `CGAL::exude_mesh_3()`
  `CGAL::perturb_mesh_3()`
  `CGAL::lloyd_optimize_mesh_3()`
  `CGAL::odt_optimize_mesh_3()`
  `CGAL::parameters::exude`
  `CGAL::parameters::no_exude`
  `CGAL::parameters::perturb`
  `CGAL::parameters::no_perturb`
  `CGAL::parameters::lloyd`
  `CGAL::parameters::no_lloyd`
  `CGAL::parameters::odt`
  `CGAL::parameters::no_odt`

`#include <CGAL/refine_mesh_3.h>`

Examples:
  Mesh_3/mesh_polyhedral_domain.cpp.