added parameter to Orthtree_traits_point to use square/cubic space

This commit is contained in:
Sven Oesau 2024-02-20 14:21:27 +01:00
parent 6d84c07621
commit d95d650dbf
3 changed files with 26 additions and 5 deletions

View File

@ -27,13 +27,15 @@ namespace CGAL {
\tparam GeomTraits a model of `Kernel`
\tparam PointRange a model of `Range` whose value type is the key type of `PointMap`
\tparam PointMap a model of `ReadablePropertyMap` whose value type is `GeomTraits::Point_3`
\tparam cubic boolean to enforce a cubic octree
*/
template <
typename GeomTraits,
typename PointRange,
typename PointMap = Identity_property_map<typename std::iterator_traits<typename PointRange::iterator>::value_type>
typename PointMap = Identity_property_map<typename std::iterator_traits<typename PointRange::iterator>::value_type>,
bool cubic = false
>
using Octree = Orthtree<Orthtree_traits_point<GeomTraits, PointRange, PointMap, 3>>;
using Octree = Orthtree<Orthtree_traits_point<GeomTraits, PointRange, PointMap, cubic, 3>>;
} // namespace CGAL

View File

@ -78,6 +78,7 @@ template <
typename GeomTraits,
typename PointRange,
typename PointMap = Identity_property_map<typename std::iterator_traits<typename PointRange::iterator>::value_type>,
bool cubic = false,
int dimension = Ambient_dimension<
typename std::iterator_traits<typename PointRange::iterator>::value_type,
GeomTraits
@ -91,7 +92,7 @@ public:
/// @}
using Base = Orthtree_traits_base<GeomTraits, dimension>;
using Self = Orthtree_traits_point<GeomTraits, PointRange, PointMap, dimension>;
using Self = Orthtree_traits_point<GeomTraits, PointRange, PointMap, cubic, dimension>;
using Tree = Orthtree<Self>;
using Node_index = typename Base::Node_index;
@ -129,6 +130,21 @@ public:
}
}
if constexpr (cubic) {
std::array<typename Self::FT, Self::dimension> center;
FT max_side = 0;
for (int i = 0; i < Self::dimension; i++) {
FT side = bbox_max[i] - bbox_min[i];
max_side = (std::max<FT>)(max_side, side);
center[i] = (bbox_min[i] + bbox_max[i]) * 0.5f;
}
max_side *= 0.5f;
for (int i = 0; i < Self::dimension; i++) {
bbox_min[i] = center[i] - max_side;
bbox_max[i] = center[i] + max_side;
}
}
return {std::apply(Self::construct_point_d_object(), bbox_min),
std::apply(Self::construct_point_d_object(), bbox_max)};
};

View File

@ -27,12 +27,15 @@ namespace CGAL {
\tparam GeomTraits must be a model of `Kernel`
\tparam PointRange must be a model of `Range` whose value type is the key type of `PointMap`
\tparam PointMap must be a model of `ReadablePropertyMap` whose value type is `GeomTraits::Point_2`
\tparam square boolean to enforce a square quadtree
*/
template <typename GeomTraits, typename PointRange,
typename PointMap = Identity_property_map
<typename std::iterator_traits<typename PointRange::iterator>::value_type> >
<typename std::iterator_traits<typename PointRange::iterator>::value_type>,
bool squared = false
>
using Quadtree = Orthtree<Orthtree_traits_point<GeomTraits, PointRange, PointMap, 2>>;
using Quadtree = Orthtree<Orthtree_traits_point<GeomTraits, PointRange, PointMap, squared, 2>>;
} // namespace CGAL