mirror of https://github.com/CGAL/cgal
Predicate modifications + addition of filtering on the Intersect_2 construction
This commit is contained in:
parent
7d29e4c2f1
commit
018fc88945
|
|
@ -3,11 +3,14 @@
|
|||
#ifndef CGAL_HEXAGON_FILTERED_PREDICATES_H
|
||||
#define CGAL_HEXAGON_FILTERED_PREDICATES_H
|
||||
|
||||
|
||||
#include <cassert>
|
||||
#include <fstream>
|
||||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
#include <CGAL/enum.h>
|
||||
#include <CGAL/Object.h>
|
||||
#include <CGAL/Simple_cartesian.h>
|
||||
#include <CGAL/Interval_arithmetic.h>
|
||||
#include <CGAL/Filtered_hexagon_curved_kernel/hexagon_primitives.h>
|
||||
|
||||
CGAL_BEGIN_NAMESPACE
|
||||
|
|
@ -27,41 +30,49 @@ class In_range_2
|
|||
|
||||
typedef bool result_type;
|
||||
|
||||
private:
|
||||
|
||||
template <class Arc_2>
|
||||
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<double,double> 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 <typename T>
|
||||
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 <typename T>
|
||||
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 <typename T>
|
||||
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<HK>()(a,p) ;
|
||||
CGAL_kernel_precondition( a.arc().is_x_monotone());
|
||||
CGAL_kernel_precondition(tmp);
|
||||
private:
|
||||
|
||||
template <class Arc_2>
|
||||
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<HK>()(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 <class Arc_2>
|
||||
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 <typename T1,typename T2>
|
||||
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 <class Arc_2>
|
||||
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 <typename T1,typename T2>
|
||||
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<Object> 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<Object> 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<Object> 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);
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue