C++代码:点云等距切片 - 指定范围内的切片
下面是一个示例代码,用于将点云在指定范围内进行等距切片:
#include <iostream>
#include <vector>
struct Point
{
double x;
double y;
double z;
};
std::vector<std::vector<Point>> slicePointCloud(std::vector<Point>& pointCloud, double minX, double maxX, double minY, double maxY, double minZ, double maxZ, double sliceWidth)
{
std::vector<std::vector<Point>> slices;
// 计算切片数量
int numSlicesX = static_cast<int>((maxX - minX) / sliceWidth);
int numSlicesY = static_cast<int>((maxY - minY) / sliceWidth);
int numSlicesZ = static_cast<int>((maxZ - minZ) / sliceWidth);
// 创建切片容器
slices.resize(numSlicesZ);
// 遍历点云
for (int i = 0; i < pointCloud.size(); i++)
{
// 获取当前点
Point& p = pointCloud[i];
// 检查点是否在指定范围内
if (p.x >= minX && p.x <= maxX && p.y >= minY && p.y <= maxY && p.z >= minZ && p.z <= maxZ)
{
// 计算切片索引
int sliceIndexX = static_cast<int>((p.x - minX) / sliceWidth);
int sliceIndexY = static_cast<int>((p.y - minY) / sliceWidth);
int sliceIndexZ = static_cast<int>((p.z - minZ) / sliceWidth);
// 将点添加到对应的切片中
slices[sliceIndexZ].push_back(p);
}
}
return slices;
}
int main()
{
// 创建点云
std::vector<Point> pointCloud = {
{1.0, 2.0, 3.0},
{4.0, 5.0, 6.0},
{7.0, 8.0, 9.0},
{10.0, 11.0, 12.0},
{13.0, 14.0, 15.0}
};
// 切片的范围和宽度
double minX = 1.0;
double maxX = 13.0;
double minY = 2.0;
double maxY = 14.0;
double minZ = 3.0;
double maxZ = 15.0;
double sliceWidth = 2.0;
// 进行切片
std::vector<std::vector<Point>> slices = slicePointCloud(pointCloud, minX, maxX, minY, maxY, minZ, maxZ, sliceWidth);
// 输出切片结果
for (int i = 0; i < slices.size(); i++)
{
std::cout << "Slice " << i << ":" << std::endl;
for (int j = 0; j < slices[i].size(); j++)
{
Point& p = slices[i][j];
std::cout << "(" << p.x << ", " << p.y << ", " << p.z << ")" << std::endl;
}
std::cout << std::endl;
}
return 0;
}
此代码中,slicePointCloud 函数接受一个点云和切片的范围(最小和最大 x、y 和 z 值),以及切片的宽度。它遍历点云,并将在指定范围内的点添加到对应的切片中。最后,它返回一个二维向量,表示切片的结果。在主函数中,我们创建一个点云,并调用 slicePointCloud 函数进行切片。然后,我们遍历切片结果并输出每个切片的点。
原文地址: https://www.cveoy.top/t/topic/o5F0 著作权归作者所有。请勿转载和采集!