下面是一个示例代码,用于将点云在指定范围内进行等距切片:

#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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录