Giter Club home page Giter Club logo

nushoin-rtree's Introduction

R-Trees: A Dynamic Index Structure for Spatial Searching

Description

A C++ templated version of this RTree algorithm. The code it now generally compatible with the STL and Boost C++ libraries.

Usage

Inserting

#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);

Searching

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

Iterating

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 Test.cpp.

Testing

Run make to build and make test to run the tests. The RTree itself is a single header file and can be included without compiling.

Authors

  • 1983 Original algorithm and test code by Antonin Guttman and Michael Stonebraker, UC Berkely
  • 1994 ANCI C ported from original test code by Melinda Green - [email protected]
  • 1995 Sphere volume fix for degeneracy problem submitted by Paul Brook
  • 2004 Templated C++ port by Greg Douglas
  • 2011 Modified the container to support more data types, by Yariv Barkan
  • 2017 Modified Search to take C++11 function to allow lambdas and added const qualifier, by Gero Mueller

License

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.

Recent Change Log

31 Jan 2018

  • Added copy constructor
  • Callback function is now std::function

05 Apr 2014

  • Added tests

02 Sep 2011

  • Modified the container to support more data types. The code it now generally compatible with the STL and Boost C++ libraries.

05 Jan 2010

  • Fixed Iterator GetFirst() - Previous fix was not incomplete

03 Dec 2009

  • Added Iteartor GetBounds()
  • Added Iterator usage to simple test
  • Fixed Iterator GetFirst() - Thanks Mathew Riek
  • Minor updates for MSVC 2005/08 compilers

nushoin-rtree's People

Contributors

alexvonb avatar geromueller avatar penify-dev[bot] avatar

Watchers

Robert Bongart (MSc MSc MA) avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.