2015-07-09 19 views
7

Ciao a tutti capisco che se rtree viene creato con valori di intervallo in boost userebbe l'algoritmo di pacchettizzazione. Ho bisogno di un esempio di rtree usando l'algoritmo di imballaggio. Ecco il mio codice che utilizza algoritmo quadraticoAlgoritmo di pacchettizzazione in rtree in boost

using point = bg::model::point < int, 2, bg::cs::cartesian >; 
    using pointI = std::pair<point, std::size_t>; 
vector<point> contourCenters // has some value 
bgi::rtree< pointI, bgi::quadratic<16> > rtree; 
vector<pointI> cloud; 

for (size_t i = 0; i < contourCenters.size(); ++i) 
{ 
    int x = contourCenters[i].get <0>(); 
    int y = contourCenters[i].get <1>(); 

    cout << "Contour Centers: (" << x << "," << y << ")"; 
    cloud.push_back(mp(x, y, i)); 
    rtree.insert(make_pair(contourCenters[i], i)); 
} 

vorrei creare R-tree con imballaggio algoritmo come sembra essere il più veloce in spinta. Gentilmente guidami come creare un rtree con l'algoritmo di packing in boost.

risposta

6

Avresti solo bisogno di usare il range constructor.

Perché funzioni, l'intervallo deve essere stato creato prima di costruire il rtree. Il modo più semplice per ottenere che nel tuo esempio sarebbe quello di costruire la vostra cloud vettore prima, e poi costruire l'indice da essa:

Live On Coliru

#include <boost/geometry/index/rtree.hpp> 
#include <boost/geometry.hpp> 
#include <boost/geometry/geometries/point.hpp> 
#include <boost/geometry/geometries/box.hpp> 
#include <vector> 
#include <iostream> 

namespace bg = boost::geometry; 
namespace bgi = bg::index; 
using point = bg::model::point <int, 2, bg::cs::cartesian>; 
using pointI = std::pair<point, std::size_t>; 

pointI mp(int x, int y, size_t v) { 
    return std::make_pair(point(x,y), v); 
} 

int main() 
{ 
    std::vector<point> contourCenters; // has some value 
    std::vector<pointI> cloud; 

    size_t id_gen = 0; 
    std::transform(
      contourCenters.begin(), contourCenters.end(), 
      back_inserter(cloud), 
      [&](point const& p) { return std::make_pair(p, id_gen++); } 
     ); 

    for(pointI& pi : cloud) 
     std::cout << "Contour Centers: (" << bg::get<0>(pi.first) << "," << bg::get<1>(pi.first) << ")"; 

    bgi::rtree<pointI, bgi::quadratic<16> > rtree(cloud); 
} 

ho sostituito il ciclo con std::transform per bene stile, ma puoi mantenere il loop come lo avevi.

+0

Grazie per una soluzione elegante. Se vedo la documentazione di boost http://www.boost.org/doc/libs/1_58_0/libs/geometry/doc/html/geometry/spatial_indexes/introduction.html, dice che ci sono quattro varianti di RTree. se questo quadratico rtree diventa placement rtree se inizializzato in questo modo. Cosa succederà se modifico la riga di definizione rtree in: bgi :: rtree > rtree (cloud); – Prem

+0

sarebbe davvero utile se si potesse spiegare un po 'oltre .... – Prem

+0

@Prem: questo costruttore utilizza uno speciale algoritmo di caricamento di massa, quindi non penso che l'algoritmo di imballaggio sia importante a meno che non si aggiungano/rimuovano elementi dall'albero in un secondo momento . – Nemo