大家好,我知道如果在 boost 中使用范围值创建 rtree,它将使用打包算法。我需要一个使用打包算法的 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));
}
我想用打包算法创建 rtree,因为它似乎是 boost 中最快的算法。请指导我如何在 boost 中使用打包算法创建一个 rtree。
最佳答案
您只需要使用 range constructor .
要使其工作,必须在构建 rtree 之前创建范围。在您的示例中实现这一点的最简单方法是首先构建您的 cloud
vector ,然后从中构建索引:
#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
替换了循环,但您可以保持原来的循环。
关于c++ - boost中rtree中的打包算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31320633/