CARLA
 
载入中...
搜索中...
未找到
test_geom.cpp
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7#include "test.h"
8
10#include <carla/geom/Math.h>
13#include <limits>
14// 定义一个名为carla的命名空间,用于组织相关的代码和类型
15namespace carla {
16// 在carla命名空间内部,再定义一个名为geom的子命名空间
17namespace geom {
18// 重载std::ostream的插入运算符(<<),使其能够处理const Vector3D&类型的参数
19// 这个函数允许我们将Vector3D对象的内容输出到std::ostream对象(如std::cout)中
20 std::ostream &operator<<(std::ostream &out, const Vector3D &vector3D) {
21 // 使用输出流out输出Vector3D对象的坐标值
22 // 输出格式为:{x=x值, y=y值, z=z值}
23 // 其中x、y、z是Vector3D对象中存储的三个坐标分量
24 out << "{x=" << vector3D.x << ", y=" << vector3D.y << ", z=" << vector3D.z << '}';
25 // 返回输出流out的引用,这允许进行链式调用
26 return out;
27 }
28
29} // namespace geom
30} // namespace carla
31
32using namespace carla::geom;
33
34//验证当变换矩阵是单位矩阵(即没有任何变换)时,一个点经过变换后是否保持不变
35TEST(geom, single_point_no_transform) {
36 constexpr double error = 0.001;
37
38 Location translation (0.0, 0.0, 0.0);//平移变换
39 Rotation rotation(0.0, 0.0, 0.0);//旋转变换
40 Transform transform (translation, rotation);//单位变换
41
42 Location point (1.0,1.0,1.0);//创建一个点
43 transform.TransformPoint(point);//将 point 点应用变换
44 Location result_point(1.0, 1.0, 1.0);//表示变换后的点,这里变换后的点与原点相同
45
46 //检查它们是否在指定的误差范围内相等
47 ASSERT_NEAR(point.x, result_point.x, error);
48 ASSERT_NEAR(point.y, result_point.y, error);
49 ASSERT_NEAR(point.z, result_point.z, error);
50
51}
52// 使用 TEST 宏定义一个名为 "geom" 的测试组中的 "single_point_translation" 测试用例,用于验证当仅进行平移变换时,点的坐标是否按照预期进行了正确的平移变化。
53TEST(geom, single_point_translation) {
54 constexpr double error = 0.001;
55 // 创建一个表示平移变换的 Location 对象,坐标分别为 (2.0, 5.0, 7.0),意味着在 x、y、z 方向上分别要进行相应单位的平移操作。
56 Location translation (2.0,5.0,7.0);
57 // 创建一个表示旋转变换的 Rotation 对象,角度值均为 0.0,表示没有旋转操作,因为本测试用例只关注平移变换的效果。
58 Rotation rotation (0.0, 0.0, 0.0);
59 // 使用上述的平移和旋转对象创建一个 Transform 对象,表示仅包含平移操作的坐标变换。
60 Transform transform (translation, rotation);
61
62 // 创建一个坐标为 (0.0, 0.0, 0.0) 的 Location 对象作为原始点,用于观察经过平移变换后的坐标变化情况。
63 Location point (0.0, 0.0, 0.0);
64 // 对原始点应用坐标变换,使其按照设定的平移量进行平移。
65 transform.TransformPoint(point);
66 // 创建一个表示预期平移后结果的 Location 对象,坐标为 (2.0, 5.0, 7.0),即按照前面设定的平移量应该得到的坐标值。
67 Location result_point(2.0, 5.0, 7.0);
68
69 // 检查实际变换后的点(point)和预期结果(result_point)在 x 坐标上是否在指定的误差范围内相等,若超出误差范围则测试失败并输出提示信息。
70 ASSERT_NEAR(point.x, result_point.x, error);
71 // 检查 y 坐标是否在误差范围内相等。
72 ASSERT_NEAR(point.y, result_point.y, error);
73 // 检查 z 坐标是否在误差范围内相等,以此来验证平移变换是否正确生效。
74 ASSERT_NEAR(point.z, result_point.z, error);
75}
76
77
78TEST(geom, single_point_transform_inverse_transform_coherence) {
79 constexpr double error = 0.001;
80
81 // 创建一个表示空间中某一点的 Location 对象,坐标值分别为 (-3.14f, 1.337f, 4.20f),作为原始点,这里使用 float 类型的数值进行初始化,后续会根据实际情况进行相应的类型转换和计算。
82 const Location point(-3.14f, 1.337f, 4.20f);
83 // 创建一个表示平移变换的 Location 对象,坐标分别为 (1.41f, -4.7f, 9.2f),用于构建坐标变换中的平移部分。
84 const Location translation (1.41f, -4.7f, 9.2f);
85 const Rotation rotation (-47.0f, 37.0f, 250.2f);
86 // 使用上述的平移和旋转对象创建一个 Transform 对象,表示完整的坐标变换操作。
87 const Transform transform (translation, rotation);
88 // 创建一个变量 transformed_point,并初始化为原始点 point 的值,用于存储经过坐标变换后的点坐标。
89 auto transformed_point = point;
90 // 对 transformed_point 应用坐标变换,使其按照设定的变换操作进行坐标变换。
91 transform.TransformPoint(transformed_point);
92 // 创建一个变量 point_back_to_normal,并初始化为变换后的点 transformed_point 的值,用于存储经过逆变换后的点坐标,目的是看能否通过逆变换恢复到原始点坐标。
93 auto point_back_to_normal = transformed_point;
94 // 对 point_back_to_normal 应用逆变换操作,尝试将其恢复到原始坐标位置。
95 transform.InverseTransformPoint(point_back_to_normal);
96
97 // 使用 ASSERT_NEAR 宏检查经过逆变换后的点(point_back_to_normal)和原始点(point)在 x 坐标上是否在指定的误差范围内相等,如果不相等则输出相应的提示信息,提示实际得到的 x 坐标值以及预期的 x 坐标值,方便排查问题。
98 ASSERT_NEAR(point.x, point_back_to_normal.x, error) << "result.x is " << point_back_to_normal.x << " but expected " << point.x;
99 // 同理,检查 y 坐标是否在误差范围内相等,并输出相应提示信息。
100 ASSERT_NEAR(point.y, point_back_to_normal.y, error) << "result.y is " << point_back_to_normal.y << " but expected " << point.y;
101 // 检查 z 坐标是否在误差范围内相等,并输出相应提示信息,通过对三个坐标维度的检查来全面验证变换和逆变换操作的连贯性和正确性。
102 ASSERT_NEAR(point.z, point_back_to_normal.z, error) << "result.z is " << point_back_to_normal.z << " but expected " << point.z;
103}
104
105// 使用 TEST 宏定义一个名为 "geom" 的测试组中的 "bbox_get_local_vertices_get_world_vertices_coherence" 测试用例,用于验证包围盒(BoundingBox)的本地顶点坐标和经过坐标变换后的世界坐标顶点之间的一致性,即检查通过不同方式获取的顶点坐标是否符合坐标变换的逻辑关系。
106TEST(geom, bbox_get_local_vertices_get_world_vertices_coherence) {
107 constexpr double error = 0.001;
108 // 创建一个 BoundingBox 对象,通过给定一个中心点坐标 (10.2f, -32.4f, 15.6f) 和一个表示尺寸的 Vector3D 对象 (9.2f, 13.5f, 20.3f) 来初始化包围盒,确定了包围盒在本地坐标系下的位置和大小情况。
109 const BoundingBox bbox (Location(10.2f, -32.4f, 15.6f), Vector3D(9.2f, 13.5f, 20.3f));
110 // 创建一个表示坐标变换中平移部分的 Location 对象,坐标值分别为 (-3.14f, 1.337f, 4.20f),用于确定包围盒在世界坐标系中的平移情况。
111 const Location bbox_location(-3.14f, 1.337f, 4.20f);
112 // 创建一个表示坐标变换中旋转部分的 Rotation 对象,角度值分别为 (-59.0f, 17.0f, -650.2f),用于确定包围盒在世界坐标系中的旋转情况,这样就构建了一个针对包围盒的坐标变换操作。
113 const Rotation bbox_rotation (-59.0f, 17.0f, -650.2f);
114 // 使用上述的平移和旋转对象创建一个 Transform 对象,表示包围盒从本地坐标系到世界坐标系的坐标变换操作。
115 const Transform bbox_transform(bbox_location, bbox_rotation);
116
117 // 调用 BoundingBox 对象的 GetLocalVertices 方法,获取包围盒在本地坐标系下的所有顶点坐标,返回的是一个包含多个 Vector3D 类型顶点的容器(具体类型取决于 GetLocalVertices 方法的实现,这里推测是某种向量容器,比如 std::vector<Vector3D>)。
118 const auto local_vertices = bbox.GetLocalVertices();
119 // 调用 BoundingBox 对象的 GetWorldVertices 方法,传入前面构建的坐标变换对象 bbox_transform,获取包围盒经过坐标变换后在世界坐标系下的所有顶点坐标,同样返回一个顶点坐标的容器。
120 const auto world_vertices = bbox.GetWorldVertices(bbox_transform);
121
122 // 通过循环遍历本地顶点坐标容器中的每个顶点,依次检查每个本地顶点经过坐标变换后是否与对应的世界坐标顶点在误差范围内相等,以此来验证坐标变换的正确性和顶点坐标的一致性。
123 for (auto i = 0u; i < local_vertices.size(); ++i){
124 // 获取当前遍历到的本地顶点坐标的引用,方便后续操作和避免不必要的拷贝。
125 const auto &local_vertex = local_vertices[i];
126
127 // 创建一个变量 transformed_local_vertex,并初始化为当前的本地顶点坐标 local_vertex,用于存储经过坐标变换后的本地顶点坐标,目的是与对应的世界坐标顶点进行比较。
128 auto transformed_local_vertex = local_vertex;
129 // 对 transformed_local_vertex 应用前面定义的包围盒坐标变换操作,使其转换到世界坐标系下的坐标位置。
130 bbox_transform.TransformPoint(transformed_local_vertex);
131
132 // 获取当前遍历到的世界坐标顶点坐标的引用,用于和经过变换后的本地顶点坐标进行比较。
133 const auto &world_vertex = world_vertices[i];
134
135 ASSERT_NEAR(transformed_local_vertex.x, world_vertex.x, error) << "result.x is " << transformed_local_vertex.x << " but expected " << world_vertex.x;
136 ASSERT_NEAR(transformed_local_vertex.y, world_vertex.y, error) << "result.y is " << transformed_local_vertex.y << " but expected " << world_vertex.y;
137 ASSERT_NEAR(transformed_local_vertex.z, world_vertex.z, error) << "result.z is " << transformed_local_vertex.z << " but expected " << world_vertex.z;
138 }
139}
140
141//这段代码包含了两个单元测试,分别测试了旋转变换和平移加旋转变换对 3D 点的影响。
142//第一个测试验证了绕 Y 轴旋转 180 度时,点的 Z 坐标是否正确变换。
143//第二个测试验证了绕 X 轴旋转 90 度并平移后的点坐标是否正确变化。
144//每个测试用例都使用 ASSERT_NEAR 来确保变换后的坐标与预期值相符,允许浮点数计算上的小误差。
145TEST(geom, single_point_translation_and_rotation) {
146 constexpr double error = 0.001; // 设定允许的误差范围
147 // 创建平移变换,(0.0, 0.0, -1.0) 表示点在 Z 轴上向下平移 1 单位
148 Location translation (0.0, 0.0, -1.0);
149 // 创建旋转变换,(90.0, 0.0, 0.0) 表示绕 X 轴旋转 90 度
150 Rotation rotation (90.0, 0.0, 0.0);
151 // 创建一个变换对象,将平移和旋转组合在一起
152 Transform transform (translation, rotation);
153 // 定义一个点 (0.0, 0.0, 2.0),该点位于 Z 轴上,离原点有 2 个单位
154 Location point (0.0, 0.0, 2.0);
155 // 应用变换到该点,transform.TransformPoint(point) 修改 `point` 的值
156 transform.TransformPoint(point);
157 // 定义预期的结果点,绕 X 轴旋转 90 度后,点应该变为 (-2.0, 0.0, -1.0)
158 Location result_point(-2.0, 0.0, -1.0);
159 // 使用 ASSERT_NEAR 来比较实际的点坐标与预期坐标,误差范围是 0.001
160 ASSERT_NEAR(point.x, result_point.x, error); // 检查 x 坐标
161 ASSERT_NEAR(point.y, result_point.y, error); // 检查 y 坐标
162 ASSERT_NEAR(point.z, result_point.z, error); // 检查 z 坐标
163}
164
165TEST(geom, distance) {
166 // 定义一个常量 error,用于在断言中指定容忍的误差范围
167 constexpr double error = .01;
168 // 测试计算两个点之间的距离是否为 0.0,使用 ASSERT_NEAR 检查实际值与期望值的差异是否在误差范围内
169 ASSERT_NEAR(Math::Distance({0, 0, 0}, {0, 0, 0}), 0.0, error);
170 // 测试计算点 (1, 1, 1) 和 (0, 0, 0) 之间的欧几里得距离,期望值为 1.732051(即 sqrt(3))
171 ASSERT_NEAR(Math::Distance({1, 1, 1}, {0, 0, 0}), 1.732051, error);
172 // 测试计算点 (0, 0, 0) 和 (1, 1, 1) 之间的欧几里得距离,期望值与上一测试相同
173 ASSERT_NEAR(Math::Distance({0, 0, 0}, {1, 1, 1}), 1.732051, error);
174 // 测试计算点 (-1, -1, -1) 和 (0, 0, 0) 之间的欧几里得距离,期望值为 1.732051
175 ASSERT_NEAR(Math::Distance({-1, -1, -1}, {0, 0, 0}), 1.732051, error);
176 // 测试计算点 (0, 0, 0) 和 (-1, -1, -1) 之间的欧几里得距离,期望值与上一测试相同
177 ASSERT_NEAR(Math::Distance({0, 0, 0}, {-1, -1, -1}), 1.732051, error);
178 // 测试计算点 (7, 4, 3) 和 (17, 6, 2) 之间的欧几里得距离,期望值为 10.246951
179 ASSERT_NEAR(Math::Distance({7, 4, 3}, {17, 6, 2}), 10.246951, error);
180 // 测试计算点 (7, -4, 3) 和 (-17, 6, 2) 之间的欧几里得距离,期望值为 26.019224
181 ASSERT_NEAR(Math::Distance({7, -4, 3}, {-17, 6, 2}), 26.019224, error);
182 // 测试计算点 (5, 6, 7) 和 (-6, 3, -4) 之间的欧几里得距离,期望值为 15.84298
183 ASSERT_NEAR(Math::Distance({5, 6, 7}, {-6, 3, -4}), 15.84298, error);
184 // 再次测试计算点 (7, 4, 3) 和 (17, 6, 2) 之间的欧几里得距离,期望值与之前相同
185 ASSERT_NEAR(Math::Distance({7, 4, 3}, {17, 6, 2}), 10.246951, error);
186}
187
188//求最近点到线段的距离
189TEST(geom, nearest_point_segment) {
190 // 定义一个包含 3D 空间中多个线段的数组。每个线段由两个点表示,
191 // 每个点有 3 个坐标 (x, y, z),所以每个线段有 6 个数字表示。
192 const float segment[] = {
193 0, 0, 10, 0,// 第一个线段的起点 (0, 0, 10),终点 (0, 0, 0)
194 2, 5, 10, 8,// 第二个线段的起点 (2, 5, 10),终点 (10, 8)
195 -6, 8, 8, -2,// 第三个线段的起点 (-6, 8, 8),终点 (8, -2)
196 8, 2,-10, 3,// 第四个线段的起点 (8, 2, -10),终点 (3, 3)
197 3, 3, -6, -5,// 第五个线段的起点 (3, 3, -6),终点 (-5, -5)
198 3, -3, 2, 5,// 第六个线段的起点 (3, -3, 2),终点 (2, 5)
199 4, -6, 5, 4,// 第七个线段的起点 (4, -6, 5),终点 (4, 4)
200 -1, -4,-10, 8, // 第八个线段的起点 (-1, -4, -10),终点 (8, 8)
201 -7, -5, 5, 5, // 第九个线段的起点 (-7, -5, 5),终点 (5, 5)
202 -5, 6, 3, -9 // 第十个线段的起点 (-5, 6, 3),终点 (-9, -9)
203 };
204
205 //这段代码定义了一个名为 point 的数组,其中包含了 10 个二维点,每个点都是一个 Vector3D 类型的对象。虽然这些点在 3D 空间中定义,但由于 z 坐标全部为零,所以它们实际上都位于 XY 平面内
206 const Vector3D point[] = {
207 { 1, -1, 0}, // 第一个点,坐标为 (1, -1, 0)
208 { 10, 10, 0}, // 第二个点,坐标为 (10, 10, 0)
209 {-10, 10, 0}, // 第三个点,坐标为 (-10, 10, 0)
210 { 10, -10, 0}, // 第四个点,坐标为 (10, -10, 0)
211 {-10, -10, 0}, // 第五个点,坐标为 (-10, -10, 0)
212 { 0, 5, 0}, // 第六个点,坐标为 (0, 5, 0)
213 { 0, -5, 0}, // 第七个点,坐标为 (0, -5, 0)
214 { 1, 4, 0}, // 第八个点,坐标为 (1, 4, 0)
215 { -1, 1, 0}, // 第九个点,坐标为 (-1, 1, 0)
216 { 3, 2.5, 0} // 第十个点,坐标为 (3, 2.5, 0)
217};
218
219 //这段代码定义了一个常量整型数组 results,它包含了 10 个整数,初始化为 { 0, 1, 7, 9, 8, 2, 9, 2, 8, 3 }。由于是常量数组,数组的元素在程序中不可更改。这个数组可能用于存储某种固定的结果或用于其他计算。
220 const int results[] = {
221 0, 1, 7, 9, 8, 2, 9, 2, 8, 3
222 };
223
224//这段代码的主要任务是计算每个点到一系列线段的最短距离,并将计算出的最近线段的索引与预期的 results[i] 进行比较。
225//如果计算的结果与预期不符,ASSERT_EQ 会使测试失败并输出详细的错误信息,帮助开发人员定位问题
226for (int i = 0; i < 10; ++i) { // 外层循环:遍历每个点(共有 10 个点)
227 double min_dist = std::numeric_limits<double>::max(); // 初始化 min_dist 为一个非常大的值,表示最小距离
228 int id = -1; // 用于记录对应线段的索引
229
230 for (int j = 0; j < 40; j += 4) { // 内层循环:遍历所有线段,每个线段由 4 个元素表示(起点和终点的 x, y 坐标)
231
232 // 计算点 point[i] 到当前线段的最小距离
233 const double dist = Math::DistanceSegmentToPoint(
234 point[i], // 当前的点
235 {segment[j + 0], segment[j + 1], 0}, // 当前线段的起点 (x1, y1, 0),注意 z 坐标固定为 0
236 {segment[j + 2], segment[j + 3], 0} // 当前线段的终点 (x2, y2, 0),注意 z 坐标固定为 0
237 ).second; // DistanceSegmentToPoint 返回的是一个 pair,dist 为返回的第二个元素,即最小距离
238
239 // 如果当前计算的距离比已有的最小距离还小,则更新 min_dist 和 id
240 if (dist < min_dist) {
241 min_dist = dist;
242 id = j / 4; // 通过 j / 4 获取当前线段的索引(每个线段由 4 个数字表示)
243 }
244 }
245
246 // 断言:检查计算的线段索引 id 是否与预期的结果 matches `results[i]`
247 ASSERT_EQ(id, results[i]) << "Fails point number: " << i; // 如果 id 不等于预期的 results[i],会输出失败信息
248}
249
250 //这段代码的目标是测试 Rotation 类的 GetForwardVector() 方法是否正确地计算了旋转后的前向向量。
251 //因为浮点数的精度问题,直接使用 == 来比较浮点数是不可靠的,所以这里使用了绝对差值比较,确保两者差异在可以接受的范围内。
252 //通过 EXPECT_TRUE 宏进行断言,如果比较失败,将输出相关的调试信息,帮助开发人员诊断问题
253 TEST(geom, forward_vector) {
254 // 定义一个 lambda 函数 compare,用于比较旋转向量与预期值是否相等
255 auto compare = [](Rotation rotation, Vector3D expected) {
256 // 设置一个浮动误差范围 epsilon,通常用于浮点数比较
257 constexpr float eps = 2.0f * std::numeric_limits<float>::epsilon();
258
259 // 获取由 rotation 对象计算出的前向向量(即旋转后的方向向量)
260 auto result = rotation.GetForwardVector();
261
262 // 使用 EXPECT_TRUE 来判断两个浮点数向量 result 和 expected 是否足够接近
263 // 通过绝对值的差异与 eps 比较,判断是否在误差范围内
264 EXPECT_TRUE(
265 (std::abs(expected.x - result.x) < eps) &&
266 (std::abs(expected.y - result.y) < eps) &&
267 (std::abs(expected.z - result.z) < eps))
268 << "result = " << result << '\n' // 如果断言失败,输出实际的计算结果
269 << "expected = " << expected; // 如果断言失败,输出预期的值
270 };
271
272 // 这里通常会继续调用 compare() 函数进行具体的测试,例如:
273 // compare(rotationInstance, expectedVector);
274}
275 // 物体旋转的角度(姿态) x y z
276 // 比较两个向量:{0.0f, 0.0f, 0.0f} 和 {1.0f, 0.0f, 0.0f}
277// 这里测试的是零向量和单位向量的比较,期望的结果是 {1.0f, 0.0f, 0.0f}
278//这段代码测试的是不同的旋转角度下物体的方向向量(通常是前向向量)的变化。
279 compare({0.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f});
280// 比较两个向量:{0.0f, 0.0f, 123.0f} 和 {1.0f, 0.0f, 0.0f}
281// 这里测试的是 {0.0f, 0.0f, 123.0f} 和单位向量的比较,期望结果为 {1.0f, 0.0f, 0.0f}
282compare({0.0f, 0.0f, 123.0f}, {1.0f, 0.0f, 0.0f});
283// 比较两个向量:{360.0f, 360.0f, 0.0f} 和 {1.0f, 0.0f, 0.0f}
284// 这里测试的是包含大角度旋转(360度)的向量,期望的结果是 {1.0f, 0.0f, 0.0f}。
285// 注意,360度的旋转会回到原始位置。
286compare({360.0f, 360.0f, 0.0f}, {1.0f, 0.0f, 0.0f});
287// 比较两个向量:{0.0f, 90.0f, 0.0f} 和 {0.0f, 1.0f, 0.0f}
288// 这里测试的是绕 Y 轴旋转 90 度后的结果,期望结果是 {0.0f, 1.0f, 0.0f}。
289// 这是因为 90度的旋转将会改变方向,使得向量沿 Y 轴指向上方。
290compare({0.0f, 90.0f, 0.0f}, {0.0f, 1.0f, 0.0f});
291
292// 比较两个向量:{0.0f, -90.0f, 0.0f} 和 {0.0f, -1.0f, 0.0f}
293// 这里测试的是绕 Y 轴旋转 -90 度后的结果,期望结果是 {0.0f, -1.0f, 0.0f}。
294// 旋转 -90度会使得向量指向 Y 轴的负方向。
295compare({0.0f, -90.0f, 0.0f}, {0.0f, -1.0f, 0.0f});
296// 比较两个向量:{90.0f, 0.0f, 0.0f} 和 {0.0f, 0.0f, 1.0f}
297// 这里测试的是绕 X 轴旋转 90 度后的结果,期望结果是 {0.0f, 0.0f, 1.0f}。
298// 旋转 90度后,前向向量会指向 Z 轴的正方向。
299compare({90.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 1.0f});
300// 比较两个向量:{180.0f, -90.0f, 0.0f} 和 {0.0f, 1.0f, 0.0f}
301// 这里测试的是绕 Y 轴旋转 -90度并且绕 X 轴旋转 180度后的结果。
302// 期望的结果是 {0.0f, 1.0f, 0.0f},这意味着旋转后的前向向量沿 Y 轴的正方向。
303compare({180.0f, -90.0f, 0.0f}, {0.0f, 1.0f, 0.0f});
304}
305
306///检查 Math::DistanceArcToPoint 函数能否准确计算点到圆弧的距离,确保其功能在各种情况下都能如预期工作
307TEST(geom, nearest_point_arc) {
308 // 测试 1:计算点 (1, 0, 0) 到圆弧的距离
309 // 圆弧起点在 (0, 0, 0),圆弧的角度跨度是 1.57 弧度,圆弧的半径为 1
310 // 期望距离值为 0.414214,误差容忍范围为 0.01
311 ASSERT_NEAR(Math::DistanceArcToPoint(Vector3D(1, 0, 0), // 点坐标 (1, 0, 0)
312 Vector3D(0, 0, 0), // 圆弧起点 (0, 0, 0)
313 1.57f, // 圆弧角度跨度 (弧度)
314 0, // 圆弧的起始角度
315 1).second, // 圆弧的半径为 1
316 0.414214f, // 预期的距离值
317 0.01f); // 容忍的误差范围
318
319 // 测试 2:计算点 (2, 1, 0) 到圆弧的距离
320 // 圆弧起点在 (0, 0, 0),圆弧的角度跨度是 1.57 弧度,圆弧的半径为 1
321 // 期望距离值为 1.0,误差容忍范围为 0.01
322 ASSERT_NEAR(Math::DistanceArcToPoint(Vector3D(2, 1, 0), // 点坐标 (2, 1, 0)
323 Vector3D(0, 0, 0), // 圆弧起点 (0, 0, 0)
324 1.57f, // 圆弧角度跨度 (弧度)
325 0, // 圆弧的起始角度
326 1).second, // 圆弧的半径为 1
327 1.0f, // 预期的距离值
328 0.01f); // 容忍的误差范围
329
330 // 测试 3:计算点 (0, 1, 0) 到圆弧的距离
331 // 圆弧起点在 (0, 0, 0),圆弧的角度跨度是 1.57 弧度,圆弧的半径为 1
332 // 期望距离值为 1.0,误差容忍范围为 0.01
333 ASSERT_NEAR(Math::DistanceArcToPoint(Vector3D(0, 1, 0), // 点坐标 (0, 1, 0)
334 Vector3D(0, 0, 0), // 圆弧起点 (0, 0, 0)
335 1.57f, // 圆弧角度跨度 (弧度)
336 0, // 圆弧的起始角度
337 1).second, // 圆弧的半径为 1
338 1.0f, // 预期的距离值
339 0.01f); // 容忍的误差范围
340
341 // 测试 4:计算点 (1, 2, 0) 到圆弧的距离
342 // 圆弧起点在 (0, 0, 0),圆弧的角度跨度是 1.57 弧度,圆弧的半径为 1
343 // 期望距离值为 1.0,误差容忍范围为 0.01
344 ASSERT_NEAR(Math::DistanceArcToPoint(Vector3D(1, 2, 0), // 点坐标 (1, 2, 0)
345 Vector3D(0, 0, 0), // 圆弧起点 (0, 0, 0)
346 1.57f, // 圆弧角度跨度 (弧度)
347 0, // 圆弧的起始角度
348 1).second, // 圆弧的半径为 1
349 1.0f, // 预期的距离值
350 0.01f); // 容忍的误差范围
351}
std::array< Location, 8 > GetLocalVertices() const
返回边界框在本地空间中的8个顶点的位置。
std::array< Location, 8 > GetWorldVertices(const Transform &in_bbox_to_world_tr) const
返回边界框在世界空间中的8个顶点的位置。
static std::pair< float, float > DistanceSegmentToPoint(const Vector3D &p, const Vector3D &v, const Vector3D &w)
计算点到线段的距离 返回一个包含:
Definition Math.cpp:24
static auto Distance(const Vector3D &a, const Vector3D &b)
Definition Math.h:90
static std::pair< float, float > DistanceArcToPoint(Vector3D p, Vector3D start_pos, float length, float heading, float curvature)
计算点到弧的距离 返回一个包含:
Definition Math.cpp:50
Vector3D GetForwardVector() const
Definition Rotation.h:64
void TransformPoint(Vector3D &in_point) const
将此变换应用于 in_point(先平移然后旋转)。 具体操作是先根据当前的旋转信息对输入点进行旋转操作,然后再根据当前的位置信息进行平移操作,最终将结果赋值回输入点
void InverseTransformPoint(Vector3D &in_point) const
将此变换的逆运算应用于 in_point 操作顺序为先进行位置上的逆平移(减去位置信息),然后再根据旋转的逆操作对向量进行旋转,最终将结果赋值回输入点
std::ostream & operator<<(std::ostream &out, const Vector3D &vector3D)
Definition test_geom.cpp:20
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
TEST(geom, single_point_no_transform)
Definition test_geom.cpp:35