From 9296fe78c250002ed9b1a18f2eae1e171b29796b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Fri, 20 Dec 2024 14:19:58 +0100 Subject: [PATCH] hide force filtering and the traits in NP --- .../doc/Frechet_distance/dependencies | 1 + .../include/CGAL/Frechet_distance.h | 61 ++++++++++++++----- .../CGAL/Frechet_distance_near_neighbors_ds.h | 2 +- .../Frechet_distance_minimal_traits_2.cpp | 6 +- .../Frechet_distance_test.cpp | 6 +- .../internal/parameters_interface.h | 1 + 6 files changed, 56 insertions(+), 21 deletions(-) diff --git a/Frechet_distance/doc/Frechet_distance/dependencies b/Frechet_distance/doc/Frechet_distance/dependencies index a4a2955d065..c79b9d51959 100644 --- a/Frechet_distance/doc/Frechet_distance/dependencies +++ b/Frechet_distance/doc/Frechet_distance/dependencies @@ -5,3 +5,4 @@ STL_Extension Algebraic_foundations Circulator Stream_support +BGL diff --git a/Frechet_distance/include/CGAL/Frechet_distance.h b/Frechet_distance/include/CGAL/Frechet_distance.h index dcd698465ce..82697938f86 100644 --- a/Frechet_distance/include/CGAL/Frechet_distance.h +++ b/Frechet_distance/include/CGAL/Frechet_distance.h @@ -20,6 +20,8 @@ #include #include +#include + #include namespace CGAL @@ -29,24 +31,37 @@ namespace CGAL * \ingroup PkgFrechetDistanceFunctions * determines if the Frechet distance between two polylines is larger than a given distance. * + * \tparam Traits a model of `FrechetDistanceTraits` + * \tparam PointRange a model of the concept `RandomAccessContainer` with `Traits::Point_d` as value type. + * \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" + * * \param polyline1 the first polyline defined by a sequence of consecutive points * \param polyline2 the second polyline defined by a sequence of consecutive points * \param distance the distance to compare against - * \param traits the geometric traits object + * \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below: * - * \tparam Traits a model of `FrechetDistanceTraits` - * \tparam force_filtering if `true`, interval arithmetic combined with exact rational will be used internally - * \tparam PointRange a model of the concept `RandomAccessContainer` - * with `Traits::Point_d` as value type. + * \cgalNamedParamsBegin + * \cgalParamNBegin{geom_traits} + * \cgalParamDescription{an instance of a geometric traits class} + * \cgalParamType{Traits} + * \cgalParamDefault{`Traits()`} + * \cgalParamNEnd + * \cgalNamedParamsEnd * - * \pre the polylines must not be empty + * \pre the polylines must not be empty */ -template < class Traits, bool force_filtering = false, class PointRange> +template bool is_Frechet_distance_larger(const PointRange& polyline1, const PointRange& polyline2, const double distance, - const Traits& traits = Traits()) + const NamedParameters& np = parameters::default_values()) { + constexpr bool force_filtering = + internal_np::Lookup_named_param_def::type::value; + + Traits traits = parameters::choose_parameter( + parameters::get_parameter(np, internal_np::geom_traits)); + constexpr bool filtered = force_filtering || std::is_same_v(polyline1, traits))::IFT, Interval_nt>; @@ -65,27 +80,41 @@ bool is_Frechet_distance_larger(const PointRange& polyline1, * approximates the Fréchet distance between two polylines up to an additive error * of `precision`. * + * \tparam Traits a model of `FrechetDistanceTraits` + * \tparam PointRange a model of the concept `RandomAccessContainer` with `Traits::Point_d` as value type. + * \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" + * * \param polyline1 the first polyline defined by a sequence of consecutive points * \param polyline2 the second polyline defined by a sequence of consecutive points * \param precision the precision of the approximation - * \param traits the geometric traits object + * \param np an optional sequence of \ref bgl_namedparameters "Named Parameters" among the ones listed below: * - * \tparam Traits a model of `FrechetDistanceTraits` - * \tparam force_filtering if `true`, interval arithmetic combined with exact rational will be used internally - * \tparam PointRange a model of the concept `RandomAccessContainer` - * with `Traits::Point_d` as value type. + * \cgalNamedParamsBegin + * \cgalParamNBegin{geom_traits} + * \cgalParamDescription{an instance of a geometric traits class} + * \cgalParamType{Traits} + * \cgalParamDefault{`Traits()`} + * \cgalParamNEnd + * \cgalNamedParamsEnd * - * \pre the polylines must not be empty + * \pre the polylines must not be empty * * @return an interval enclosing the exact result, the difference between the upper and * the lower bound being less than `precision`. */ -template +template std::pair approximate_Frechet_distance(const PointRange& polyline1, const PointRange& polyline2, const double precision, - const Traits& traits = Traits()) + const NamedParameters& np = parameters::default_values()) { + constexpr bool force_filtering = + internal_np::Lookup_named_param_def::type::value; + + Traits traits = parameters::choose_parameter( + parameters::get_parameter(np, internal_np::geom_traits)); + + constexpr bool filtered = force_filtering || std::is_same_v(polyline1, traits))::IFT, Interval_nt>; diff --git a/Frechet_distance/include/CGAL/Frechet_distance_near_neighbors_ds.h b/Frechet_distance/include/CGAL/Frechet_distance_near_neighbors_ds.h index c5aa6dbc002..4823c4365e8 100644 --- a/Frechet_distance/include/CGAL/Frechet_distance_near_neighbors_ds.h +++ b/Frechet_distance/include/CGAL/Frechet_distance_near_neighbors_ds.h @@ -76,7 +76,7 @@ auto FrechetDistanceNearNeighborsDS::get_close_curves( auto predicate = [&](PolylineID id) { CGAL_assertion(id < curves.size()); - return is_Frechet_distance_larger( + return is_Frechet_distance_larger( curve, curves[id], distance); }; auto new_end = std::remove_if(result.begin(), result.end(), predicate); diff --git a/Frechet_distance/test/Frechet_distance/Frechet_distance_minimal_traits_2.cpp b/Frechet_distance/test/Frechet_distance/Frechet_distance_minimal_traits_2.cpp index 06e462a73c5..79080705bd6 100644 --- a/Frechet_distance/test/Frechet_distance/Frechet_distance_minimal_traits_2.cpp +++ b/Frechet_distance/test/Frechet_distance/Frechet_distance_minimal_traits_2.cpp @@ -53,16 +53,18 @@ struct MinimalFrechetTraits { int main() { + namespace params = CGAL::parameters; + { using Traits = MinimalFrechetTraits; std::vector curve; - /* bool decision = */ CGAL::is_Frechet_distance_larger(curve, curve, 0.1); + /* bool decision = */ CGAL::is_Frechet_distance_larger(curve, curve, 0.1, params::force_filtering(std::true_type())); } { using Traits = MinimalFrechetTraits; std::vector curve; - /* bool decision = */ CGAL::is_Frechet_distance_larger(curve, curve, 0.1); + /* bool decision = */ CGAL::is_Frechet_distance_larger(curve, curve, 0.1, params::force_filtering(std::true_type())); } diff --git a/Frechet_distance/test/Frechet_distance/Frechet_distance_test.cpp b/Frechet_distance/test/Frechet_distance/Frechet_distance_test.cpp index 4b58b751d2b..a1271423eb3 100644 --- a/Frechet_distance/test/Frechet_distance/Frechet_distance_test.cpp +++ b/Frechet_distance/test/Frechet_distance/Frechet_distance_test.cpp @@ -149,6 +149,7 @@ static FrechetDistanceNearNeighborsDSQueries readFrechetDistanceNearNeighborsDSQ template static double testFrechetDistance() { + namespace params = CGAL::parameters; std::string curve_directory = "./data/curves/"; std::string query_directory = "./data/queries/"; std::vector datasets; @@ -181,8 +182,9 @@ static double testFrechetDistance() */ timer.start(); auto decision = - ! CGAL::is_Frechet_distance_larger( - curves[query.id1], curves[query.id2], query.distance); + ! CGAL::is_Frechet_distance_larger( + curves[query.id1], curves[query.id2], query.distance, + params::force_filtering(std::bool_constant())); timer.stop(); if (decision != query.decision) { diff --git a/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h b/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h index c95d2933e89..eb04838265a 100644 --- a/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h +++ b/STL_Extension/include/CGAL/STL_Extension/internal/parameters_interface.h @@ -178,6 +178,7 @@ CGAL_add_named_parameter(do_lock_mesh_t, do_lock_mesh, do_lock_mesh) CGAL_add_named_parameter(do_simplify_border_t, do_simplify_border, do_simplify_border) CGAL_add_named_parameter(algorithm_t, algorithm, algorithm) CGAL_add_named_parameter(use_smoothing_t, use_smoothing, use_smoothing) +CGAL_add_named_parameter(force_filtering_t, force_filtering, force_filtering) //internal CGAL_add_named_parameter(weight_calculator_t, weight_calculator, weight_calculator)