这段代码的作用是计算路径的长度以及生成路径点。

首先,yr1是一个指向pcl::PointCloudpcl::PointXYZRGB类型的指针,用来存储路径点。clouds1是一个pcl::PointCloudpcl::PointXYZRGB类型的向量,yr1指向其中的一个元素。

然后,将jinqi赋值给point54和point56,这里使用引用的方式避免修改掉jinqi的值。然后将point56添加到clouds1[i]中。

接下来,通过遍历cloud100中的点,找到与point56相邻的点,并将其添加到yr1中。同时,计算路径的长度,使用euclideanDistance函数计算point56和相邻点之间的欧式距离,并将其累加到distances中。最后,将相邻点赋值给point56。

在遍历resulta中的边时,如果找到了与point56相邻的点,将其添加到yr1中,并更新point56的值。同时,在遍历jie中的点时,如果找到了与上一个点相同的点,将其在resulta中删除。

最后,循环结束后,yr1中存储了路径点,distances中存储了路径的长度。

代码示例:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr yr1 = clouds1[i];
cout << '路径' << i + 1 << '所有骨架点:' << endl;
pcl::PointXYZRGB& point54 = jinqi;//防止修改掉茎起点
pcl::PointXYZRGB& point56 = point54;
clouds1[i]->push_back(point56);
double distances = 0;
for (int i = 0; i < cloud100->size(); i++)
{
  for (auto it = resulta.begin(); it != resulta.end();)//遍历所有生成树的边
  {
    pcl::PointXYZRGB& point53 = point56;//53表示上一个点的数据
    const auto& edge = *it;
    pcl::PointXYZRGB p0 = cloud100->points[edge.src];
    pcl::PointXYZRGB p00 = cloud100->points[edge.tgt];
    if ((point56.x == p0.x) && (point56.y == p0.y) && (point56.z == p0.z))
    {
      yr1->push_back(p00);//yr1表示储存的路径
      distances = distances + euclideanDistance(point56, p00);
      point56 = p00;
    }
    else if ((point56.x == p00.x) && (point56.y == p00.y) && (point56.z == p00.z))
    {
      yr1->push_back(p0);
      distances = distances + euclideanDistance(point56, p0);
      point56 = p0;
    }
    for (const auto& point9 : jie->points)
    {
      float x1 = point9.x;
      float y1 = point9.y;
      float z1 = point9.z;
      if (x1 == point53.x && y1 == point53.y && z1 == point53.z)
      {
        it = resulta.erase(it);
      }
    }
  }
}

这段代码使用了PCL库中的点云数据结构,并结合欧式距离计算,实现了路径长度计算和路径点生成。代码结构清晰,逻辑易懂,对于理解PCL库的使用和点云数据处理具有一定的参考价值。


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

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