// Copyright (c) 2005 INRIA Sophia-Antipolis (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as // published by the Free Software Foundation; either version 3 of the License, // or (at your option) any later version. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0+ // // // Author(s) : Sylvain Pion #ifndef CGAL_BOUNDING_BOX_H #define CGAL_BOUNDING_BOX_H #include #include #include #include namespace CGAL { // TODO : // - Add support for more types of objects. // - Generalize to d-dimension. // - Maybe the internal code itself could be factorized across dimensions... namespace internal { // internal functions specialized by dimension. template < class ForwardIterator, class Traits > typename Traits::Iso_rectangle_2 bounding_box(ForwardIterator f, ForwardIterator l, const Traits& t, Dimension_tag<2>) { CGAL_precondition(f != l); typedef typename Traits::Less_x_2 Less_x_2; typedef typename Traits::Less_y_2 Less_y_2; typedef typename Traits::Construct_iso_rectangle_2 Rect; Less_x_2 lessx = t.less_x_2_object(); Less_y_2 lessy = t.less_y_2_object(); Rect rect = t.construct_iso_rectangle_2_object(); ForwardIterator xmin = f; ForwardIterator xmax = f; ForwardIterator ymin = f; ForwardIterator ymax = f; while (++f != l) { if (lessx(*f, *xmin)) xmin = f; else if (lessx(*xmax, *f)) xmax = f; if (lessy(*f, *ymin)) ymin = f; else if (lessy(*ymax, *f)) ymax = f; } return rect(*xmin, *xmax, *ymin, *ymax); } template < class ForwardIterator, class Traits > typename Traits::Iso_cuboid_3 bounding_box(ForwardIterator f, ForwardIterator l, const Traits& t, Dimension_tag<3>) { CGAL_precondition(f != l); typedef typename Traits::Less_x_3 Less_x_3; typedef typename Traits::Less_y_3 Less_y_3; typedef typename Traits::Less_z_3 Less_z_3; typedef typename Traits::Construct_iso_cuboid_3 Cub; Less_x_3 lessx = t.less_x_3_object(); Less_y_3 lessy = t.less_y_3_object(); Less_z_3 lessz = t.less_z_3_object(); Cub cub = t.construct_iso_cuboid_3_object(); ForwardIterator xmin = f; ForwardIterator xmax = f; ForwardIterator ymin = f; ForwardIterator ymax = f; ForwardIterator zmin = f; ForwardIterator zmax = f; while (++f != l) { if (lessx(*f, *xmin)) xmin = f; else if (lessx(*xmax, *f)) xmax = f; if (lessy(*f, *ymin)) ymin = f; else if (lessy(*ymax, *f)) ymax = f; if (lessz(*f, *zmin)) zmin = f; else if (lessz(*zmax, *f)) zmax = f; } return cub(*xmin, *xmax, *ymin, *ymax, *zmin, *zmax); } #if 0 template < class ForwardIterator, class Traits > typename Traits::Iso_box_d bounding_box(ForwardIterator f, ForwardIterator l, const Traits& t, Dynamic_dimension_tag); // To be written... #endif } template < class ForwardIterator, class K > inline typename Access::Iso_box ::value_type, K>::type>::type bounding_box(ForwardIterator f, ForwardIterator l, const K& k) { typedef typename std::iterator_traits< ForwardIterator >::value_type Pt; return internal::bounding_box(f, l, k, typename Ambient_dimension::type() ); } template < class ForwardIterator > inline typename Access::Iso_box::value_type>::Kernel, typename Ambient_dimension::value_type, typename Kernel_traits::value_type>::Kernel>::type >::type bounding_box(ForwardIterator f, ForwardIterator l) { typedef typename std::iterator_traits< ForwardIterator >::value_type Pt; typedef typename Kernel_traits::Kernel Kernel; return bounding_box(f, l, Kernel()); } } //namespace CGAL #endif // CGAL_BOUNDING_BOX_H