#ifndef POLYGON_TRIANGULATION_TRAITS_2 #define POLYGON_TRIANGULATION_TRAITS_2 #include #include #include #include #include #include namespace CGAL { template < class Node, class Result> struct Project_halfedge_source_point { typedef Node argument_type; typedef Result result_type; const Result& operator()( const Node& x) { return x.source()->point(); } Result& operator()( Node& x) { return x.source()->point(); } }; template class Ccb_halfedge_bidirectional_circulator : public Ccb_halfedge_circulator { typedef Ccb_halfedge_circulator Base; typedef Ccb_halfedge_bidirectional_circulator Self; public: Ccb_halfedge_bidirectional_circulator() : Base() {} Ccb_halfedge_bidirectional_circulator(const Base& fc) : Base(fc) {} Self& operator--() { Base prev; //if( (*this)->source()->degree() <= 2) // prev = (*this)->twin()->next_halfedge()->twin(); //else { prev = (*this)->twin(); while( prev->next_halfedge() != *this) prev = prev->next_halfedge()->twin(); //} *this = prev; return *this; } Self operator--(int) { Self tmp = *this; --*this; return tmp; } }; template class Polygon_triangulation_traits_2 { private: typedef Kernel_ Kernel; public: typedef typename Kernel::Point_2 Point_2; typedef typename Kernel::Triangle_2 Triangle_2; typedef Pm_segment_traits_2 Pm_segment_traits_2; typedef Pm_default_dcel Dcel; typedef Planar_map_2< Dcel, Pm_segment_traits_2> Planar_map_2; typedef Circulator_project< Ccb_halfedge_bidirectional_circulator< typename Planar_map_2::Ccb_halfedge_circulator>, Project_halfedge_source_point< typename Planar_map_2::Halfedge, Point_2>, Point_2&, Point_2* > Circulator_project; typedef std::pair< Circulator_project, Circulator_project> Diagonal; typedef Partition_traits_2 Partition_traits_2; typedef Monotone_polygon_triangulation_traits_2 Monotone_polygon_triangulation_traits_2; }; } #endif // POLYGON_TRIANGULATION_TRAITS_2