#include<pcl/point_cloud.h>
#include<pcl/point_types.h>
#include<pcl/visualization/pcl_visualizer.h> //cout endl
#include <pcl/common/distances.h>
typedef pcl::PointXYZ PointT;
int main()
{
//(1)计算俩条异面直线的最短线段
//line_a:前三个是坐标,后三个是向量
Eigen::VectorXf line_a(6);
line_a(0) = 0;
line_a(1) = 0;
line_a(2) = 0;
line_a(3) = 2;
line_a(4) = 0;
line_a(5) = 0;
Eigen::VectorXf line_b(6);
line_b(0) = 0;
line_b(1) = 0;
line_b(2) = 3;
line_b(3) = 0;
line_b(4) = 2;
line_b(5) = 0;
Eigen::Vector4f pt1_seg;
Eigen::Vector4f pt2_seg;
pcl::lineToLineSegment(line_a, line_b, pt1_seg, pt2_seg);
//(2)计算点到异面直线的距离平方,原理(平行四边形面积÷底边模长=高)
//pt(2,0,0)为原始点
//line_pt(0,0,0)为异面直线的出发点,line_dir(2,1,0)为异面直线的向量;
Eigen::Vector4f pt = { 2,0,0,0 };
Eigen::Vector4f line_pt = { 0,0,0,0 };
Eigen::Vector4f line_dir = { 2,1,0,0 };
auto dis = pcl::sqrPointToLineDistance(pt, line_pt, line_dir);
cout << "点到异面直线的距离平方:"<<dis << endl;
//(3)计算点云之间的最大距离
pcl::PointCloud<pcl::PointXYZ>::Ptr myCloud(new pcl::PointCloud<pcl::PointXYZ>);
myCloud->points.resize(3);
myCloud->points[0].x = 0;
myCloud->points[0].y = 0;
myCloud->points[0].z = 0;
myCloud->points[1].x = 3;
myCloud->points[1].y = 5;
myCloud->points[1].z = 0;
myCloud->points[2].x = 5;
myCloud->points[2].y = 12;
myCloud->points[2].z = 0;
PointT pmin, pmax;
pcl::getMaxSegment(*myCloud, pmin, pmax);
//(4)计算欧式距离的平方
PointT A1 = PointT(0, 0, 0);
PointT B1 = PointT(1, 1, 1);
float distancePoint = pcl::squaredEuclideanDistance(A1, B1);//俩点间距离的平方
//float distancePoint = pcl::squaredEuclideanDistance(pcl::PointXY(0, 0), pcl::PointXY(1, 1));
//(5)计算欧式距离
float result = pcl::euclideanDistance(A1, B1); //两点间距离
system("pause");
return 0;
}
其中,点到异面直线的距离使用的是平行四边形的面积÷底边模长为高。
推导方式:
https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html
参考文章:
https://zhuanlan.zhihu.com/p/384829485
https://www.zhihu.com/column/c_1094549121628827648
网友评论