diff --git a/AABB_tree/include/CGAL/AABB_face_graph_triangle_primitive.h b/AABB_tree/include/CGAL/AABB_face_graph_triangle_primitive.h index 899d488a06b..7d4a51a367d 100644 --- a/AABB_tree/include/CGAL/AABB_face_graph_triangle_primitive.h +++ b/AABB_tree/include/CGAL/AABB_face_graph_triangle_primitive.h @@ -23,8 +23,7 @@ #define CGAL_AABB_FACE_GRAPH_TRIANGLE_PRIMITIVE_H #include -#include -#include +#include #include #include diff --git a/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h b/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h index fb9ce35bb73..998c2de6969 100644 --- a/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h +++ b/AABB_tree/include/CGAL/AABB_halfedge_graph_segment_primitive.h @@ -23,8 +23,7 @@ #define CGAL_AABB_HALFEDGE_GRAPH_SEGMENT_PRIMITIVE_H #include -#include -#include +#include #include #include diff --git a/AABB_tree/include/CGAL/internal/AABB_tree/Halfedge_and_face_graph_property_maps.h b/AABB_tree/include/CGAL/internal/AABB_tree/Halfedge_and_face_graph_property_maps.h new file mode 100644 index 00000000000..b91ec19c60c --- /dev/null +++ b/AABB_tree/include/CGAL/internal/AABB_tree/Halfedge_and_face_graph_property_maps.h @@ -0,0 +1,197 @@ +// Copyright (c) 2012 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$ +// +// +// Author(s) : Sebastien Loriot +// + +#ifndef HALFEDGE_AND_FACE_GRAPH_PROPERTY_MAPS_H +#define HALFEDGE_AND_FACE_GRAPH_PROPERTY_MAPS_H + +#include +#include +#include +#include + +namespace CGAL{ + +//property map +template +struct Triangle_from_face_descriptor_property_map{ + typename boost::remove_const::type* m_graph; + VertexPointPMap m_vppm; + + Triangle_from_face_descriptor_property_map() : m_graph(NULL) + {} + + Triangle_from_face_descriptor_property_map(FaceGraph* g) + : m_graph( const_cast::type*>(g) ), + m_vppm( get(vertex_point, *m_graph) ) + {} + + Triangle_from_face_descriptor_property_map(FaceGraph* g, + VertexPointPMap vppm ) + : m_graph(const_cast::type*>(g)), + m_vppm(vppm) + {} + + typedef typename boost::property_traits< VertexPointPMap >::value_type Point_3; + typedef typename Kernel_traits::Kernel::Triangle_3 Triangle_3; + + //classical typedefs + typedef typename boost::graph_traits::face_descriptor key_type; + typedef Triangle_3 value_type; + typedef value_type reference; + typedef boost::readable_property_map_tag category; + + //get function for property map + inline friend + Triangle_3 + get(const Triangle_from_face_descriptor_property_map& pmap, + typename Triangle_from_face_descriptor_property_map::key_type f) + { + typedef typename boost::property_traits< VertexPointPMap >::value_type Point_3; + typedef typename Kernel_traits::Kernel::Triangle_3 Triangle_3; + typename boost::remove_const::type & g = *(pmap.m_graph); + + CGAL_precondition(halfedge(f,g) == next(next(next(halfedge(f,g),g),g),g)); + const Point_3& a = get(pmap.m_vppm, target(halfedge(f,g),g)); + const Point_3& b = get(pmap.m_vppm, target(next(halfedge(f,g),g),g)); + const Point_3& c = get(pmap.m_vppm,target(next(next(halfedge(f,g),g),g),g)); + + return Triangle_3(a,b,c); + } +}; + + +template < class HalfedgeGraph, + class VertexPointPMap > +struct Segment_from_edge_descriptor_property_map{ + + Segment_from_edge_descriptor_property_map() + {} + +Segment_from_edge_descriptor_property_map(HalfedgeGraph* g) + : m_graph( const_cast::type*>(g) ), + m_vppm( get(vertex_point, *m_graph) ) + {} + + Segment_from_edge_descriptor_property_map(HalfedgeGraph* g, + VertexPointPMap vppm ) + : m_graph( const_cast::type*>(g) ), + m_vppm(vppm) + {} + + //classical typedefs + typedef typename boost::property_traits< VertexPointPMap >::value_type Point; + typedef typename boost::graph_traits::edge_descriptor key_type; + typedef typename Kernel_traits::Kernel::Segment_3 value_type; + typedef value_type reference; + typedef boost::readable_property_map_tag category; + //data + typename boost::remove_const::type* m_graph; + VertexPointPMap m_vppm; + + //get function for property map + inline friend + value_type + get(Segment_from_edge_descriptor_property_map pmap, + key_type h) + { + typedef typename boost::property_traits< VertexPointPMap >::value_type Point; + typedef typename Kernel_traits::Kernel::Segment_3 Segment_3; + + return Segment_3(get(pmap.m_vppm, source(h, *pmap.m_graph) ), + get(pmap.m_vppm, target(h, *pmap.m_graph) ) ); + } +}; + +//property map to access a point from a facet handle +template +struct One_point_from_face_descriptor_property_map{ + + One_point_from_face_descriptor_property_map(FaceGraph* g = NULL) + : m_graph( const_cast::type*>(g) ) + {} + + One_point_from_face_descriptor_property_map(FaceGraph* g, VertexPointPMap vppm ) + : m_graph( const_cast::type*>(g) ), + m_vppm(vppm) + {} + + typename boost::remove_const::type* m_graph; + VertexPointPMap m_vppm; + + //classical typedefs + typedef typename boost::graph_traits::face_descriptor key_type; + typedef typename boost::property_traits< VertexPointPMap >::value_type value_type; + typedef typename boost::property_traits< VertexPointPMap >::reference reference; + typedef boost::lvalue_property_map_tag category; + + //get function for property map + inline friend + reference + get(const One_point_from_face_descriptor_property_map& m, + key_type f) + { + return get(m.m_vppm, target(halfedge(f, *m.m_graph), *m.m_graph)); + } +}; + +//property map to access a point from an edge +template < class HalfedgeGraph, + class VertexPointPMap > +struct Source_point_from_edge_descriptor{ + Source_point_from_edge_descriptor( + HalfedgeGraph* g = NULL ) : + m_graph( const_cast::type*>(g) ), + m_vppm( get(vertex_point, *m_graph) ) + {} + + Source_point_from_edge_descriptor( + HalfedgeGraph* g, + VertexPointPMap vppm ) : + m_graph( const_cast::type*>(g) ), + m_vppm(vppm) + {} + + //classical typedefs + typedef typename boost::property_traits< VertexPointPMap >::value_type value_type; + typedef typename boost::property_traits< VertexPointPMap >::reference reference; + typedef typename boost::graph_traits::edge_descriptor key_type; + typedef boost::readable_property_map_tag category; + //data + typename boost::remove_const::type* m_graph; + VertexPointPMap m_vppm; + + //get function for property map + inline friend + reference + get(Source_point_from_edge_descriptor pmap, + key_type h) + { + return get(vertex_point, + *pmap.m_graph, + source(h, *pmap.m_graph) ); + } +}; + +} //namespace CGAL + +#endif //HALFEDGE_AND_FACE_GRAPH_PROPERTY_MAPS_H