mirror of https://github.com/CGAL/cgal
311 lines
12 KiB
C++
311 lines
12 KiB
C++
// 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) : Stéphane Tayeb
|
|
//
|
|
//******************************************************************************
|
|
// File Description :
|
|
// Implements default meshing criteria to drive Mesh_3 process
|
|
//******************************************************************************
|
|
|
|
|
|
#ifndef CGAL_MESH_CRITERIA_3_H
|
|
#define CGAL_MESH_CRITERIA_3_H
|
|
|
|
#include <CGAL/license/Mesh_3.h>
|
|
|
|
#include <CGAL/disable_warnings.h>
|
|
#include <CGAL/Named_function_parameters.h>
|
|
#include <CGAL/Mesh_3/config.h>
|
|
#include <CGAL/Mesh_edge_criteria_3.h>
|
|
#include <CGAL/Mesh_facet_criteria_3.h>
|
|
#include <CGAL/Mesh_cell_criteria_3.h>
|
|
#include <cfloat> // for the macro DBL_MAX
|
|
#include <boost/type_traits/is_base_of.hpp>
|
|
namespace CGAL {
|
|
|
|
|
|
namespace internal {
|
|
|
|
// Class Mesh_criteria_3_impl
|
|
template < typename Tr,
|
|
typename EdgeCriteria,
|
|
typename FacetCriteria,
|
|
typename CellCriteria >
|
|
class Mesh_criteria_3_impl
|
|
{
|
|
typedef typename Tr::Geom_traits::FT FT;
|
|
|
|
public:
|
|
typedef EdgeCriteria Edge_criteria;
|
|
typedef FacetCriteria Facet_criteria;
|
|
typedef CellCriteria Cell_criteria;
|
|
|
|
// Constructor
|
|
Mesh_criteria_3_impl(Facet_criteria facet_criteria,
|
|
Cell_criteria cell_criteria)
|
|
: edge_criteria_(0)
|
|
, facet_criteria_(facet_criteria)
|
|
, cell_criteria_(cell_criteria)
|
|
{ }
|
|
|
|
// Constructor
|
|
Mesh_criteria_3_impl(Edge_criteria edge_criteria,
|
|
Facet_criteria facet_criteria,
|
|
Cell_criteria cell_criteria)
|
|
: edge_criteria_(edge_criteria)
|
|
, facet_criteria_(facet_criteria)
|
|
, cell_criteria_(cell_criteria)
|
|
{ }
|
|
|
|
// This template constructor is not instantiated when named parameters
|
|
// are not used, so Facet_criteria and Cell_criteria construction from FT
|
|
// is not a problem
|
|
template <typename CGAL_NP_TEMPLATE_PARAMETERS>
|
|
Mesh_criteria_3_impl(const CGAL_NP_CLASS& np)
|
|
:edge_criteria_(parameters::choose_parameter(parameters::get_parameter(np, internal_np::edge_size_param),
|
|
parameters::choose_parameter(parameters::get_parameter(np, internal_np::edge_sizing_field_param),
|
|
parameters::choose_parameter(parameters::get_parameter(np, internal_np::sizing_field_param), FT(DBL_MAX))))),
|
|
facet_criteria_(parameters::choose_parameter(parameters::get_parameter(np, internal_np::facet_angle_param), FT(0)),
|
|
parameters::choose_parameter(parameters::get_parameter(np, internal_np::facet_size_param),
|
|
parameters::choose_parameter(parameters::get_parameter(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(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)),
|
|
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(np, internal_np::cell_sizing_field_param),
|
|
parameters::choose_parameter(parameters::get_parameter(np, internal_np::sizing_field_param), FT(0)))))
|
|
{ }
|
|
|
|
#ifndef CGAL_NO_DEPRECATED_CODE
|
|
const Edge_criteria& edge_criteria() const { return edge_criteria_; }
|
|
const Facet_criteria& facet_criteria() const { return facet_criteria_; }
|
|
const Cell_criteria& cell_criteria() const { return cell_criteria_; }
|
|
#endif
|
|
|
|
const Edge_criteria& edge_criteria_object() const { return edge_criteria_; }
|
|
const Facet_criteria& facet_criteria_object() const { return facet_criteria_; }
|
|
const Cell_criteria& cell_criteria_object() const { return cell_criteria_; }
|
|
|
|
template <typename Facet_criterion>
|
|
void add_facet_criterion(Facet_criterion* criterion) {
|
|
CGAL_static_assertion((boost::is_base_of<
|
|
typename Facet_criteria::Abstract_criterion,
|
|
Facet_criterion
|
|
>::value));
|
|
facet_criteria_.add(criterion);
|
|
}
|
|
|
|
template <typename Cell_criterion>
|
|
void add_cell_criterion(Cell_criterion* criterion) {
|
|
CGAL_static_assertion((boost::is_base_of<
|
|
typename Cell_criteria::Abstract_criterion,
|
|
Cell_criterion
|
|
>::value));
|
|
cell_criteria_.add(criterion);
|
|
}
|
|
|
|
private:
|
|
Edge_criteria edge_criteria_;
|
|
Facet_criteria facet_criteria_;
|
|
Cell_criteria cell_criteria_;
|
|
|
|
}; // end class Mesh_criteria_3_impl
|
|
|
|
} // end namespace internal
|
|
|
|
|
|
|
|
|
|
/*!
|
|
\ingroup PkgMesh3MeshClasses
|
|
|
|
The class `Mesh_criteria_3` is a model of both concepts `MeshCriteria_3`
|
|
and `MeshCriteriaWithFeatures_3`.
|
|
It gathers the refinement criteria for mesh tetrahedra and
|
|
surface facets where
|
|
surface facets are facets in the mesh approximating the domain surface patches.
|
|
In addition, for domains with exposed 1-dimensional features,
|
|
the class `Mesh_criteria_3`
|
|
handles the definition of a sizing field to guide the discretization of
|
|
1-dimensional features.
|
|
|
|
\tparam Tr has to be instantiated with the type used for
|
|
`C3T3::Triangulation`,
|
|
where `C3T3` is the model of `MeshComplex_3InTriangulation_3`
|
|
used in the mesh generation process,
|
|
and `C3T3::Triangulation` its nested triangulation type.
|
|
|
|
\cgalModels `MeshCriteria_3`
|
|
|
|
\cgalHeading{Example}
|
|
|
|
\code{.cpp}
|
|
|
|
// Create a Mesh_criteria_3<Tr> object with all cell and facet parameters set
|
|
Mesh_criteria_3<Tr> criteria (parameters::facet_angle=30,
|
|
parameters::facet_size=1,
|
|
parameters::facet_distance=0.1,
|
|
parameters::cell_radius_edge_ratio=2,
|
|
parameters::cell_size=1.5);
|
|
|
|
// Create a Mesh_criteria_3<Tr> object with size ignored (note that the order changed)
|
|
Mesh_criteria_3<Tr> criteria (parameters::cell_radius_edge_ratio=2,
|
|
parameters::facet_angle=30,
|
|
parameters::facet_distance=0.1);
|
|
|
|
\endcode
|
|
|
|
\sa `MeshCriteria_3`
|
|
\sa `MeshCriteriaWithFeatures_3`
|
|
\sa `MeshCellCriteria_3`
|
|
\sa `MeshEdgeCriteria_3`
|
|
\sa `MeshFacetCriteria_3`
|
|
\sa `MeshDomainField_3`
|
|
\sa `CGAL::Mesh_cell_criteria_3<Tr>`
|
|
\sa `CGAL::Mesh_edge_criteria_3<Tr>`
|
|
\sa `CGAL::Mesh_facet_criteria_3<Tr>`
|
|
\sa `CGAL::Mesh_facet_topology`
|
|
|
|
*/
|
|
template <typename Tr,
|
|
typename EdgeCriteria = Mesh_edge_criteria_3<Tr>,
|
|
typename FacetCriteria = Mesh_facet_criteria_3<Tr>,
|
|
typename CellCriteria = Mesh_cell_criteria_3<Tr> >
|
|
class Mesh_criteria_3
|
|
#ifndef DOXYGEN_RUNNING
|
|
: public internal::Mesh_criteria_3_impl< Tr,
|
|
EdgeCriteria,
|
|
FacetCriteria,
|
|
CellCriteria >
|
|
#endif
|
|
{
|
|
typedef internal::Mesh_criteria_3_impl< Tr,
|
|
EdgeCriteria,
|
|
FacetCriteria,
|
|
CellCriteria> Base;
|
|
|
|
public:
|
|
#ifdef DOXYGEN_RUNNING
|
|
/// \name Types
|
|
/// @{
|
|
|
|
/*!
|
|
The criteria for edges.
|
|
*/
|
|
typedef Mesh_edge_criteria_3<Tr> Edge_criteria;
|
|
|
|
/*!
|
|
The criteria for facets.
|
|
*/
|
|
typedef Mesh_facet_criteria_3<Tr> Facet_criteria;
|
|
|
|
/*!
|
|
The
|
|
criteria for cells.
|
|
*/
|
|
typedef Mesh_cell_criteria_3<Tr> Cell_criteria;
|
|
|
|
/// @}
|
|
#else
|
|
typedef typename Base::Edge_criteria Edge_criteria;
|
|
typedef typename Base::Facet_criteria Facet_criteria;
|
|
typedef typename Base::Cell_criteria Cell_criteria;
|
|
#endif
|
|
|
|
/// Construction from facet and cell criteria, the edge criteria are ignored in this case.
|
|
Mesh_criteria_3(Facet_criteria facet_criteria,
|
|
Cell_criteria cell_criteria)
|
|
: Base(facet_criteria,
|
|
cell_criteria) {}
|
|
|
|
/// Constructor from edge, face, and cell criteria.
|
|
Mesh_criteria_3(Edge_criteria edge_criteria,
|
|
Facet_criteria facet_criteria,
|
|
Cell_criteria cell_criteria)
|
|
: Base(edge_criteria,
|
|
facet_criteria,
|
|
cell_criteria) {}
|
|
/*!
|
|
* \brief Construction from criteria parameters.
|
|
*
|
|
* Note that each size or distance parameter can be specified using two ways: either as a scalar field or
|
|
* as a numerical value when the field is uniform.
|
|
*
|
|
* If not specified, each parameter has a default value such that the corresponding criterion will be ignored.
|
|
* Numerical sizing or distance values, as well as scalar fields should be given in the unit used for coordinates
|
|
* of points in the mesh domain class of the mesh generation process.
|
|
* \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters"
|
|
*
|
|
* \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below:
|
|
*
|
|
* \cgalNamedParamsBegin
|
|
* \cgalParamNBegin{edge_size}
|
|
* \cgalParamDescription{a scalar field (resp. a constant) providing a space varying
|
|
* (resp. a uniform)
|
|
* upper bound for the lengths of curve edges. This parameter has to be set to a positive
|
|
* value when 1-dimensional features protection is used.}
|
|
* \cgalParamNEnd
|
|
* \cgalParamNBegin{facet_angle}
|
|
* \cgalParamDescription{a lower bound for the angles (in degrees) of the
|
|
* surface mesh facets.}
|
|
* \cgalParamNEnd
|
|
* \cgalParamNBegin{facet_size}
|
|
* \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_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
|
|
* Delaunay ball.}
|
|
* \cgalParamNEnd
|
|
* \cgalParamNBegin{facet_topology}
|
|
* \cgalParamDescription{the set of topological constraints
|
|
* which have to be verified by each surface facet. See `Mesh_facet_topology` manual page to
|
|
* get all possible values.}
|
|
* \cgalParamDefault{CGAL::FACET_VERTICES_ON_SURFACE}
|
|
* \cgalParamNEnd
|
|
* \cgalParamNBegin{cell_radius_edge_ratio}
|
|
* \cgalParamDescription{ an upper bound for the radius-edge ratio of the mesh tetrahedra.}
|
|
* \cgalParamNEnd
|
|
* \cgalParamNBegin{cell_size}
|
|
* \cgalParamDescription{ a scalar field (resp. a constant) describing
|
|
* a space varying (resp. a uniform) upper-bound for the circumradii of the mesh tetrahedra.}
|
|
* \cgalParamNEnd
|
|
* \cgalNamedParamsEnd
|
|
*/
|
|
template<typename CGAL_NP_TEMPLATE_PARAMETERS>
|
|
Mesh_criteria_3(const CGAL_NP_CLASS& np = parameters::default_values()): Base(np)
|
|
{
|
|
}
|
|
|
|
#if !defined(BOOST_MSVC) || (BOOST_MSVC >= 1910)
|
|
template<typename ... CGAL_NP_TEMPLATE_PARAMETERS_VARIADIC>
|
|
Mesh_criteria_3(const CGAL_NP_CLASS& ... nps):Mesh_criteria_3(internal_np::combine_named_parameters(nps...))
|
|
{
|
|
}
|
|
#else
|
|
template<typename CGAL_NP_TEMPLATE_PARAMETERS_NO_DEFAULT_1, typename CGAL_NP_TEMPLATE_PARAMETERS_NO_DEFAULT_2, typename ... NP>
|
|
Mesh_criteria_3(const CGAL_NP_CLASS_1& np1, const CGAL_NP_CLASS_2& np2, const NP& ... nps)
|
|
: Mesh_criteria_3(internal_np::combine_named_parameters(np1, np2, nps...))
|
|
{
|
|
}
|
|
#endif
|
|
|
|
}; // end class Mesh_criteria_3
|
|
|
|
} // end namespace CGAL
|
|
|
|
#include <CGAL/enable_warnings.h>
|
|
|
|
#endif // CGAL_MESH_CRITERIA_3_H
|