for (const auto& edge : result) // 遍历所有生成树的边
{
    pcl::PointXYZ p0 = cloud1->points[edge.src]; // 在点云cloud里面找到该索引对应的点值
    pcl::PointXYZ p00 = cloud1->points[edge.tgt];

    // 判断叶尖点与找到边两点是否相同,若相同则将该边加入yr点云指针,将该边加入容器yr1
    if ((point56.x == p0.x) && (point56.y == p0.y) && (point56.z == p0.z)) // 如果p0点相同表示p0为叶尖点,将两点加入yr后,再找与叶尖相连的p00点的相连点,会重复加入点
    {
        yr->push_back(p00);
        point56 = p00;
        cout << 'p00(' << p00 << ')' << endl;
    }
    else if ((point56.x == p00.x) && (point56.y == p00.y) && (point56.z == p00.z)) // 如果p00点相同,将两点加入yr后,再找p0点的
    {
        yr->push_back(p0);
        point56 = p0;
        cout << 'p0(' << p0 << ')' << endl;
    }

    bool yes = true;
    for (const auto& point9 : jie->points)
    {
        float x1 = point9.x;
        float y1 = point9.y;
        float z1 = point9.z;
        //cout << point9 << endl;
        if (x1 == point56.x && y1 == point56.y && z1 == point56.z)
        {
            std::cout << '点p与点云文件内的点相同' << std::endl;
            yes = false;
            break; // 停止比较
        }
    }
    if (yes == false) // 注意:这里应该是比较运算符'=='而不是赋值运算符'='
    {
        cout << '触发' << endl;
        break;
    }
}

代码功能解析:

这段代码的功能是遍历一个表示生成树的边集 result。对于每条边,代码执行以下操作:

  1. 获取边的两个顶点: 从点云 cloud1 中检索边的源点 (edge.src) 和目标点 (edge.tgt) 的坐标。
  2. 查找特定点: 检查边的顶点是否与 point56 相匹配。如果匹配,则将匹配的顶点添加到名为 yr 的点云中,并将 point56 更新为匹配的顶点。
  3. 检查重复点: 遍历另一个点云 jie,检查 point56 是否已存在于该点云中。如果找到重复项,则停止遍历 jie 并设置一个标志 (yes)。
  4. 条件退出循环: 如果找到重复点 (yesfalse),则退出遍历边集 result 的循环。

需要注意的是:

  • 代码中使用了 PCL 库来处理点云数据。
  • 在判断 yes 的值时,应该使用比较运算符 == 而不是赋值运算符 =

总而言之,这段代码展示了如何使用 C++ 和 PCL 库处理点云数据,包括遍历图的边、访问点坐标、比较点以及管理点云。

C++ 点云处理:遍历生成树边,查找特定点并构建新点云

原文地址: https://www.cveoy.top/t/topic/fAI6 著作权归作者所有。请勿转载和采集!

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