A C++ templated version of this RTree algorithm. The code it now generally compatible with the STL and Boost C++ libraries.
Include RTree.h
. This library is header-only.
#include "RTree.h"
typedef RTree<Foo*, double, 3> MyTree;
MyTree tree;
double min[3] = {0., 0., 0.};
double max[3] = {1., 1., 1.};
Foo* bar = new Foo();
tree.Insert(min, max, bar);
bool MySearchCallback(Foo* value)
{
// do something with `value`, then
// return `true` to keep going, return `false` to stop
return true;
}
// search inside [0,0,0] and [1,1,1], execute callback on each hit
double min[3] = {0., 0., 0.};
double max[3] = {1., 1., 1.};
int nhits = tree.Search(min, max, MySearchCallback);
MyTree::Iterator it;
for(tree.GetFirst(it); !tree.IsNull(it); tree.GetNext(it))
{
Foo* value = tree.GetAt(it);
double boundsMin[3] = {0., 0., 0.};
double boundsMax[3] = {0., 0., 0.};
// save bounds into boundsMin/Max
it.GetBounds(boundsMin, boundsMax);
cout << boundsMin[0] << "," << boundsMin[1] << "," << boundsMin[2] << ","
<< boundsMax[0] << "," << boundsMax[1] << "," << boundsMax[2] << ")\n";
}
or
MyTree::Iterator it;
tree.GetFirst(it);
while(!it.IsNull())
{
Foo* value = *it;
++it;
}
Listing all boxes in the tree, including the parent boxes that were not inserted but form the RTree internally:
auto list = tree.ListTree();
int counter = 0;
for (auto aabb : list) {
cout << "TreeList [" << counter++ << "]: "
<< aabb.m_min[0] << ", "
<< aabb.m_min[1] << ", "
<< aabb.m_min[2] << "; "
<< aabb.m_max[0] << ", "
<< aabb.m_max[1] << ", "
<< aabb.m_max[2] << endl;
}
For working examples see the tests.
This uses CMake, which download GTest.
mkdir build
cd build
cmake ..
make
make test
# or
cmake -S . -B build
cmake --build build
cd build
ctest
Or use the IDE of your choice (tested with VSCode) and run the tests.
The RTree itself is a single header file and can be included without compiling.
Original code was taken from http://www.superliminal.com/sources/sources.htm and is stored as git revision 0. This revision is entirely free for all uses. Enjoy!
Due to restrictions on public domain in certain jurisdictions, code contributed by Yariv Barkan is released in these jurisdictions under the BSD, MIT or the GPL - you may choose one or more, whichever that suits you best.
In jurisdictions where public domain property is recognized, the user of this software may choose to accept it either 1) as public domain, 2) under the conditions of the BSD, MIT or GPL or 3) any combination of public domain and one or more of these licenses.
Thanks Baptiste Lepilleur for the licensing idea.
std::function