16# pragma clang diagnostic push
17# pragma clang diagnostic ignored "-Wshadow"
19#include <boost/geometry.hpp>
20#include <boost/geometry/geometries/point.hpp>
21#include <boost/geometry/index/rtree.hpp>
23# pragma clang diagnostic pop
33 template <
typename T,
size_t Dimension = 3>
37 typedef boost::geometry::model::point<float, Dimension, boost::geometry::cs::cartesian>
BPoint;
41 _rtree.insert(std::make_pair(point, element));
49 _rtree.insert(elements.begin(), elements.end());
57 template <
typename Filter>
59 size_t number_neighbours = 1)
const {
60 std::vector<TreeElement> query_result;
61 auto nearest = boost::geometry::index::nearest(point,
static_cast<unsigned int>(number_neighbours));
62 auto satisfies = boost::geometry::index::satisfies(filter);
65 _rtree.query(
operator&&(nearest, satisfies), std::back_inserter(query_result));
70 std::vector<TreeElement> query_result;
71 _rtree.query(boost::geometry::index::nearest(point,
static_cast<unsigned int>(number_neighbours)),
72 std::back_inserter(query_result));
82 boost::geometry::index::rtree<TreeElement, boost::geometry::index::linear<16>>
_rtree;
89 template <
typename T,
size_t Dimension = 3>
93 typedef boost::geometry::model::point<float, Dimension, boost::geometry::cs::cartesian>
BPoint;
94 typedef boost::geometry::model::segment<BPoint>
BSegment;
98 _rtree.insert(std::make_pair(segment, std::make_pair(element_start, element_end)));
106 _rtree.insert(elements.begin(), elements.end());
114 template <
typename Geometry,
typename Filter>
116 const Geometry &geometry,
118 size_t number_neighbours = 1)
const {
119 std::vector<TreeElement> query_result;
121 boost::geometry::index::nearest(geometry,
static_cast<unsigned int>(number_neighbours)) &&
122 boost::geometry::index::satisfies(filter),
123 std::back_inserter(query_result));
127 template<
typename Geometry>
129 std::vector<TreeElement> query_result;
131 boost::geometry::index::nearest(geometry,
static_cast<unsigned int>(number_neighbours)),
132 std::back_inserter(query_result));
138 template<
typename Geometry>
140 std::vector<TreeElement> query_result;
142 boost::geometry::index::intersects(geometry),
143 std::back_inserter(query_result));
153 boost::geometry::index::rtree<TreeElement, boost::geometry::index::linear<16>>
_rtree;
PointCloudRtree 类用于处理 3D 点云。 将类型 T 的元素与 3D 点关联,用于快速 k-NN 搜索。
size_t GetTreeSize() const
std::vector< TreeElement > GetNearestNeighbours(const BPoint &point, size_t number_neighbours=1) const
std::pair< BPoint, T > TreeElement
void InsertElement(const BPoint &point, const T &element)
void InsertElements(const std::vector< TreeElement > &elements)
boost::geometry::model::point< float, Dimension, boost::geometry::cs::cartesian > BPoint
void InsertElement(const TreeElement &element)
boost::geometry::index::rtree< TreeElement, boost::geometry::index::linear< 16 > > _rtree
std::vector< TreeElement > GetNearestNeighboursWithFilter(const BPoint &point, Filter filter, size_t number_neighbours=1) const
返回最近邻元素,可以应用用户定义的过滤器。 过滤器接收一个 TreeElement 值作为参数,并且需要 返回一个布尔值以接受或拒绝该值 例如:[&](Rtree::TreeElement const ...
SegmentCloudRtree 类用于处理 3D 线段云 将类型 T 的元素与线段的两个端点关联,用于快速 k-NN 搜索。
boost::geometry::model::point< float, Dimension, boost::geometry::cs::cartesian > BPoint
boost::geometry::model::segment< BPoint > BSegment
std::vector< TreeElement > GetNearestNeighboursWithFilter(const Geometry &geometry, Filter filter, size_t number_neighbours=1) const
返回带有用户定义过滤器的最近邻元素。 过滤器接收一个 TreeElement 值作为参数,并且需要 返回一个布尔值以接受或拒绝该值 示例过滤器:[&](Rtree::TreeElement const ...
void InsertElement(const TreeElement &element)
void InsertElement(const BSegment &segment, const T &element_start, const T &element_end)
std::pair< BSegment, std::pair< T, T > > TreeElement
size_t GetTreeSize() const
std::vector< TreeElement > GetIntersections(const Geometry &geometry) const
返回与指定几何形状相交的线段。 警告:Boost 库没有实现3D线段间的交集计算。
std::vector< TreeElement > GetNearestNeighbours(const Geometry &geometry, size_t number_neighbours=1) const
boost::geometry::index::rtree< TreeElement, boost::geometry::index::linear< 16 > > _rtree
void InsertElements(const std::vector< TreeElement > &elements)