PCL generates line segment point cloud

  • generate triangle
  • generate parallelogram
  • generate convex hull

pcl generates line segment point cloud

Pcl officially has related functions for generating spheres, cylinders, and cones. It seems that there is no function for generating line segments. It is just needed, so I wrote two by myself, which are generated according to the number and step size.

principle

The principle is very simple. Two three-dimensional points p1 and p2 are known, and the modulus of the direction vector and vector p1p2 is obtained, and then added to the point cloud according to the number and step size of the set points.

// 根据数量
void creatseg(pcl::PointXYZ& p1, pcl::PointXYZ& p2, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, int num) {
    
    
    Eigen::Vector3d k(p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
    if (num<1){
    
    
        print_highlight("点的数量应为大于0的整数");
    }
    else {
    
    
        double delt = k.norm() / num;
        k = k / k.norm();
        cloud->points.resize(num);
        for (auto i = 0; i < num; ++i) {
    
    
            cloud->points[i].x = p2.x + delt * i * k[0];
            cloud->points[i].y = p2.y + delt * i * k[1];
            cloud->points[i].z = p2.z + delt * i * k[2];
        }
        cloud->push_back(p1);
        cloud->push_back(p2);
    }
}
// 根据步长
void creatsegment(pcl::PointXYZ& p1, pcl::PointXYZ& p2, pcl::PointCloud<pcl::PointXYZ> ::Ptr cloud, double delt) {
    
    
    Eigen::Vector3d k(p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
    int num = k.norm() / delt;
    k = k / k.norm();
    cloud->points.resize(num);
    for (auto i = 0; i < num; ++i) {
    
    
        cloud->points[i].x = p2.x + delt * i * k[0];
        cloud->points[i].y = p2.y + delt * i * k[1];
        cloud->points[i].z = p2.z + delt * i * k[2];
    }
    cloud->push_back(p1);
    cloud->push_back(p2);

}

The test code is as follows

#include <pcl/PCLPointCloud2.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/uniform_sampling.h>
#include <pcl/console/print.h>
#include <pcl/console/parse.h>
#include <pcl/console/time.h>

using namespace std;
using namespace pcl;
using namespace pcl::io;
using namespace pcl::console;

void creatseg(pcl::PointXYZ& p1, pcl::PointXYZ& p2, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, int num) {
    
    
    Eigen::Vector3d k(p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
    if (num<1){
    
    
        print_highlight("点的数量应为大于0的整数");
    }
    else {
    
    
        double delt = k.norm() / num;
        k = k / k.norm();
        cloud->points.resize(num);
        for (auto i = 0; i < num; ++i) {
    
    
            cloud->points[i].x = p2.x + delt * i * k[0];
            cloud->points[i].y = p2.y + delt * i * k[1];
            cloud->points[i].z = p2.z + delt * i * k[2];
        }
        cloud->push_back(p1);
        cloud->push_back(p2);
    }
}

void creatsegment(pcl::PointXYZ& p1, pcl::PointXYZ& p2, pcl::PointCloud<pcl::PointXYZ> ::Ptr cloud, double delt) {
    
    
    Eigen::Vector3d k(p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
    int num = k.norm() / delt;
    k = k / k.norm();
    cloud->points.resize(num);
    for (auto i = 0; i < num; ++i) {
    
    
        cloud->points[i].x = p2.x + delt * i * k[0];
        cloud->points[i].y = p2.y + delt * i * k[1];
        cloud->points[i].z = p2.z + delt * i * k[2];
    }
    cloud->push_back(p1);
    cloud->push_back(p2);

}

int main() {
    
    
    pcl::PointXYZ P1(12, 2.3, 7.89), P2(0, 0, 0);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    creatseg(P1, P2, cloud, 10000);
    pcl::io::savePCDFile("line.pcd",*cloud);
    creatsegment(P1, P2, cloud, 0.0001);
    pcl::io::savePCDFile("segment.pcd", *cloud);
}

The generated line segments are shown in the figure below.

insert image description here

Guess you like

Origin blog.csdn.net/Dbojuedzw/article/details/126127391