алгоритм упаковки в Rtree в Boost

Привет всем, я понимаю, что если rtree создается со значениями диапазона в boost, он будет использовать алгоритм упаковки. Мне нужен пример rtree с использованием алгоритма упаковки. Вот мой код, который использует квадратичный алгоритм

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

Я хотел бы создать дерево с алгоритмом упаковки, так как он кажется самым быстрым в boost. Пожалуйста, объясните мне, как создать дерево с алгоритмом упаковки в boost.

8

Решение

Вам просто нужно использовать конструктор диапазона.

Чтобы это работало, диапазон должен быть создан до построения дерева. Самый простой способ добиться этого в вашем примере — построить cloud вектор, а затем построить индекс из него:

Жить на Колиру

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

Я заменил цикл с std::transform для хорошего стиля, но вы могли бы держать петлю, как у вас было.

7

Другие решения


По вопросам рекламы [email protected]