mirror of https://github.com/CGAL/cgal
Make the accelerate_distance_query() lazy and add a function to disable it.
This commit is contained in:
parent
16c173346b
commit
15d42d6cd2
|
|
@ -806,7 +806,6 @@ void Scene::build_facet_tree()
|
||||||
timer.start();
|
timer.start();
|
||||||
std::cout << "Construct Facet AABB tree...";
|
std::cout << "Construct Facet AABB tree...";
|
||||||
m_facet_tree.rebuild(faces(*m_pPolyhedron).first, faces(*m_pPolyhedron).second,*m_pPolyhedron);
|
m_facet_tree.rebuild(faces(*m_pPolyhedron).first, faces(*m_pPolyhedron).second,*m_pPolyhedron);
|
||||||
m_facet_tree.accelerate_distance_queries();
|
|
||||||
std::cout << "done (" << timer.time() << " s)" << std::endl;
|
std::cout << "done (" << timer.time() << " s)" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -826,7 +825,6 @@ void Scene::build_edge_tree()
|
||||||
timer.start();
|
timer.start();
|
||||||
std::cout << "Construct Edge AABB tree...";
|
std::cout << "Construct Edge AABB tree...";
|
||||||
m_edge_tree.rebuild(edges(*m_pPolyhedron).first,edges(*m_pPolyhedron).second,*m_pPolyhedron);
|
m_edge_tree.rebuild(edges(*m_pPolyhedron).first,edges(*m_pPolyhedron).second,*m_pPolyhedron);
|
||||||
m_edge_tree.accelerate_distance_queries();
|
|
||||||
std::cout << "done (" << timer.time() << " s)" << std::endl;
|
std::cout << "done (" << timer.time() << " s)" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -185,7 +185,7 @@ namespace CGAL {
|
||||||
clear_nodes();
|
clear_nodes();
|
||||||
m_primitives.clear();
|
m_primitives.clear();
|
||||||
clear_search_tree();
|
clear_search_tree();
|
||||||
m_default_search_tree_constructed = false;
|
m_default_search_tree_constructed = m_use_lazy_kd_tree;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the axis-aligned bounding box of the whole tree.
|
/// Returns the axis-aligned bounding box of the whole tree.
|
||||||
|
|
@ -439,6 +439,9 @@ public:
|
||||||
/// a point set taken on the internal primitives
|
/// a point set taken on the internal primitives
|
||||||
/// returns `true` iff successful memory allocation
|
/// returns `true` iff successful memory allocation
|
||||||
bool accelerate_distance_queries() const;
|
bool accelerate_distance_queries() const;
|
||||||
|
///Turns off the lazy construction of the internal search tree.
|
||||||
|
/// Must be called before the first distance query.
|
||||||
|
void do_not_accelerate_distance_queries() const;
|
||||||
|
|
||||||
/// Constructs an internal KD-tree containing the specified point
|
/// Constructs an internal KD-tree containing the specified point
|
||||||
/// set, to be used as the set of potential hints for accelerating
|
/// set, to be used as the set of potential hints for accelerating
|
||||||
|
|
@ -590,6 +593,7 @@ public:
|
||||||
// search KD-tree
|
// search KD-tree
|
||||||
mutable const Search_tree* m_p_search_tree;
|
mutable const Search_tree* m_p_search_tree;
|
||||||
mutable bool m_search_tree_constructed;
|
mutable bool m_search_tree_constructed;
|
||||||
|
mutable bool m_use_lazy_kd_tree;
|
||||||
mutable bool m_default_search_tree_constructed; // indicates whether the internal kd-tree should be built
|
mutable bool m_default_search_tree_constructed; // indicates whether the internal kd-tree should be built
|
||||||
bool m_need_build;
|
bool m_need_build;
|
||||||
|
|
||||||
|
|
@ -610,7 +614,8 @@ public:
|
||||||
, m_p_root_node(nullptr)
|
, m_p_root_node(nullptr)
|
||||||
, m_p_search_tree(nullptr)
|
, m_p_search_tree(nullptr)
|
||||||
, m_search_tree_constructed(false)
|
, m_search_tree_constructed(false)
|
||||||
, m_default_search_tree_constructed(false)
|
, m_use_lazy_kd_tree(true)
|
||||||
|
, m_default_search_tree_constructed(true)
|
||||||
, m_need_build(false)
|
, m_need_build(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
@ -621,10 +626,11 @@ public:
|
||||||
T&& ... t)
|
T&& ... t)
|
||||||
: m_traits()
|
: m_traits()
|
||||||
, m_primitives()
|
, m_primitives()
|
||||||
, m_p_root_node(nullptr)
|
, m_p_root_node(nullptr)
|
||||||
, m_p_search_tree(nullptr)
|
, m_p_search_tree(nullptr)
|
||||||
, m_search_tree_constructed(false)
|
, m_search_tree_constructed(false)
|
||||||
, m_default_search_tree_constructed(false)
|
, m_use_lazy_kd_tree(true)
|
||||||
|
, m_default_search_tree_constructed(true)
|
||||||
, m_need_build(false)
|
, m_need_build(false)
|
||||||
{
|
{
|
||||||
// Insert each primitive into tree
|
// Insert each primitive into tree
|
||||||
|
|
@ -682,7 +688,6 @@ public:
|
||||||
void AABB_tree<Tr>::build()
|
void AABB_tree<Tr>::build()
|
||||||
{
|
{
|
||||||
clear_nodes();
|
clear_nodes();
|
||||||
|
|
||||||
if(m_primitives.size() > 1) {
|
if(m_primitives.size() > 1) {
|
||||||
|
|
||||||
// allocates tree nodes
|
// allocates tree nodes
|
||||||
|
|
@ -704,8 +709,9 @@ public:
|
||||||
// In case the users has switched on the accelerated distance query
|
// In case the users has switched on the accelerated distance query
|
||||||
// data structure with the default arguments, then it has to be
|
// data structure with the default arguments, then it has to be
|
||||||
// /built/rebuilt.
|
// /built/rebuilt.
|
||||||
if(m_default_search_tree_constructed)
|
if(m_default_search_tree_constructed){
|
||||||
build_kd_tree();
|
build_kd_tree();
|
||||||
|
}
|
||||||
m_need_build = false;
|
m_need_build = false;
|
||||||
}
|
}
|
||||||
// constructs the search KD tree from given points
|
// constructs the search KD tree from given points
|
||||||
|
|
@ -737,7 +743,7 @@ public:
|
||||||
ConstPointIterator beyond) const
|
ConstPointIterator beyond) const
|
||||||
{
|
{
|
||||||
m_p_search_tree = new Search_tree(first, beyond);
|
m_p_search_tree = new Search_tree(first, beyond);
|
||||||
m_default_search_tree_constructed = true;
|
m_default_search_tree_constructed = true;
|
||||||
if(m_p_search_tree != nullptr)
|
if(m_p_search_tree != nullptr)
|
||||||
{
|
{
|
||||||
m_search_tree_constructed = true;
|
m_search_tree_constructed = true;
|
||||||
|
|
@ -750,6 +756,15 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename Tr>
|
||||||
|
void AABB_tree<Tr>::do_not_accelerate_distance_queries()const
|
||||||
|
{
|
||||||
|
clear_search_tree();
|
||||||
|
m_use_lazy_kd_tree = false;
|
||||||
|
m_default_search_tree_constructed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// constructs the search KD tree from internal primitives
|
// constructs the search KD tree from internal primitives
|
||||||
template<typename Tr>
|
template<typename Tr>
|
||||||
bool AABB_tree<Tr>::accelerate_distance_queries() const
|
bool AABB_tree<Tr>::accelerate_distance_queries() const
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,13 @@
|
||||||
Release History
|
Release History
|
||||||
===============
|
===============
|
||||||
|
Release 5.1
|
||||||
|
-----------
|
||||||
|
Release date: March 2020
|
||||||
|
|
||||||
|
### 3D Fast Intersection and Distance Computation
|
||||||
|
- **Breaking change**: the internal search tree is now lazily constructed. To disable it, one must call
|
||||||
|
the new function `do_not_accelerate_distance_queries()` before the first distance query.
|
||||||
|
|
||||||
|
|
||||||
Release 5.0
|
Release 5.0
|
||||||
-----------
|
-----------
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue