framework for edge_distance criterium

This commit is contained in:
Ange Clement 2023-06-19 12:46:17 +02:00
parent 4673df281a
commit d2b8627fba
5 changed files with 43 additions and 4 deletions

View File

@ -140,6 +140,7 @@ public:
const MeshDomain& domain,
SizingFunction size=SizingFunction(),
const FT minimal_size = FT(),
const FT edge_distance = FT(),
std::size_t maximal_number_of_vertices = 0,
Mesh_error_code* error_code = 0
#ifndef CGAL_NO_ATOMIC
@ -255,6 +256,11 @@ private:
/// an edge of the complex.
bool non_adjacent_but_intersect(const Vertex_handle& va,
const Vertex_handle& vb) const;
/// Returns `true` if the edge `(va,vb)` is a not good enough approimation
/// of it's feature.
bool approx_is_too_large(const Vertex_handle& va,
const Vertex_handle& vb) const;
/// Returns `true` if the balls of `va` and `vb` intersect.
bool do_balls_intersect(const Vertex_handle& va,
@ -461,6 +467,7 @@ private:
SizingFunction size_;
FT minimal_size_;
Weight minimal_weight_;
FT edge_distance_;
std::set<Curve_index> treated_edges_;
Vertex_set unchecked_vertices_;
int refine_balls_iteration_nb;
@ -478,6 +485,7 @@ template <typename C3T3, typename MD, typename Sf>
Protect_edges_sizing_field<C3T3, MD, Sf>::
Protect_edges_sizing_field(C3T3& c3t3, const MD& domain,
Sf size, const FT minimal_size,
const FT edge_distance,
std::size_t maximal_number_of_vertices,
Mesh_error_code* error_code
#ifndef CGAL_NO_ATOMIC
@ -489,6 +497,7 @@ Protect_edges_sizing_field(C3T3& c3t3, const MD& domain,
, size_(size)
, minimal_size_(minimal_size)
, minimal_weight_(CGAL::square(minimal_size))
, edge_distance_(edge_distance)
, refine_balls_iteration_nb(0)
, nonlinear_growth_of_balls(false)
, maximal_number_of_vertices_(maximal_number_of_vertices)
@ -1363,7 +1372,8 @@ refine_balls()
const Vertex_handle& vb = eit->first->vertex(eit->third);
// If those vertices are not adjacent
if( non_adjacent_but_intersect(va, vb) )
if( non_adjacent_but_intersect(va, vb)
|| approx_is_too_large(va, vb))
{
using CGAL::Mesh_3::internal::distance_divisor;
@ -1470,6 +1480,15 @@ non_adjacent_but_intersect(const Vertex_handle& va, const Vertex_handle& vb) con
return false;
}
template <typename C3T3, typename MD, typename Sf>
bool
Protect_edges_sizing_field<C3T3, MD, Sf>::
approx_is_too_large(const Vertex_handle& va, const Vertex_handle& vb) const
{
// TODO
return false;
}
template <typename C3T3, typename MD, typename Sf>
bool

View File

@ -73,7 +73,8 @@ public:
:edge_criteria_(parameters::choose_parameter(parameters::get_parameter(np, internal_np::edge_size_param),
parameters::choose_parameter(parameters::get_parameter_reference(np, internal_np::edge_sizing_field_param),
parameters::choose_parameter(parameters::get_parameter(np, internal_np::sizing_field_param), FT(DBL_MAX)))),
parameters::choose_parameter(parameters::get_parameter(np, internal_np::edge_min_size_param), FT(0))),
parameters::choose_parameter(parameters::get_parameter(np, internal_np::edge_min_size_param), FT(0)),
parameters::choose_parameter(parameters::get_parameter(np, internal_np::edge_distance_param), FT(0))),
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_reference(np, internal_np::facet_sizing_field_param),
@ -268,6 +269,10 @@ typedef Mesh_cell_criteria_3<Tr> Cell_criteria;
* \cgalParamExtra{Note this lower-bound may not be respected everywhere in the output mesh,
* to keep the feature graph valid.}
* \cgalParamNEnd
* \cgalParamNBegin{edge_distance}
* \cgalParamDescription{a constant describing a upper bound for the distances between the
* edge and it's coresponding input feature.}
* \cgalParamNEnd
* \cgalParamNBegin{facet_angle}
* \cgalParamDescription{a lower bound for the angles (in degrees) of the
* surface mesh facets.}

View File

@ -130,17 +130,21 @@ public:
* this lower bound can be handy on some domains, but using it may
* break all the surface topology guarantees of the meshing algorithm.
* It is not guaranteed to be exactly respected in the output mesh.
* \param distance_bound is an upper bound for the distances of the
* edge to the input feature.
*
* Note that if one parameter is set to 0, then its corresponding criterion is ignored.
*/
Mesh_edge_criteria_3(const FT& length_bound,
const FT& min_length_bound = 0)
const FT& min_length_bound = 0,
const FT& distance_bound = 0)
: p_size_(new Mesh_3::internal::Sizing_field_container<
Mesh_constant_domain_field_3<Gt,Index> ,
FT,
Point_3,
Index>(length_bound))
, min_length_bound_(min_length_bound)
, distance_bound_(distance_bound)
{}
// Nb: SFINAE to avoid wrong matches with built-in numerical types
@ -157,12 +161,14 @@ public:
Mesh_edge_criteria_3
(
const SizingField& length_bound,
const FT& min_length_bound = 0
const FT& min_length_bound = 0,
const FT& distance_bound = 0
#ifndef DOXYGEN_RUNNING
, std::enable_if_t<Mesh_3::Is_mesh_domain_field_3<Tr, SizingField>::value>* = 0
#endif
)
: min_length_bound_(min_length_bound)
, distance_bound_(distance_bound)
{
p_size_ = new Mesh_3::internal::Sizing_field_container<SizingField,
FT,
@ -176,6 +182,7 @@ public:
Mesh_edge_criteria_3(const Self& rhs)
: p_size_(rhs.p_size_->clone())
, min_length_bound_(rhs.min_length_bound_)
, distance_bound_(rhs.distance_bound_)
{}
/// Destructor
@ -193,6 +200,11 @@ public:
{
return min_length_bound_;
}
const FT& distance_bound() const
{
return distance_bound_;
}
#endif
private:
@ -203,6 +215,7 @@ private:
// real Sizing_field type
Sizing_field_interface* p_size_;
const FT min_length_bound_;
const FT distance_bound_;
};
} // end namespace CGAL

View File

@ -112,6 +112,7 @@ void init_c3t3_with_features(C3T3& c3t3,
domain,
Sizing_field(criteria.edge_criteria_object()),
criteria.edge_criteria_object().min_length_bound(),
criteria.edge_criteria_object().distance_bound(),
maximal_number_of_vertices,
pointer_to_error_code
#ifndef CGAL_NO_ATOMIC

View File

@ -339,6 +339,7 @@ CGAL_add_named_parameter_with_compatibility(input_features_param_t, input_featur
CGAL_add_named_parameter_with_compatibility(edge_size_param_t, edge_size_param, edge_size)
CGAL_add_named_parameter_with_compatibility_cref_only(edge_sizing_field_param_t, edge_sizing_field_param, edge_sizing_field)
CGAL_add_named_parameter_with_compatibility(edge_min_size_param_t, edge_min_size_param, edge_min_size)
CGAL_add_named_parameter_with_compatibility_cref_only(edge_distance_param_t, edge_distance_param, edge_distance)
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_cref_only(facet_sizing_field_param_t, facet_sizing_field_param, facet_sizing_field)