Predicate modifications + addition of filtering on the Intersect_2 construction

This commit is contained in:
Costas Tsirogiannis 2005-10-23 13:07:08 +00:00
parent 7d29e4c2f1
commit 018fc88945
1 changed files with 156 additions and 124 deletions

View File

@ -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);
}
};