2015-07-09 5 views
7

Hallo alles, was ich verstehe, wenn rtree mit Range-Werte in Boost erstellt wird, würde Pack-Algorithmus verwenden. Ich brauche ein Beispiel für rtree mit Packing-Algorithmus. Hier ist mein Code, der quadratische AlgorithmusPacking-Algorithmus in Baum 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)); 
} 

verwendet würde Ich mag RTREE zu schaffen, mit Packalgorithmus, wie es scheint eine der schnellsten in Auftrieb zu sein. Bitte führen Sie mich, wie Sie einen Baum mit Pack-Algorithmus in Boost erstellen.

Antwort

6

Sie müssten nur die range constructor verwenden.

Damit dies funktioniert, muss der Bereich vor dem Erstellen des Baums erstellt worden sein. Die einfachste Art und Weise zu erreichen, dass in Ihrem Beispiel zuerst Ihr cloud Vektor zu bauen wäre, und dann den Index von ihm konstruieren:

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

ich die Schleife mit std::transform für gut ersetzt Stil, aber Sie könnten die Schleife beibehalten, wie Sie es hatten.

+0

Danke für eine elegante Lösung. Wenn ich Boost-Dokumentation http://www.boost.org/doc/libs/1_58_0/libs/geometry/doc/html/geometry/spatial_indexes/introduction.html sehe, heißt das, dass es vier Varianten von RTree gibt. Wenn dieser quadratische Baum zu einem Platzierungsbaum wird, wenn er auf diese Weise initialisiert wird. Was passiert, wenn ich die rtree Definitionszeile zu folgendem ändern werde: bgi :: rtree > rtree (cloud); – Prem

+0

wäre wirklich hilfreich, wenn Sie das ein bisschen weiter erklären könnten ... – Prem

+0

@Prem: Dieser Konstruktor verwendet einen speziellen Massenladealgorithmus, also glaube ich nicht, dass der Packalgorithmus eine Rolle spielt, es sei denn, Sie fügen später Elemente aus dem Baum hinzu . – Nemo