// ====================================================================== // // Copyright (c) 1997 The CGAL Consortium // // This software and related documentation is part of an INTERNAL release // of the Computational Geometry Algorithms Library (CGAL). It is not // intended for general use. // // ---------------------------------------------------------------------- // // release : // release_date : 1999, October 01 // // file : include/CGAL/bops_Convex_Polygon_2.h // package : bops (2.2) // source : include/CGAL/bops_Convex_Polygon_2.h // revision : $Revision$ // revision_date : $Date$ // author(s) : Wolfgang Freiseisen // // coordinator : RISC Linz // (Wolfgang Freiseisen ) // // // ====================================================================== #ifndef CGAL_BOPS_CONVEX_POLYGON_2_H #define CGAL_BOPS_CONVEX_POLYGON_2_H #include #include #include #include #include #include #include CGAL_BEGIN_NAMESPACE #define CONVEX_INTERSECTION_PROCEDURE // now this proc. will be used template Polygon_2, Container> Convex_Intersection( Polygon_2, Container> P, Polygon_2, Container> Q); template class Bops_Convex_Polygons_2 : public Bops_Polygons_2 { public: typedef CGAL::Vector_2 Vector; typedef typename I::NT NT; typedef typename I::Polygon Polygon; typedef typename I::Point Point; typedef typename I::Segment Segment; typedef typename I::Polygon::Vertex_circulator Vertex_circulator; typedef CGAL::Orientation Orientation; Polygon _pgonA,_pgonB; Bops_Convex_Polygons_2() {} Bops_Convex_Polygons_2(const Polygon& A, const Polygon& B) : _pgonA(A), _pgonB(B) {} virtual ~Bops_Convex_Polygons_2() {} protected: enum InFlag {Unknown, Pin, Qin}; virtual void conditional_insert( InFlag inpgon, InFlag inflag, const Point& pt ) {} // = 0; virtual void handle_special_cases() = 0; void mainProcedure(); bool operation() { # ifdef CONVEX_INTERSECTION_PROCEDURE add_to_result(Convex_Intersection(_pgonA, _pgonB)); # else init(); mainProcedure(); if (_inflag == Unknown) handle_special_cases(); else add_to_result(_pt_list); # endif return empty(); } void insert( const Point& pt ) // inserts a solution point in the point-list { if (!_pt_list.empty() ) { if ( (_pt_list.back() != pt) && (_pt_list.front() != pt) ) _pt_list.push_back(pt); } else _pt_list.push_back(pt); return; } void advancePolygonA() // advance the pointers on polygon A { _aAdv++; _pCir++; _pCir1++; // abortion check _lastaAdv++; _lastbAdv=0; return; } void advancePolygonB() // advance the pointers on polygon B { _bAdv++; _qCir++; _qCir1++; // abortion check _lastbAdv++; _lastaAdv=0; return; } void init() // initialize variables { _lastaAdv = _lastbAdv = 0; _aAdv = _bAdv = 0; _inflag = Unknown; _pCir = _pCir1 = _pgonA.vertices_circulator (); _qCir = _qCir1 = _pgonB.vertices_circulator (); _pCir1--; _qCir1--; return; } bool wentAround() const { return (_aAdv >= _pgonA.size() && _bAdv >= _pgonB.size()) || _lastaAdv > _pgonA.size() || _lastbAdv > _pgonB.size(); } InFlag handleIntersectionPoint(const Point& pt, const Orientation& aHB); InFlag handleIntersectionSegment(const Segment& seg); /* * Variables */ //Polygon _A, _B; int _aAdv, _bAdv; // number of iterations over each polygon Vertex_circulator _pCir, _qCir, _pCir1, _qCir1; // circulators over polygons InFlag _inflag; // which polygon is inside std::list _pt_list; // points forming solution-polynom int _lastaAdv, _lastbAdv; // variables to avoid endless loop }; template struct Bops_Convex_Polygons_2_Intersection : public Bops_Convex_Polygons_2 { Bops_Convex_Polygons_2_Intersection() {} Bops_Convex_Polygons_2_Intersection(const Polygon& A, const Polygon& B) : Bops_Convex_Polygons_2(A,B) {} void conditional_insert(InFlag inPolygon, InFlag inflag, const Point& pt) { if (inflag == inPolygon) insert(pt); return; } void handle_special_cases() { //polygons do not intersect if (_pgonA.bounded_side(*_qCir)==ON_BOUNDED_SIDE) add_to_result(_pgonA); else if (_pgonB.bounded_side(*_pCir)==ON_BOUNDED_SIDE) add_to_result(_pgonB); else add_to_result(_pt_list); } }; CGAL_END_NAMESPACE #ifdef CGAL_CFG_NO_AUTOMATIC_TEMPLATE_INCLUSION #include #endif #endif // CGAL_BOPS_CONVEX_POLYGON_2_H