// Copyright (c) 2011 GeometryFactory (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org); you may redistribute it under // the terms of the Q Public License version 1.0. // See the file LICENSE.QPL distributed with CGAL. // // 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 CGAL_POLYHEDRON_SIMPLEX_PROPERTY_MAP_H #define CGAL_POLYHEDRON_SIMPLEX_PROPERTY_MAP_H #include #include #include #include #include namespace CGAL{ //property map template struct Triangle_from_facet_handle_property_map{ Triangle_from_facet_handle_property_map(Polyhedron* = NULL){} //classical typedefs typedef typename boost::mpl::if_< typename boost::is_const::type, typename Polyhedron::Facet_const_handle, typename Polyhedron::Facet_handle >::type key_type; typedef typename Polyhedron::Traits::Kernel::Triangle_3 value_type; typedef value_type reference; typedef boost::readable_property_map_tag category; }; //get function for property map template inline typename Polyhedron::Traits::Kernel::Triangle_3 get(Triangle_from_facet_handle_property_map, typename Triangle_from_facet_handle_property_map::key_type f) { typedef typename Polyhedron::Traits::Kernel Kernel; CGAL_precondition(f->halfedge() == f->halfedge()->next()->next()->next()); const typename Kernel::Point_3& a = f->halfedge()->vertex()->point(); const typename Kernel::Point_3& b = f->halfedge()->next()->vertex()->point(); const typename Kernel::Point_3& c = f->halfedge()->next()->next()->vertex()->point(); return typename Kernel::Triangle_3(a,b,c); } template struct Segment_from_edge_descriptor_property_map{ Segment_from_edge_descriptor_property_map(const HalfedgeGraph* g= NULL):m_graph( const_cast(g) ){} //classical typedefs typedef typename boost::property_traits< typename boost::property_map< HalfedgeGraph, vertex_point_t>::type >::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 HalfedgeGraph* m_graph; }; //get function for property map template inline typename Segment_from_edge_descriptor_property_map::value_type get(Segment_from_edge_descriptor_property_map pmap, typename Segment_from_edge_descriptor_property_map::key_type h) { typedef typename boost::property_traits< typename boost::property_map< HalfedgeGraph, vertex_point_t>::type >::value_type Point; typedef typename Kernel_traits::Kernel Kernel; const Point& a = boost::source(h,*pmap.m_graph)->point(); const Point& b = boost::target(h,*pmap.m_graph)->point(); return typename Kernel::Segment_3(a,b); } //property map to access a point from a facet handle template struct One_point_from_facet_handle_property_map{ One_point_from_facet_handle_property_map(Polyhedron* = NULL){} //classical typedefs typedef typename boost::mpl::if_< typename boost::is_const::type, typename Polyhedron::Facet_const_handle, typename Polyhedron::Facet_handle >::type key_type; typedef typename Polyhedron::Traits::Kernel::Point_3 value_type; typedef const value_type& reference; typedef boost::lvalue_property_map_tag category; }; //get function for property map template inline typename One_point_from_facet_handle_property_map::reference get(One_point_from_facet_handle_property_map, typename One_point_from_facet_handle_property_map::key_type f) { return f->halfedge()->vertex()->point(); } //property map to access a point from an edge template struct Source_point_from_edge_descriptor{ Source_point_from_edge_descriptor(const HalfedgeGraph* g= NULL):m_graph( const_cast(g) ){} //classical typedefs typedef typename boost::property_traits< typename boost::property_map< HalfedgeGraph, vertex_point_t>::type >::value_type value_type; typedef typename boost::property_traits< typename boost::property_map< HalfedgeGraph, vertex_point_t>::type >::reference reference; typedef typename boost::graph_traits::edge_descriptor key_type; typedef boost::readable_property_map_tag category; //data HalfedgeGraph* m_graph; }; //get function for property map template inline typename Source_point_from_edge_descriptor::reference get(Source_point_from_edge_descriptor pmap, typename boost::graph_traits::edge_descriptor h) { return boost::source(h,*pmap.m_graph)->point(); } } //namespace CGAL #endif //CGAL_POLYHEDRON_SIMPLEX_PROPERTY_MAP_H