求解三维空间点在三维直线上的投影点

1、理论部分

在这里插入图片描述

2、C++实现

2.1、直接实现

这是之前写的一个代码片段,作为一个示例。

/*
* 	//空间直线上一点
* 	coefficients->values[0];
* 	coefficients->values[1];
* 	coefficients->values[2];
* 	//空间直线单位方向向量
* 	coefficients->values[3];
* 	coefficients->values[4];
* 	coefficients->values[5];
*	P0表示空间直线上一点,mass_center表示空间中任意一点,P2表示mass_center在直线上的投影点
*/
double P0[3], P2[3];
P0[0] = coefficients.values[0];
P0[1] = coefficients.values[1];
P0[2] = coefficients.values[2];
double dlambda = (mass_center[0] - P0[0])*coefficients.values[3] + (mass_center[1] - P0[1])*coefficients.values[4] + (mass_center[2] - P0[2])*coefficients.values[5];
P2[0] = P0[0] + dlambda * coefficients.values[3];
P2[1] = P0[1] + dlambda * coefficients.values[4];
P2[2] = P0[2] + dlambda * coefficients.values[5];

2.2、使用PCL实现

/*Brief:点云投影
* 将点投影到一个参数化模型上(平面或者球体等)
* params[in]:cloudsource输入点云
* params[out]:cloudfiltered输出投影后的点云
* params[in]:coefficients投影系数(分别放入空间直线的单位方向向量和直线上一点)例如:
* 	typedef pcl::PointXYZ PointT;
*	typedef pcl::PointCloud<PointT> PointCloudT;
* 	PointCloudT::Ptr cloudSourceProjection;
* 	cloudSourceProjection.reset(new(PointCloudT));
* 	pcl::ModelCoefficients::Ptr Line3Dcoefficient;
* 	Line3Dcoefficient.reset(new(pcl::ModelCoefficients));
* 	Line3Dcoefficient->values.resize(6);
* 	//法线上一点
* 	Line3Dcoefficient->values[0] = coefficients->values[0];
* 	Line3Dcoefficient->values[1] = coefficients->values[1];
* 	Line3Dcoefficient->values[2] = coefficients->values[2];
* 	//法线方向
* 	Line3Dcoefficient->values[3] = coefficients->values[3];
* 	Line3Dcoefficient->values[4] = coefficients->values[4];
* 	Line3Dcoefficient->values[5] = coefficients->values[5];
* params[in]:Model投影模型(这里Model = pcl::SACMODEL_LINE)
*/
void PointCloudProjectInliers(PointCloudT::Ptr cloudsource, PointCloudT::Ptr cloudfiltered, pcl::ModelCoefficients::Ptr coefficients, pcl::SacModel Model)
{
	//创建ProjectInliers对象,使用ModelCoefficients作为投影对象的模型参数
	pcl::ProjectInliers<pcl::PointXYZ> proj;           //创建投影滤波对象
	proj.setModelType(Model);                          //设置对象对应的投影模型
	proj.setInputCloud(cloudsource);                   //设置输入点云
	proj.setModelCoefficients(coefficients);           //设置模型对应的系数
	proj.filter(*cloudfiltered);                       //投影结果存储
}
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值