mirror of https://github.com/CGAL/cgal
make the traversal and expand using the traits class
stored in the AABB_tree
This commit is contained in:
parent
3ebb42ea04
commit
79affebe42
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue