CARLA
 
载入中...
搜索中...
未找到
Rtree.h
浏览该文件的文档.
1// Copyright (c) 2020 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// R树的核心思想是聚合距离相近的节点并在树结构的上一层将其表示为这些节点的最小外接矩形,这个最小外接矩形就成为上一层的一个节点。
5// R树的“R”代表“Rectangle(矩形)”。
6// 参考:https://zh.wikipedia.org/wiki/R%E6%A0%91
7//
8// This work is licensed under the terms of the MIT license.
9// For a copy, see <https://opensource.org/licenses/MIT>.
10
11#pragma once ///预处理器指令,用于确保头文件只被包含一次,以避免重复包含。
12
13#include <vector>
14
15#if defined(__clang__)
16# pragma clang diagnostic push
17# pragma clang diagnostic ignored "-Wshadow"
18#endif
19#include <boost/geometry.hpp>
20#include <boost/geometry/geometries/point.hpp>
21#include <boost/geometry/index/rtree.hpp>
22#if defined(__clang__) // 恢复之前的编译器警告设置。
23# pragma clang diagnostic pop
24#endif
25
26
27namespace carla {
28namespace geom {
29
30 /// PointCloudRtree 类用于处理 3D 点云。
31 ///将类型 T 的元素与 3D 点关联,用于快速 k-NN 搜索。
32 ///
33 template <typename T, size_t Dimension = 3> // 定义模板类 PointCloudRtree,用于处理点云,T 是元素类型,默认维度为 3。
35 public:
36
37 typedef boost::geometry::model::point<float, Dimension, boost::geometry::cs::cartesian> BPoint; // 定义类型别名 BPoint,表示 Boost 几何库中的点。
38 typedef std::pair<BPoint, T> TreeElement; // 定义类型别名 TreeElement,表示 R-tree 中的元素,包含一个点和一个关联元素。
39
40 void InsertElement(const BPoint &point, const T &element) {
41 _rtree.insert(std::make_pair(point, element));
42 } // 成员函数,将一个点和关联元素插入 R-tree。
43
44 void InsertElement(const TreeElement &element) {
45 _rtree.insert(element);
46 } // 成员函数,将一个 TreeElement 插入 R-tree。
47
48 void InsertElements(const std::vector<TreeElement> &elements) {
49 _rtree.insert(elements.begin(), elements.end());
50 } // 成员函数,批量插入多个 TreeElement 到 R-tree。
51
52 /// 返回最近邻元素,可以应用用户定义的过滤器。
53 /// 过滤器接收一个 TreeElement 值作为参数,并且需要
54 /// 返回一个布尔值以接受或拒绝该值
55 /// 例如:[&](Rtree::TreeElement const &element){如果 IsOk(element) 返回 true;
56 /// 否则返回 false;}
57 template <typename Filter>
58 std::vector<TreeElement> GetNearestNeighboursWithFilter(const BPoint &point, Filter 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);
63 // Using explicit operator&& to workaround Bullseye coverage issue
64 // https://www.bullseye.com/help/trouble-logicalOverload.html.
65 _rtree.query(operator&&(nearest, satisfies), std::back_inserter(query_result));
66 return query_result;
67 } // 成员函数模板,返回最近邻元素,可以应用用户定义的过滤器。
68
69 std::vector<TreeElement> GetNearestNeighbours(const BPoint &point, size_t number_neighbours = 1) const {
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));
73 return query_result;
74 } // 成员函数,返回最近邻元素,不使用过滤器。
75
76 size_t GetTreeSize() const {
77 return _rtree.size();
78 } // 成员函数,返回 R-tree 的大小。
79
80 private:
81
82 boost::geometry::index::rtree<TreeElement, boost::geometry::index::linear<16>> _rtree;
83 // 私有成员变量,R-tree 数据结构实例。
84 };
85
86 /// SegmentCloudRtree 类用于处理 3D 线段云
87 /// 将类型 T 的元素与线段的两个端点关联,用于快速 k-NN 搜索。
88 ///
89 template <typename T, size_t Dimension = 3>
91 public:// 定义模板类 SegmentCloudRtree,用于处理线段云,T 是元素类型,默认维度为 3。
92
93 typedef boost::geometry::model::point<float, Dimension, boost::geometry::cs::cartesian> BPoint;
94 typedef boost::geometry::model::segment<BPoint> BSegment;
95 typedef std::pair<BSegment, std::pair<T, T>> TreeElement;
96
97 void InsertElement(const BSegment &segment, const T &element_start, const T &element_end) {
98 _rtree.insert(std::make_pair(segment, std::make_pair(element_start, element_end)));
99 }// 成员函数,将一个线段和两个关联元素插入 R-tree。
100
101 void InsertElement(const TreeElement &element) {
102 _rtree.insert(element);
103 }// 成员函数,将一个 TreeElement 插入 R-tree。
104
105 void InsertElements(const std::vector<TreeElement> &elements) {
106 _rtree.insert(elements.begin(), elements.end());
107 }// 成员函数,批量插入多个 TreeElement 到 R-tree。
108
109 /// 返回带有用户定义过滤器的最近邻元素。
110 /// 过滤器接收一个 TreeElement 值作为参数,并且需要
111 /// 返回一个布尔值以接受或拒绝该值
112 /// 示例过滤器:[&](Rtree::TreeElement const &element){如果 IsOk(element) 返回 true;
113 /// 否则返回 false;}
114 template <typename Geometry, typename Filter>
115 std::vector<TreeElement> GetNearestNeighboursWithFilter(
116 const Geometry &geometry,
117 Filter filter,
118 size_t number_neighbours = 1) const {
119 std::vector<TreeElement> query_result;
120 _rtree.query(
121 boost::geometry::index::nearest(geometry, static_cast<unsigned int>(number_neighbours)) &&
122 boost::geometry::index::satisfies(filter),
123 std::back_inserter(query_result));
124 return query_result;
125 } // 成员函数模板,返回最近邻元素,可以应用用户定义的过滤器。
126
127 template<typename Geometry>
128 std::vector<TreeElement> GetNearestNeighbours(const Geometry &geometry, size_t number_neighbours = 1) const {
129 std::vector<TreeElement> query_result;
130 _rtree.query(
131 boost::geometry::index::nearest(geometry, static_cast<unsigned int>(number_neighbours)),
132 std::back_inserter(query_result));
133 return query_result;
134 } // 成员函数模板,返回最近邻元素,不使用过滤器。
135
136 /// 返回与指定几何形状相交的线段。
137 /// 警告:Boost 库没有实现3D线段间的交集计算。
138 template<typename Geometry>
139 std::vector<TreeElement> GetIntersections(const Geometry &geometry) const {
140 std::vector<TreeElement> query_result;
141 _rtree.query(
142 boost::geometry::index::intersects(geometry),
143 std::back_inserter(query_result));
144 return query_result;
145 } // 成员函数模板,返回与指定几何形状相交的线段。
146
147 size_t GetTreeSize() const {
148 return _rtree.size();
149 } // 成员函数,返回 R-tree 的大小。
150
151 private:
152
153 boost::geometry::index::rtree<TreeElement, boost::geometry::index::linear<16>> _rtree;
154 // 私有成员变量,R-tree 数据结构实例。
155 };
156
157} // namespace geom
158} // namespace carla
PointCloudRtree 类用于处理 3D 点云。 将类型 T 的元素与 3D 点关联,用于快速 k-NN 搜索。
Definition Rtree.h:34
size_t GetTreeSize() const
Definition Rtree.h:76
std::vector< TreeElement > GetNearestNeighbours(const BPoint &point, size_t number_neighbours=1) const
Definition Rtree.h:69
std::pair< BPoint, T > TreeElement
Definition Rtree.h:38
void InsertElement(const BPoint &point, const T &element)
Definition Rtree.h:40
void InsertElements(const std::vector< TreeElement > &elements)
Definition Rtree.h:48
boost::geometry::model::point< float, Dimension, boost::geometry::cs::cartesian > BPoint
Definition Rtree.h:37
void InsertElement(const TreeElement &element)
Definition Rtree.h:44
boost::geometry::index::rtree< TreeElement, boost::geometry::index::linear< 16 > > _rtree
Definition Rtree.h:82
std::vector< TreeElement > GetNearestNeighboursWithFilter(const BPoint &point, Filter filter, size_t number_neighbours=1) const
返回最近邻元素,可以应用用户定义的过滤器。 过滤器接收一个 TreeElement 值作为参数,并且需要 返回一个布尔值以接受或拒绝该值 例如:[&](Rtree::TreeElement const ...
Definition Rtree.h:58
SegmentCloudRtree 类用于处理 3D 线段云 将类型 T 的元素与线段的两个端点关联,用于快速 k-NN 搜索。
Definition Rtree.h:90
boost::geometry::model::point< float, Dimension, boost::geometry::cs::cartesian > BPoint
Definition Rtree.h:93
boost::geometry::model::segment< BPoint > BSegment
Definition Rtree.h:94
std::vector< TreeElement > GetNearestNeighboursWithFilter(const Geometry &geometry, Filter filter, size_t number_neighbours=1) const
返回带有用户定义过滤器的最近邻元素。 过滤器接收一个 TreeElement 值作为参数,并且需要 返回一个布尔值以接受或拒绝该值 示例过滤器:[&](Rtree::TreeElement const ...
Definition Rtree.h:115
void InsertElement(const TreeElement &element)
Definition Rtree.h:101
void InsertElement(const BSegment &segment, const T &element_start, const T &element_end)
Definition Rtree.h:97
std::pair< BSegment, std::pair< T, T > > TreeElement
Definition Rtree.h:95
size_t GetTreeSize() const
Definition Rtree.h:147
std::vector< TreeElement > GetIntersections(const Geometry &geometry) const
返回与指定几何形状相交的线段。 警告:Boost 库没有实现3D线段间的交集计算。
Definition Rtree.h:139
std::vector< TreeElement > GetNearestNeighbours(const Geometry &geometry, size_t number_neighbours=1) const
Definition Rtree.h:128
boost::geometry::index::rtree< TreeElement, boost::geometry::index::linear< 16 > > _rtree
Definition Rtree.h:153
void InsertElements(const std::vector< TreeElement > &elements)
Definition Rtree.h:105
CARLA模拟器的主命名空间。
Definition Carla.cpp:139