PCL 距离计算【两异面直线之间的最短直线 + 点到直线之间的最短距离 + 点云点中距离最远的两点及距离 + 两点欧式距离+ 曼哈顿距离】(Common_Distance)

PCL专栏目录及须知-CSDN博客

注:这些计算都都是只调Common中的公共函数,因此不单独写main()函数

只通过控制台打印验证是否可以正常运行,结果是否正确,不做可视化展示

使用时直接把代码拷贝进去就行。

目录

名词解释:

1.计算两异面直线之间的最短直线

2.计算点到直线之间的最短距离

3.获取点云点中距离最远的两点及距离(时间复杂度高,计算较慢)

4.计算两点欧式距离(接口一)

5.计算两点欧式距离(接口二)

6.计算两点欧式距离平方(接口一)【不常用】

7.计算两点欧式距离平方(接口二)

8.计算两三维向量的曼哈顿距离

9.计算给定数组的中值


名词解释:

欧氏距离与曼哈顿距离

欧氏距离:绿色代表欧氏距离,也就是直线距离

曼哈顿距离:红线代表曼哈顿距离,两点在南北方向上的距离加上在东西方向上的距离,即d(i,j)=|xi-xj|+|yi-yj|。

1.计算两异面直线之间的最短直线

#include <pcl/common/distances.h>
	
Eigen::VectorXf lineA(6);							// 设置直线a的参数
	lineA(0) = 0; lineA(1) = 0; lineA(2) = 0;			// 直线a起点的xyz值
	lineA(3) = 1; lineA(4) = 1; lineA(5) = 0;			// 直线a的方向

	Eigen::VectorXf lineB(6);							// 设置直线b的参数
	lineB(0) = 0; lineB(1) = 0; lineB(2) = 1;			// 直线b起点的xyz值
	lineB(3) = 1; lineB(4) = 0; lineB(5) = 0;			// 直线b的方向

	Eigen::Vector4f pt1;								// 两直线最短直线上的点1
	Eigen::Vector4f pt2;								// 两直线最短直线上的点2
	pcl::lineToLineSegment(lineA, lineB, pt1, pt2);		// 直线A(xyz及方向)、直线B(xyz及方向);两直线最短直线上的点1;两直线最短直线上的点2

结果打印:

2.计算点到直线之间的最短距离

#include <pcl/common/distances.h>

	Eigen::Vector4f pt = { 0,0,0,0 };											// 当前点
	Eigen::Vector4f line_pt = { 0,0,1,0 };										// 当前直线起点的XYZ值
	Eigen::Vector4f line_dir = { 1,1,0,0 };										// 当前直线的朝向
	double dis = pcl::sqrPointToLineDistance(pt, line_pt, line_dir);			// 点到直线的最短距离

结果打印:

3.获取点云点中距离最远的两点及距离(时间复杂度高,计算较慢)

#include <pcl/common/distances.h>

	pcl::PointXYZ p1Max, p2Max;
	double maxDis0 = pcl::getMaxSegment(*cloud_in, p1Max, p2Max);									// 计算所有点云点中距离最远的两点及距离(时间复杂度高,计算较慢)

	pcl::Indices indicesMaxSeg;
	indicesMaxSeg.push_back(0);																		// 手动添加索引,一般是计算得出的结果
	indicesMaxSeg.push_back(1);
	indicesMaxSeg.push_back(2);
	indicesMaxSeg.push_back(3);
	double maxDis1 = pcl::getMaxSegment(*cloud_in, indicesMaxSeg, p1Max, p2Max);					// 计算当前索引的点云点中距离最远的两点及距离

结果打印:

4.计算两点欧式距离(接口一)

#include <pcl/common/distances.h>

	pcl::PointXYZ p1Euc = { 0,0,0 };
	pcl::PointXYZ p2Euc = { 1,2,3 };
	double disEucSqu = pcl::squaredEuclideanDistance(p1Euc, p2Euc);				// 两点欧氏距离的平方
	double disEuc = pcl::euclideanDistance(p1Euc, p2Euc);						// 两点欧氏距离					// 两点欧氏距离

结果打印:

5.计算两点欧式距离(接口二)

#include <pcl/registration/distances.h>

	/****************计算两三维向量的欧式距离<distances.h>********************/
	Eigen::Vector4f v5(1, 2, 3, 0);
	Eigen::Vector4f v6(2, 3, 4, 0);
	double dis3 = pcl::distances::l2(v5, v6);
	std::cout << "待计算向量1:" << v5 << std::endl;
	std::cout << "待计算向量2:" << v6 << std::endl;
	std::cout << "距离:" << dis3 << std::endl;

结果打印:

 6.计算两点欧式距离平方(接口一)【不常用】

#include <pcl/registration/distances.h>

	/****************通过Huber核计算两三维向量的距离<distances.h>********************/
	Eigen::Vector4f v1(1, 2, 3, 0);
	Eigen::Vector4f v2(2, 3, 4, 0);
	double dis1 = pcl::distances::huber(v1, v2, 1.0);
	std::cout << "待计算向量1:" << v1 << std::endl;
	std::cout << "待计算向量2:" << v2 << std::endl;
	std::cout << "距离:" << dis1 << std::endl;

结果打印:

 7.计算两点欧式距离平方(接口二)

#include <pcl/registration/distances.h>

	/****************计算两三维向量的欧式距离的平方<distances.h>********************/
	Eigen::Vector4f v7(1, 2, 3, 0);
	Eigen::Vector4f v8(2, 3, 4, 0);
	double dis4 = pcl::distances::l2Sqr(v7, v8);
	std::cout << "待计算向量1:" << v7 << std::endl;
	std::cout << "待计算向量2:" << v8 << std::endl;
	std::cout << "距离:" << dis4 << std::endl;

结果打印:

8.计算两三维向量的曼哈顿距离

	#include <pcl/registration/distances.h>

/****************计算两三维向量的曼哈顿距离<distances.h>********************/
	Eigen::Vector4f v3(1, 2, 3, 0);
	Eigen::Vector4f v4(2, 3, 4, 0);
	double dis2 = pcl::distances::l1(v1, v2);
	std::cout << "待计算向量1:" << v3 << std::endl;
	std::cout << "待计算向量2:" << v4 << std::endl;
	std::cout << "曼哈顿距离:" << dis2 << std::endl;

结果打印:

9.计算给定数组的中值

#include <pcl/registration/distances.h>

	/****************计算数组的中值<distances.h>********************/
	double* array = new double[5]{ 0, 1, 2, 3, 4 };
	double median = pcl::distances::computeMedian(array, 5);
	std::cout << "待计算数组:" << array  << std::endl;
	std::cout << "中值:" << median << std::endl;

结果打印:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值