// Copyright (c) 2015 GeometryFactory (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 // 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: GPL-3.0+ // // // Author(s) : Jane Tournois #ifndef CGAL_POLYGON_MESH_PROCESSING_BOUNDING_BOX_H #define CGAL_POLYGON_MESH_PROCESSING_BOUNDING_BOX_H #include #include #include #include #include #include namespace CGAL { namespace Polygon_mesh_processing { /*! * \ingroup PkgPolygonMeshProcessing * computes a bounding box of a polygon mesh. * * @tparam PolygonMesh a model of `HalfedgeListGraph` * @tparam NamedParameters a sequence of \ref pmp_namedparameters "Named Parameters" * * @param pmesh a polygon mesh * @param np optional sequence of \ref pmp_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin * \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of `pmesh`. * If this parameter is omitted, an internal property map for * `CGAL::vertex_point_t` must be available in `PolygonMesh`\cgalParamEnd * \cgalParamBegin{geom_traits} an instance of a geometric traits class, * providing the functor `Construct_bbox_3` and the function * `Construct_bbox_3 construct_bbox_3_object()`. `Construct_bbox_3` * must provide `BBox_3 operator()(Point_3)` where `Point_3` is the value type * of the vertex point map. * \cgalParamEnd * \cgalNamedParamsEnd * * @return a bounding box of `pmesh` */ template CGAL::Bbox_3 bbox(const PolygonMesh& pmesh, const CGAL_PMP_NP_CLASS& np) { using boost::choose_param; using boost::get_param; typename GetVertexPointMap::const_type vpm = choose_param(get_param(np, internal_np::vertex_point), get_const_property_map(CGAL::vertex_point, pmesh)); typedef typename GetGeomTraits::type GT; GT gt = choose_param(get_param(np, internal_np::geom_traits), GT()); typename GT::Construct_bbox_3 get_bbox = gt.construct_bbox_3_object(); typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; halfedge_descriptor h0 = *(halfedges(pmesh).first); CGAL::Bbox_3 bb = get(vpm, target(h0, pmesh)).bbox(); BOOST_FOREACH(halfedge_descriptor h, halfedges(pmesh)) { bb += get_bbox( get(vpm, target(h, pmesh)) ); } return bb; } /*! * \ingroup PkgPolygonMeshProcessing * computes a bounding box of a vertex of a polygon mesh. * * @tparam PolygonMesh a model of `HalfedgeGraph` * @tparam NamedParameters a sequence of \ref pmp_namedparameters "Named Parameters" * * @param vd a descriptor of a vertex in `pmesh` * @param pmesh a polygon mesh * @param np optional sequence of \ref pmp_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin * \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of `pmesh`. * If this parameter is omitted, an internal property map for * `CGAL::vertex_point_t` must be available in `PolygonMesh`\cgalParamEnd * \cgalParamBegin{geom_traits} an instance of a geometric traits class, * providing the functor `Construct_bbox_3` and the function * `Construct_bbox_3 construct_bbox_3_object()`. `Construct_bbox_3` * must provide `BBox_3 operator()(Point_3)` where `Point_3` is the value type * of the vertex point map. * \cgalParamEnd * \cgalNamedParamsEnd * * @return a bounding box of `pmesh` */ template CGAL::Bbox_3 vertex_bbox(typename boost::graph_traits::vertex_descriptor vd, const PolygonMesh& pmesh, const NamedParameters& np) { using boost::choose_param; using boost::get_param; typename GetVertexPointMap::const_type vpm = choose_param(get_param(np, internal_np::vertex_point), get_const_property_map(CGAL::vertex_point, pmesh)); typedef typename GetGeomTraits::type GT; GT gt = choose_param(get_param(np, internal_np::geom_traits), GT()); typename GT::Construct_bbox_3 get_bbox = gt.construct_bbox_3_object(); return get_bbox( get(vpm, vd) ); } /*! * \ingroup PkgPolygonMeshProcessing * computes a bounding box of an edge of a polygon mesh. * * @tparam PolygonMesh a model of `HalfedgeGraph` * @tparam NamedParameters a sequence of \ref pmp_namedparameters "Named Parameters" * * @param ed a descriptor of an edge in `pmesh` * @param pmesh a polygon mesh * @param np optional sequence of \ref pmp_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin * \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of `pmesh`. * If this parameter is omitted, an internal property map for * `CGAL::vertex_point_t` must be available in `PolygonMesh`\cgalParamEnd * \cgalParamBegin{geom_traits} an instance of a geometric traits class, * providing the functor `Construct_bbox_3` and the function * `Construct_bbox_3 construct_bbox_3_object()`. `Construct_bbox_3` * must provide `BBox_3 operator()(Point_3)` where `Point_3` is the value type * of the vertex point map. * \cgalParamEnd * \cgalNamedParamsEnd * * @return a bounding box of `pmesh` */ template CGAL::Bbox_3 edge_bbox(typename boost::graph_traits::edge_descriptor ed, const PolygonMesh& pmesh, const NamedParameters& np) { using boost::choose_param; using boost::get_param; typename GetVertexPointMap::const_type vpm = choose_param(get_param(np, internal_np::vertex_point), get_const_property_map(CGAL::vertex_point, pmesh)); typedef typename GetGeomTraits::type GT; GT gt = choose_param(get_param(np, internal_np::geom_traits), GT()); typename GT::Construct_bbox_3 get_bbox = gt.construct_bbox_3_object(); return get_bbox( get(vpm, source(ed, pmesh)) ) + get_bbox( get(vpm, target(ed, pmesh)) ); } /*! * \ingroup PkgPolygonMeshProcessing * computes a bounding box of a face of a polygon mesh. * * @tparam PolygonMesh a model of `HalfedgeGraph` * @tparam NamedParameters a sequence of \ref pmp_namedparameters "Named Parameters" * * @param fd a descriptor of a face in `pmesh` * @param pmesh a polygon mesh * @param np optional sequence of \ref pmp_namedparameters "Named Parameters" among the ones listed below * * \cgalNamedParamsBegin * \cgalParamBegin{vertex_point_map} the property map with the points associated to the vertices of `pmesh`. * If this parameter is omitted, an internal property map for * `CGAL::vertex_point_t` must be available in `PolygonMesh`\cgalParamEnd * \cgalParamBegin{geom_traits} an instance of a geometric traits class, * providing the functor `Construct_bbox_3` and the function * `Construct_bbox_3 construct_bbox_3_object()`. `Construct_bbox_3` * must provide `BBox_3 operator()(Point_3)` where `Point_3` is the value type * of the vertex point map. * \cgalParamEnd * \cgalNamedParamsEnd * * @return a bounding box of `pmesh` */ template CGAL::Bbox_3 face_bbox(typename boost::graph_traits::face_descriptor fd, const PolygonMesh& pmesh, const NamedParameters& np) { using boost::choose_param; using boost::get_param; typename GetVertexPointMap::const_type vpm = choose_param(get_param(np, internal_np::vertex_point), get_const_property_map(CGAL::vertex_point, pmesh)); typedef typename GetGeomTraits::type GT; GT gt = choose_param(get_param(np, internal_np::geom_traits), GT()); typename GT::Construct_bbox_3 get_bbox = gt.construct_bbox_3_object(); typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; CGAL::Bbox_3 bb; BOOST_FOREACH(halfedge_descriptor h, halfedges_around_face(halfedge(fd, pmesh), pmesh)) { bb += get_bbox( get(vpm, target(h, pmesh)) ); } return bb; } template CGAL::Bbox_3 vertex_bbox(typename boost::graph_traits::vertex_descriptor vd, const PolygonMesh& pmesh) { return vertex_bbox(vd, pmesh, CGAL::Polygon_mesh_processing::parameters::all_default()); } template CGAL::Bbox_3 edge_bbox(typename boost::graph_traits::edge_descriptor ed, const PolygonMesh& pmesh) { return edge_bbox(ed, pmesh, CGAL::Polygon_mesh_processing::parameters::all_default()); } template CGAL::Bbox_3 face_bbox(typename boost::graph_traits::face_descriptor fd, const PolygonMesh& pmesh) { return face_bbox(fd, pmesh, CGAL::Polygon_mesh_processing::parameters::all_default()); } template CGAL::Bbox_3 bbox(const PolygonMesh& pmesh) { return bbox(pmesh, CGAL::Polygon_mesh_processing::parameters::all_default()); } // deprecated function #ifndef CGAL_NO_DEPRECATED_CODE /*! * \ingroup PkgPolygonMeshProcessing * \deprecated This function is deprecated since \cgal 4.10, `CGAL::Polygon_mesh_processing::bbox()` should be used instead. */ template CGAL_DEPRECATED CGAL::Bbox_3 bbox_3(const PolygonMesh& pmesh, const CGAL_PMP_NP_CLASS& np) { return bbox(pmesh, np); } template CGAL_DEPRECATED CGAL::Bbox_3 bbox_3(const PolygonMesh& pmesh) { return bbox(pmesh); } #endif // CGAL_NO_DEPRECATED_CODE } } #endif //CGAL_POLYGON_MESH_PROCESSING_BOUNDING_BOX_H