make the traversal and expand using the traits class

stored in the AABB_tree
This commit is contained in:
Sébastien Loriot 2012-05-14 11:54:16 +00:00
parent 3ebb42ea04
commit 79affebe42
5 changed files with 78 additions and 56 deletions

View File

@ -114,7 +114,7 @@ void operator()(PrimitiveIterator first,
}
};
Sort_primitives sort_primitives_object() {return Sort_primitives();}
Sort_primitives sort_primitives_object() const {return Sort_primitives();}
/**
@ -139,7 +139,7 @@ typename AT::Bounding_box operator()(ConstPrimitiveIterator first,
}
};
Compute_bbox compute_bbox_object() {return Compute_bbox();}
Compute_bbox compute_bbox_object() const {return Compute_bbox();}
class Do_intersect {
@ -157,7 +157,7 @@ public:
}
};
Do_intersect do_intersect_object() {return Do_intersect();}
Do_intersect do_intersect_object() const {return Do_intersect();}
class Intersection {
public:
@ -175,7 +175,7 @@ operator()(const Query& query, const typename AT::Primitive& primitive) const
}
};
Intersection intersection_object() {return Intersection();}
Intersection intersection_object() const {return Intersection();}
// This should go down to the GeomTraits, i.e. the kernel
@ -218,8 +218,8 @@ Intersection intersection_object() {return Intersection();}
}
};
Closest_point closest_point_object() {return Closest_point();}
Compare_distance compare_distance_object() {return Compare_distance();}
Closest_point closest_point_object() const {return Closest_point();}
Compare_distance compare_distance_object() const {return Compare_distance();}
private:

View File

@ -108,6 +108,10 @@ namespace CGAL {
clear();
}
const AABBTraits& traits() const{
return m_traits;
}
/// Clears the tree
void clear()
{
@ -232,6 +236,8 @@ public:
}
private:
//Traits class
AABBTraits m_traits;
// set of input primitives
Primitives m_primitives;
// single root node
@ -269,7 +275,8 @@ public:
template<typename Tr>
AABB_tree<Tr>::AABB_tree()
: m_primitives()
: m_traits()
, m_primitives()
, m_p_root_node(NULL)
, m_p_search_tree(NULL)
, m_search_tree_constructed(false)
@ -281,7 +288,8 @@ public:
template<typename ConstPrimitiveIterator>
AABB_tree<Tr>::AABB_tree(ConstPrimitiveIterator first,
ConstPrimitiveIterator beyond)
: m_primitives()
: m_traits()
, m_primitives()
, m_p_root_node(NULL)
, m_p_search_tree(NULL)
, m_search_tree_constructed(false)
@ -346,7 +354,7 @@ public:
}
// constructs the tree
m_p_root_node->expand(m_primitives.begin(), m_primitives.end(), m_primitives.size());
m_p_root_node->expand(m_primitives.begin(), m_primitives.end(), m_primitives.size(),m_traits);
// In case the users has switched on the acceletated distance query
// data structure with the default arguments, then it has to be
@ -411,7 +419,7 @@ public:
{
using namespace CGAL::internal::AABB_tree;
typedef typename AABB_tree<Tr>::AABB_traits AABBTraits;
Do_intersect_traits<AABBTraits, Query> traversal_traits;
Do_intersect_traits<AABBTraits, Query> traversal_traits(m_traits);
this->traversal(query, traversal_traits);
return traversal_traits.is_intersection_found();
}
@ -430,7 +438,7 @@ public:
Counting_iterator out(&counter);
Listing_primitive_traits<AABBTraits,
Query, Counting_iterator> traversal_traits(out);
Query, Counting_iterator> traversal_traits(out,m_traits);
this->traversal(query, traversal_traits);
return counter;
}
@ -444,7 +452,7 @@ public:
using namespace CGAL::internal::AABB_tree;
typedef typename AABB_tree<Tr>::AABB_traits AABBTraits;
Listing_primitive_traits<AABBTraits,
Query, OutputIterator> traversal_traits(out);
Query, OutputIterator> traversal_traits(out,m_traits);
this->traversal(query, traversal_traits);
return out;
}
@ -458,7 +466,7 @@ public:
using namespace CGAL::internal::AABB_tree;
typedef typename AABB_tree<Tr>::AABB_traits AABBTraits;
Listing_intersection_traits<AABBTraits,
Query, OutputIterator> traversal_traits(out);
Query, OutputIterator> traversal_traits(out,m_traits);
this->traversal(query, traversal_traits);
return out;
}
@ -470,7 +478,7 @@ public:
{
using namespace CGAL::internal::AABB_tree;
typedef typename AABB_tree<Tr>::AABB_traits AABBTraits;
First_intersection_traits<AABBTraits, Query> traversal_traits;
First_intersection_traits<AABBTraits, Query> traversal_traits(m_traits);
this->traversal(query, traversal_traits);
return traversal_traits.result();
}
@ -482,7 +490,7 @@ public:
{
using namespace CGAL::internal::AABB_tree;
typedef typename AABB_tree<Tr>::AABB_traits AABBTraits;
First_primitive_traits<AABBTraits, Query> traversal_traits;
First_primitive_traits<AABBTraits, Query> traversal_traits(m_traits);
this->traversal(query, traversal_traits);
return traversal_traits.result();
}
@ -496,7 +504,7 @@ public:
typename Primitive::Id hint_primitive = m_primitives[0].id();
using namespace CGAL::internal::AABB_tree;
typedef typename AABB_tree<Tr>::AABB_traits AABBTraits;
Projection_traits<AABBTraits> projection_traits(hint,hint_primitive);
Projection_traits<AABBTraits> projection_traits(hint,hint_primitive,m_traits);
this->traversal(query, projection_traits);
return projection_traits.closest_point();
}
@ -546,7 +554,7 @@ public:
{
using namespace CGAL::internal::AABB_tree;
typedef typename AABB_tree<Tr>::AABB_traits AABBTraits;
Projection_traits<AABBTraits> projection_traits(hint.first,hint.second);
Projection_traits<AABBTraits> projection_traits(hint.first,hint.second,m_traits);
this->traversal(query, projection_traits);
return projection_traits.closest_point_and_primitive();
}

View File

@ -64,7 +64,8 @@ public:
template<typename ConstPrimitiveIterator>
void expand(ConstPrimitiveIterator first,
ConstPrimitiveIterator beyond,
const std::size_t range);
const std::size_t range,
const AABBTraits&);
/**
* @brief General traversal query
@ -124,12 +125,13 @@ template<typename ConstPrimitiveIterator>
void
AABB_node<Tr>::expand(ConstPrimitiveIterator first,
ConstPrimitiveIterator beyond,
const std::size_t range)
const std::size_t range,
const Tr& traits)
{
m_bbox = AABB_traits().compute_bbox_object()(first, beyond);
m_bbox = traits.compute_bbox_object()(first, beyond);
// sort primitives along longest axis aabb
AABB_traits().sort_primitives_object()(first, beyond, m_bbox);
traits.sort_primitives_object()(first, beyond, m_bbox);
switch(range)
{
@ -140,14 +142,14 @@ AABB_node<Tr>::expand(ConstPrimitiveIterator first,
case 3:
m_p_left_child = &(*first);
m_p_right_child = static_cast<Node*>(this)+1;
right_child().expand(first+1, beyond, 2);
right_child().expand(first+1, beyond, 2,traits);
break;
default:
const std::size_t new_range = range/2;
m_p_left_child = static_cast<Node*>(this) + 1;
m_p_right_child = static_cast<Node*>(this) + new_range;
left_child().expand(first, first + new_range, new_range);
right_child().expand(first + new_range, beyond, range - new_range);
left_child().expand(first, first + new_range, new_range,traits);
right_child().expand(first + new_range, beyond, range - new_range,traits);
}
}

View File

@ -79,20 +79,20 @@ class First_intersection_traits
public:
typedef typename boost::optional<Object_and_primitive_id> Result;
public:
First_intersection_traits()
: m_result()
First_intersection_traits(const AABBTraits& traits)
: m_result(), m_traits(traits)
{}
bool go_further() const { return !m_result; }
void intersection(const Query& query, const Primitive& primitive)
{
m_result = AABBTraits().intersection_object()(query, primitive);
m_result = m_traits.intersection_object()(query, primitive);
}
bool do_intersect(const Query& query, const Node& node) const
{
return AABBTraits().do_intersect_object()(query, node.bbox());
return m_traits.do_intersect_object()(query, node.bbox());
}
Result result() const { return m_result; }
@ -100,6 +100,7 @@ public:
private:
Result m_result;
const AABBTraits& m_traits;
};
@ -120,15 +121,15 @@ class Listing_intersection_traits
typedef typename ::CGAL::AABB_tree<AABBTraits>::size_type size_type;
public:
Listing_intersection_traits(Output_iterator out_it)
: m_out_it(out_it) {}
Listing_intersection_traits(Output_iterator out_it, const AABBTraits& traits)
: m_out_it(out_it), m_traits(traits) {}
bool go_further() const { return true; }
void intersection(const Query& query, const Primitive& primitive)
{
boost::optional<Object_and_primitive_id> intersection;
intersection = AABBTraits().intersection_object()(query, primitive);
intersection = m_traits.intersection_object()(query, primitive);
if(intersection)
{
*m_out_it++ = *intersection;
@ -137,11 +138,12 @@ public:
bool do_intersect(const Query& query, const Node& node) const
{
return AABBTraits().do_intersect_object()(query, node.bbox());
return m_traits.do_intersect_object()(query, node.bbox());
}
private:
Output_iterator m_out_it;
const AABBTraits& m_traits;
};
@ -162,14 +164,14 @@ class Listing_primitive_traits
typedef typename ::CGAL::AABB_tree<AABBTraits>::size_type size_type;
public:
Listing_primitive_traits(Output_iterator out_it)
: m_out_it(out_it) {}
Listing_primitive_traits(Output_iterator out_it, const AABBTraits& traits)
: m_out_it(out_it), m_traits(traits) {}
bool go_further() const { return true; }
void intersection(const Query& query, const Primitive& primitive)
{
if( AABBTraits().do_intersect_object()(query, primitive) )
if( m_traits.do_intersect_object()(query, primitive) )
{
*m_out_it++ = primitive.id();
}
@ -177,11 +179,12 @@ public:
bool do_intersect(const Query& query, const Node& node) const
{
return AABBTraits().do_intersect_object()(query, node.bbox());
return m_traits.do_intersect_object()(query, node.bbox());
}
private:
Output_iterator m_out_it;
const AABBTraits& m_traits;
};
@ -202,15 +205,16 @@ class First_primitive_traits
typedef typename ::CGAL::AABB_tree<AABBTraits>::size_type size_type;
public:
First_primitive_traits()
First_primitive_traits(const AABBTraits& traits)
: m_is_found(false)
, m_result() {}
, m_result()
, m_traits(traits) {}
bool go_further() const { return !m_is_found; }
void intersection(const Query& query, const Primitive& primitive)
{
if( AABBTraits().do_intersect_object()(query, primitive) )
if( m_traits.do_intersect_object()(query, primitive) )
{
m_result = boost::optional<typename Primitive::Id>(primitive.id());
m_is_found = true;
@ -219,7 +223,7 @@ public:
bool do_intersect(const Query& query, const Node& node) const
{
return AABBTraits().do_intersect_object()(query, node.bbox());
return m_traits.do_intersect_object()(query, node.bbox());
}
boost::optional<typename Primitive::Id> result() const { return m_result; }
@ -228,6 +232,7 @@ public:
private:
bool m_is_found;
boost::optional<typename Primitive::Id> m_result;
const AABBTraits& m_traits;
};
/**
@ -247,27 +252,28 @@ class Do_intersect_traits
typedef typename ::CGAL::AABB_tree<AABBTraits>::size_type size_type;
public:
Do_intersect_traits()
: m_is_found(false)
Do_intersect_traits(const AABBTraits& traits)
: m_is_found(false), m_traits(traits)
{}
bool go_further() const { return !m_is_found; }
void intersection(const Query& query, const Primitive& primitive)
{
if( AABBTraits().do_intersect_object()(query, primitive) )
if( m_traits.do_intersect_object()(query, primitive) )
m_is_found = true;
}
bool do_intersect(const Query& query, const Node& node) const
{
return AABBTraits().do_intersect_object()(query, node.bbox());
return m_traits.do_intersect_object()(query, node.bbox());
}
bool is_intersection_found() const { return m_is_found; }
private:
bool m_is_found;
const AABBTraits& m_traits;
};
@ -289,16 +295,18 @@ class Projection_traits
public:
Projection_traits(const Point& hint,
const typename Primitive::Id& hint_primitive)
const typename Primitive::Id& hint_primitive,
const AABBTraits& traits)
: m_closest_point(hint),
m_closest_primitive(hint_primitive)
m_closest_primitive(hint_primitive),
m_traits(traits)
{}
bool go_further() const { return true; }
void intersection(const Point& query, const Primitive& primitive)
{
Point new_closest_point = AABBTraits().closest_point_object()
Point new_closest_point = m_traits.closest_point_object()
(query, primitive, m_closest_point);
if(new_closest_point != m_closest_point)
{
@ -309,7 +317,7 @@ public:
bool do_intersect(const Point& query, const Node& node) const
{
return AABBTraits().compare_distance_object()
return m_traits.compare_distance_object()
(query, node.bbox(), m_closest_point) == CGAL::SMALLER;
}
@ -322,6 +330,7 @@ public:
private:
Point m_closest_point;
typename Primitive::Id m_closest_primitive;
const AABBTraits& m_traits;
};
}}} // end namespace CGAL::internal::AABB_tree

View File

@ -315,15 +315,18 @@ class Naive_implementations
typedef typename Traits::Point_and_primitive_id Point_and_primitive_id;
typedef boost::optional<Object_and_primitive_id> Intersection_result;
const Traits& m_traits;
public:
Naive_implementations(const Traits& traits):m_traits(traits){}
template<typename Query>
bool do_intersect(const Query& query, Polyhedron& p) const
{
Polyhedron_primitive_iterator it = Pr_generator().begin(p);
for ( ; it != Pr_generator().end(p) ; ++it )
{
if ( Traits().do_intersect_object()(query, Pr(it) ) )
if ( m_traits.do_intersect_object()(query, Pr(it) ) )
return true;
}
@ -339,7 +342,7 @@ public:
Polyhedron_primitive_iterator it = Pr_generator().begin(p);
for ( ; it != Pr_generator().end(p) ; ++it )
{
if ( Traits().do_intersect_object()(query, Pr(it) ) )
if ( m_traits.do_intersect_object()(query, Pr(it) ) )
++result;
}
@ -354,7 +357,7 @@ public:
Polyhedron_primitive_iterator it = Pr_generator().begin(p);
for ( ; it != Pr_generator().end(p) ; ++it )
{
if ( Traits().do_intersect_object()(query, Pr(it) ) )
if ( m_traits.do_intersect_object()(query, Pr(it) ) )
*out++ = Pr(it).id();
}
@ -369,7 +372,7 @@ public:
Polyhedron_primitive_iterator it = Pr_generator().begin(p);
for ( ; it != Pr_generator().end(p) ; ++it )
{
Intersection_result intersection = Traits().intersection_object()(query, Pr(it));
Intersection_result intersection = m_traits.intersection_object()(query, Pr(it));
if ( intersection )
*out++ = *intersection;
}
@ -389,7 +392,7 @@ public:
for ( ; it != Pr_generator().end(p) ; ++it )
{
closest_point = Traits().closest_point_object()(query, Pr(it), closest_point);
closest_point = m_traits.closest_point_object()(query, Pr(it), closest_point);
}
return closest_point;
@ -409,7 +412,7 @@ public:
for ( ; it != Pr_generator().end(p) ; ++it )
{
Pr tmp_pr(it);
Point tmp_pt = Traits().closest_point_object()(query, tmp_pr, closest_point);
Point tmp_pt = m_traits.closest_point_object()(query, tmp_pr, closest_point);
if ( tmp_pt != closest_point )
{
closest_point = tmp_pt;
@ -446,7 +449,7 @@ public:
Tree_vs_naive(Tree& tree, Polyhedron& p)
: m_tree(tree)
, m_polyhedron(p)
, m_naive()
, m_naive(m_tree.traits())
, m_naive_time(0)
, m_tree_time(0) {}