cgal/Nef_3/triangulation/include/CGAL/Polygon_triangulation_trait...

86 lines
2.3 KiB
C++

#ifndef POLYGON_TRIANGULATION_TRAITS_2
#define POLYGON_TRIANGULATION_TRAITS_2
#include <CGAL/Pm_segment_traits_2.h>
#include <CGAL/Pm_default_dcel.h>
#include <CGAL/Planar_map_2.h>
#include <CGAL/Partition_traits_2.h>
#include <CGAL/Monotone_polygon_triangulation_traits_2.h>
#include <CGAL/Circulator_project.h>
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_circulator>
class Ccb_halfedge_bidirectional_circulator : public Ccb_halfedge_circulator
{
typedef Ccb_halfedge_circulator Base;
typedef Ccb_halfedge_bidirectional_circulator<Ccb_halfedge_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 Kernel_>
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<Kernel> Pm_segment_traits_2;
typedef Pm_default_dcel<Pm_segment_traits_2> 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<Diagonal, Kernel> Partition_traits_2;
typedef Monotone_polygon_triangulation_traits_2<Diagonal, Kernel>
Monotone_polygon_triangulation_traits_2;
};
}
#endif // POLYGON_TRIANGULATION_TRAITS_2