También puede revisar la rtree variantes proporcionada por el Boost.Geometry de biblioteca:
http://www.boost.org/doc/libs/release/libs/geometry/doc/html/geometry/spatial_indexes.html
aplicación Boost.Geometry RTree permite el almacenamiento de valores de tipo arbitrario en el índice espacial y la realización de consultas complejas. Los parámetros como los elementos de nodo máximo se pueden pasar como parámetros de compilación o tiempo de ejecución. Es compatible con la semántica de movimiento C++ 11 también emulada en compiladores anteriores a C++ 11 gracias a Boost.Move. También es compatible con asignadores con estado que permiten, p. para almacenar el rtree en una memoria compartida usando Boost.Interprocess. Y es rápido.
En el lado negativo, el almacenamiento actualmente persistente aún no es compatible, por lo que si necesita más que el índice espacial en memoria, probablemente debería consultar una de las otras bibliotecas mencionadas.
Ejemplo rápido:
Probablemente el caso de uso más común es cuando vaya a guardar algunos objetos geométricos en un recipiente y sus cuadros delimitadores con algunos ids en el índice espacial. En caso de Boost.Geometry rtree esto podría tener este aspecto:
#include <boost/geometry.hpp>
#include <boost/geometry/index/rtree.hpp>
#include <vector>
namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
/* The definition of my_object type goes here */
int main()
{
typedef bg::model::point<float, 2, bg::cs::cartesian> point;
typedef bg::model::box<point> box;
typedef std::pair<box, size_t> value;
std::vector<my_object> objects;
/* Fill objects */
// create the R* variant of the rtree
bgi::rtree< value, bgi::rstar<16> > rtree;
// insert some values to the rtree
for (size_t i = 0 ; i < objects.size() ; ++i)
{
// create a box
box b = objects[i].calculate_bounding_box();
// insert new value
rtree.insert(std::make_pair(b, i));
}
// find values intersecting some area defined by a box
box query_box(point(0, 0), point(5, 5));
std::vector<value> result_s;
rtree.query(bgi::intersects(query_box), std::back_inserter(result_s));
// find 5 nearest values to a point
std::vector<value> result_n;
rtree.query(bgi::nearest(point(0, 0), 5), std::back_inserter(result_n));
return 0;
}
todavía creo que estas versiones carecen de versatibility, pero, bueno, parece bien usar –
Bother versiones necesitan una opción de tiempo de compilación de la dimensionalidad de datos que los hace inútiles (para mí). –
@MichaelNett: ¿Estás bajando la votación porque las implementaciones de código abierto a las que me he referido te son inútiles? –