2015-07-09 10 views
7

Herkese selamlar rtree, boost aralık değerleri ile oluşturulduğunda ambalajlama algoritmasını kullanır. Paketleme algoritması kullanarak rtree örneğine ihtiyacım var. İşte o boost en hızlı biri olarak göründüğü gibi algoritma ambalaj ile RTree oluşturmak istiyorum kuadratik algoritmasınıPaketleme algoritması rtree içinde boost içinde

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

kullanan benim kodudur. Lütfen bana destek algoritması ile bir rtree oluşturmak için bana rehberlik.

cevap

6

range constructor'u kullanmanız yeterlidir.

Bunun çalışması için, aralığın rtree oluşturulmasından önce oluşturulması gerekir. En basit yolu, örnekte öncelikle cloud vektörü inşa etmek olacağını ulaşmak ve sonra ondan endeksi oluşturmak için: İyi için std::transform ile döngü yerini

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

stil, ama sen sahip olduğu gibi döngüyü tutabilirsin.

+0

Zarif bir çözüm için teşekkürler. Destek belgelerini görüyorsam http://www.boost.org/doc/libs/1_58_0/libs/geometry/doc/html/geometry/spatial_indexes/introduction.html dört tane RTree var. Bu şekilde başlatıldığında bu kuadratik rtree yerleştirme rtree olur. Rtree tanım satırını aşağıdaki gibi değiştirirsem ne olur: bgi :: rtree > rtree (bulut); – Prem

+0

bunu biraz daha açıklayabilseydiniz gerçekten yardımcı olur .... – Prem

+0

@Prem: Bu kurucu özel bir toplu yükleme algoritması kullanır, bu yüzden daha sonra ağaçtan öğe eklemediğiniz sürece paketleme algoritmasının önemli olmadığını düşünüyorum. . – Nemo