// Copyright (c) 2022 Institut Géographique National - IGN (France) // All rights reserved. // // This file is part of CGAL (www.cgal.org). // // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Mathieu Brédif #ifndef CGAL_BBOX_D_H #define CGAL_BBOX_D_H #include // defines BOOST_PREVENT_MACRO_SUBSTITUTION #include #include #include #include #include #include #include #include #include #include #include #include namespace CGAL { namespace Impl { template class Bbox { protected: typedef typename Container::value_type T; Container min_values; Container max_values; public: Bbox& operator+=(const Bbox& bbox) { CGAL_assertion(min_values.size() == 0 || min_values.size() == bbox.min_values.size()); if(min_values.size() == 0){ *this = bbox; } std::size_t dim = bbox.min_values.size(); for(std::size_t i=0; i bbox.min_values[i]) min_values[i] = bbox.min_values[i]; if(max_values[i] < bbox.max_values[i]) max_values[i] = bbox.max_values[i]; } return *this; } inline int dimension() const { return static_cast(this)->dimension(); } inline T min BOOST_PREVENT_MACRO_SUBSTITUTION (int i) const { return min_values[i]; } inline T max BOOST_PREVENT_MACRO_SUBSTITUTION (int i) const { return max_values[i]; } inline T& min BOOST_PREVENT_MACRO_SUBSTITUTION (int i) { return min_values[i]; } inline T& max BOOST_PREVENT_MACRO_SUBSTITUTION (int i) { return max_values[i]; } inline T measure() const { T result = max_values[0] - min_values[0]; if (result <= 0) return 0; for(int i=1; i 0); if (factor == 1.) return; int d = dimension(); for(int i=0; i::infinity()) { for(int i=0; i void init(int d, I b, I e) { CGAL_USE(e); CGAL_assertion(d == std::distance(b,e)); for(int i=0; i class Bbox_d; // A fixed D-dimensional axis aligned box template class Bbox_d> : public Impl::Bbox, Bbox_d>> { enum { D = N }; using array_const_iterator = typename std::array::const_iterator; public: using Cartesian_const_iterator = Concatenate_iterator; inline constexpr int dimension() const { return D; } Bbox_d() { this->init(N ); } Bbox_d(double range) { this->init(N, range); } template Bbox_d(I b, I e) { this->init(N, b, e); } Bbox_d(const Bbox_2& bb2){ this->init(bb2);} Bbox_d(const Bbox_3& bb3){ this->init(bb3);} Cartesian_const_iterator cartesian_begin() const { return Cartesian_const_iterator(this->min_values.end(), this->max_values.begin(), this->min_values.begin()); } Cartesian_const_iterator cartesian_end() const { return Cartesian_const_iterator(this->min_values.end(), this->max_values.begin(), this->max_values.end(),0); } }; // A dynamic D-dimensional axis aligned box template<> class Bbox_d : public Impl::Bbox, Bbox_d> { public: inline int dimension() const { return static_cast(this->min_values.size()); } Bbox_d(int d = 0 ) { init_values(d); this->init(d ); } Bbox_d(int d, double range) { init_values(d); this->init(d, range); } template Bbox_d(int d, I b, I e) { init_values(d); this->init(d, b, e); } protected: void init_values(int d) { this->min_values.resize(d); this->max_values.resize(d); } }; template std::ostream& operator<<(std::ostream& out, const Impl::Bbox& bbox) { int d = bbox.dimension(); for(int i=0; i std::istream& operator>>(std::istream& in, Impl::Bbox& bbox) { int d = bbox.dimension(); for(int i=0; i> (bbox.min)(i) >> (bbox.max)(i); return in; } template Bbox_d> operator+(Bbox_d> bbox, const Bbox_d>& other) { bbox += other; return bbox; } template inline bool do_overlap(const Bbox_d& bb1, const Bbox_d& bb2) { // check for emptiness ?? int d = bb1.dimension(); for(int i=0; i