From 018fc88945d2b0d1a110e7c3d764cd978ad0f4d2 Mon Sep 17 00:00:00 2001 From: Costas Tsirogiannis Date: Sun, 23 Oct 2005 13:07:08 +0000 Subject: [PATCH] Predicate modifications + addition of filtering on the Intersect_2 construction --- .../hexagon_filtered_predicates.h | 280 ++++++++++-------- 1 file changed, 156 insertions(+), 124 deletions(-) diff --git a/Packages/Curved_kernel/include/CGAL/Filtered_hexagon_curved_kernel/hexagon_filtered_predicates.h b/Packages/Curved_kernel/include/CGAL/Filtered_hexagon_curved_kernel/hexagon_filtered_predicates.h index 148a71daa38..9619acd2e73 100644 --- a/Packages/Curved_kernel/include/CGAL/Filtered_hexagon_curved_kernel/hexagon_filtered_predicates.h +++ b/Packages/Curved_kernel/include/CGAL/Filtered_hexagon_curved_kernel/hexagon_filtered_predicates.h @@ -3,11 +3,14 @@ #ifndef CGAL_HEXAGON_FILTERED_PREDICATES_H #define CGAL_HEXAGON_FILTERED_PREDICATES_H + #include +#include #include #include #include #include +#include #include CGAL_BEGIN_NAMESPACE @@ -27,41 +30,49 @@ class In_range_2 typedef bool result_type; + private: + + template result_type - operator()( const Circular_arc_2 &a, const Circular_arc_point_2 &p) const - { - CGAL_precondition( a.arc().is_x_monotone()); + _in_range_2(const Arc_2 &a, const Circular_arc_point_2 &p) const + { + std::pair pr; + + if(a.has_no_hexagons()) + a.construct_hexagons(); - if(a.has_no_hexagons()) - a.construct_hexagons(); - - typename Circular_arc_2::Hexagon_const_iterator hips; - - Bbox_2 bb = p.bbox(); + typename Arc_2::Hexagon_const_iterator hips; + + pr = to_interval(p.x()); hips=a.hexagons_begin(); - + while(hips!=a.hexagons_end()) { - if( (bb.xmax() >= (*(*hips).left_vertex()).x() && - bb.xmax() <= (*(*hips).right_vertex()).x() ) || - (bb.xmin() >= (*(*hips).left_vertex()).x() && - bb.xmin() <= (*(*hips).right_vertex()).x() ) ) - return CK().in_range_2_object()( a.arc() ,p); - + if( (pr.second >= (*(*hips).left_vertex()).x() && + pr.second <= (*(*hips).right_vertex()).x() ) || + (pr.first >= (*(*hips).left_vertex()).x() && + pr.first <= (*(*hips).right_vertex()).x() ) ) + return CK().in_range_2_object()( a.arc() ,p); + hips++; } return false; + } + + public: + + result_type + operator()( const Circular_arc_2 &a, const Circular_arc_point_2 &p) const + { + CGAL_precondition( a.arc().is_x_monotone()); + return _in_range_2(a,p); } - //Don't used filter - //we must optimize it result_type - operator()( const Line_arc_2 &a, const Circular_arc_point_2 &p) const - { - return CK().in_range_2_object()(a.arc()); - } + operator()( const Line_arc_2 &a, const Circular_arc_point_2 &p) const + { return _in_range_2(a,p);} }; @@ -81,9 +92,7 @@ class Construct_Circular_min_vertex_2 template result_type operator()(const T& a) const - { - return CK().construct_circular_min_vertex_2_object()(a.arc()); - } + { return a.left();} }; @@ -101,9 +110,7 @@ class Construct_Circular_max_vertex_2 template result_type operator()(const T& a) const - { - return CK().construct_circular_max_vertex_2_object()(a.arc()); - } + { return a.right(); } }; @@ -121,9 +128,7 @@ class Is_vertical_2 template result_type operator()(const T& a) const - { - return CK().is_vertical_2_object()(a.arc()); - } + { return CK().is_vertical_2_object()(a.arc()); } }; @@ -144,20 +149,19 @@ class Compare_y_at_x_2 typedef Comparison_result result_type; - result_type - operator()( const Circular_arc_point_2 &p,const Circular_arc_2 &a ) const - { - bool tmp= In_range_2()(a,p) ; - CGAL_kernel_precondition( a.arc().is_x_monotone()); - CGAL_kernel_precondition(tmp); + private: + + template + result_type + _compare_y_at_x_2(const Circular_arc_point_2 &p,const Arc_2 &a) const + { + CGAL_precondition_code(bool tmp=In_range_2()(a,p)); + CGAL_precondition(tmp ); - if((p == a.arc().source()) || (p == a.arc().target())) - return EQUAL; - if(a.has_no_hexagons()) a.construct_hexagons(); - Comparison_result rel_pos; + Comparison_result rel_pos=EQUAL; Bbox_2 bb = p.bbox(); Hexagon pnt_vec; @@ -167,7 +171,7 @@ class Compare_y_at_x_2 pnt_vec.push_back(Point_2(bb.xmax(),bb.ymax())); pnt_vec.push_back(Point_2(bb.xmax(),bb.ymin())); - typename Circular_arc_2::Hexagon_const_iterator hips=a.hexagons_begin(); + typename Arc_2::Hexagon_const_iterator hips=a.hexagons_begin(); while(hips!=a.hexagons_end()) { @@ -180,51 +184,39 @@ class Compare_y_at_x_2 { rel_pos=EQUAL; Hexagon hxgn= *hips; - if(_do_intersect_hexagon_2(hxgn,pnt_vec)) - return CK().compare_y_at_x_2_object()(p,a.arc()); + return CK().compare_y_at_x_2_object()(p,a.arc()); + - bool pred=(hxgn[0].x()!=hxgn[1].x() && hxgn[0].y()!=hxgn[1].y()); - - Orientation side; - Comparison_result temp; - - if(hxgn[pred].y()==hxgn.top_vertex()->y() || (pred && hxgn[0].y()==hxgn.top_vertex()->y() )) - { - side=LEFT_TURN; - temp=LARGER; - } - else - { - side=RIGHT_TURN; - temp=SMALLER; - } - - EK::Point_2 a1(hxgn[0].x(),hxgn[0].y()), a2(hxgn[1].x(),hxgn[1].y()), a3(pnt_vec[0].x(),pnt_vec[0].y()); - if ( EK().orientation_2_object()(a1,a2,a3)==side) - rel_pos=temp; + if ( EK().orientation_2_object()(a1,a2,a3)==RIGHT_TURN) + rel_pos=SMALLER; else - rel_pos=opposite(temp); + rel_pos=LARGER; } hips++; } + return rel_pos; + } - } + public: - //Don't used filter - //we must optimize it - result_type + result_type + operator()( const Circular_arc_point_2 &p,const Circular_arc_2 &a ) const + { + CGAL_kernel_precondition( a.arc().is_x_monotone()); + return _compare_y_at_x_2(p,a); + } + + result_type operator()( const Circular_arc_point_2 &p,const Line_arc_2 &a ) const - { - return CK().compare_y_at_x_2_object()(p,a.arc()); - } + {return _compare_y_at_x_2(p,a);} }; @@ -242,33 +234,12 @@ class Equal_2 typedef bool result_type; + private: - + template result_type - operator()( const Circular_arc_point_2 &a , - const Circular_arc_point_2 &b ) const - { return CK().equal_2_object()(a,b);} - - //Don't used filter - //we must optimize it - result_type - operator()( const Line_arc_2 &a , - const Line_arc_2 &b ) const - { return CK().equal_2_object()(a.arc(),b.arc());} - - template - result_type - operator()( const T1 &a , - const T2 &b ) const - { return false;} - - result_type - operator()( const Circular_arc_2 &a , const Circular_arc_2 &b ) const + _equal_2(const Arc_2 &a,const Arc_2 &b) const { - - CGAL_precondition( a.arc().is_x_monotone()); - CGAL_precondition( b.arc().is_x_monotone()); - if(a.has_no_hexagons()) a.construct_hexagons(); @@ -276,17 +247,16 @@ class Equal_2 b.construct_hexagons(); if(a.hexagon_no() != b.hexagon_no()) - return false; + return false; - - typename Circular_arc_2::Hexagon_const_iterator hips=a.hexagons_begin(), - bips=b.hexagons_begin(); + typename Arc_2::Hexagon_const_iterator hips=a.hexagons_begin(), + bips=b.hexagons_begin(); while(hips!=a.hexagons_end()) { if(hips->size()!=bips->size()) return false; - + for(int j=0;j< hips->size() ;j++) if( (*hips)[j]!=(*bips)[j] ) return false; @@ -295,11 +265,40 @@ class Equal_2 bips++; } - return CK().equal_2_object()( a.arc(),b.arc() ); } + public: + + result_type + operator()( const Circular_arc_point_2 &a , + const Circular_arc_point_2 &b ) const + { return CK().equal_2_object()(a,b);} + + result_type + operator()( const Circular_arc_2 &a , const Circular_arc_2 &b ) const + { + CGAL_precondition( a.arc().is_x_monotone()); + CGAL_precondition( b.arc().is_x_monotone()); + return _equal_2(a,b); + } + + result_type + operator()( const Line_arc_2 &a , + const Line_arc_2 &b ) const + { return _equal_2(a,b);} + + result_type + operator()( const Circular_arc_2 &a , + const Line_arc_2 &b ) const + { return false;} + + result_type + operator()( const Line_arc_2 &a , + const Circular_arc_2 &b ) const + { return false;} + }; @@ -309,44 +308,54 @@ class Do_overlap_2 typedef typename HK::Curved_kernel CK; typedef typename HK::Circular_arc_2 Circular_arc_2; typedef typename HK::Line_arc_2 Line_arc_2; + public: - + typedef bool result_type; - result_type - operator()( const Circular_arc_2 &a , const Circular_arc_2 &b ) const - { + private: - CGAL_precondition( a.arc().is_x_monotone()); - CGAL_precondition( b.arc().is_x_monotone()); - + template + result_type + _do_overlap_2(const Arc_2 &a, const Arc_2 &b) const + { if(a.has_no_hexagons()) a.construct_hexagons(); - if(b.has_no_hexagons()) + if(b.has_no_hexagons()) b.construct_hexagons(); if(do_intersect_hexagons_2( a.hexagons_begin(),a.hexagons_end(),b.hexagons_begin(),b.hexagons_end() ) ) - return CK().do_overlap_2_object()(a.arc(),b.arc()); + return CK().do_overlap_2_object()(a.arc(),b.arc()); return false; - } - //Don't used filter - //we must optimize it + + public: + + result_type + operator()( const Circular_arc_2 &a , const Circular_arc_2 &b ) const + { + CGAL_precondition( a.arc().is_x_monotone()); + CGAL_precondition( b.arc().is_x_monotone()); + return _do_overlap_2(a,b); + } + result_type operator()( const Line_arc_2 &a , const Line_arc_2 &b ) const - { return CK().do_overlap_2_object()(a.arc(),b.arc());} + { return _do_overlap_2(a,b);} - - template result_type - operator()( const T1 &a , - const T2 &b ) const + operator()( const Circular_arc_2 &a , + const Line_arc_2 &b ) const { return false;} + result_type + operator()( const Line_arc_2 &a , + const Circular_arc_2 &b ) const + { return false;} }; @@ -405,7 +414,7 @@ class Do_overlap_2 *res++ = make_object( Circular_arc_2(*tmp_arc) ); } - + return res; } @@ -441,6 +450,14 @@ class Do_overlap_2 operator()(const Circular_arc_2 & c1, const Circular_arc_2 & c2, OutputIterator res) { + if(c1.has_no_hexagons()) + c1.construct_hexagons(); + + if(c2.has_no_hexagons()) + c2.construct_hexagons(); + + if(!do_intersect_hexagons_2(c1.hexagons_begin(),c1.hexagons_end(),c2.hexagons_begin(),c2.hexagons_end()) ) + return res; std::vector vec; @@ -466,6 +483,15 @@ class Do_overlap_2 operator()(const Line_arc_2 & c1, const Line_arc_2 & c2, OutputIterator res) { + if(c1.has_no_hexagons()) + c1.construct_hexagons(); + + if(c2.has_no_hexagons()) + c2.construct_hexagons(); + + if(!do_intersect_hexagons_2(c1.hexagons_begin(),c1.hexagons_end(),c2.hexagons_begin(),c2.hexagons_end()) ) + return res; + std::vector vec; @@ -489,6 +515,15 @@ class Do_overlap_2 operator()(const Circular_arc_2 & c1, const Line_arc_2 & c2, OutputIterator res) { + if(c1.has_no_hexagons()) + c1.construct_hexagons(); + + if(c2.has_no_hexagons()) + c2.construct_hexagons(); + + if(!do_intersect_hexagons_2(c1.hexagons_begin(),c1.hexagons_end(),c2.hexagons_begin(),c2.hexagons_end()) ) + return res; + std::vector vec; @@ -506,8 +541,9 @@ class Do_overlap_2 else *res++ = vec.at(i); } - + return res; + } template < class OutputIterator > @@ -541,14 +577,12 @@ class Do_overlap_2 const Circular_arc_point_2 &p, Circular_arc_2 &ha1, Circular_arc_2 &ha2) const { - Rcirc_arc_2 ca1 , ca2; CK().split_2_object()(A.arc(), p, ca1, ca2); ha1=Circular_arc_2(ca1); ha2=Circular_arc_2(ca2); - } result_type @@ -556,14 +590,12 @@ class Do_overlap_2 const Circular_arc_point_2 &p, Line_arc_2 &ha1, Line_arc_2 &ha2) const { - Rline_arc_2 ca1 , ca2; CK().split_2_object()(A.arc(), p, ca1, ca2); ha1=Line_arc_2(ca1); ha2=Line_arc_2(ca2); - } };