1.原理推导

  给定空间中的一点P(x,y,z)和直线L上两点A(x1,y1,z1)、B(x2,y2,z2),计算P点到直线的距离。

2.求解方法

2.1等面积法

图1
取点P’为P在AB上的垂足,由向量法计算平行四边形面积公式可知
在这里插入图片描述
由此,可推出P到直线AB的距离d为
在这里插入图片描述

C++代码如下:

float computeDistancePointAndLine(const Eigen::Vector3f point,
                                  const Eigen::Vector3f lineBegin,
                                  const Eigen::Vector3f lineEnd)
{
    //直线方向向量
    Eigen::Vector3f line_dir = lineEnd -lineBegin;

    //直线上某一点的向量到点的向量
    Eigen::Vector3f line_start_to_point = point - lineBegin;

    Eigen::Vector3f cross_dir = line_dir.cross(line_start_to_point);
    return cross_dir.norm() / line_dir.norm();
}

2.2向量法

设向量AB与向量AP的夹角为θ,由向量乘法运算法则可知
在这里插入图片描述
由此,可推出P到直线AB的距离d为
在这里插入图片描述
C++代码如下:

float computeDistancePointAndLine(const Eigen::Vector3f point,
                                  const Eigen::Vector3f lineBegin,
                                  const Eigen::Vector3f lineEnd)
{
    //直线方向向量
    Eigen::Vector3f line_dir = lineEnd -lineBegin;

    //直线上某一点的向量到点的向量
    Eigen::Vector3f line_start_to_point = point - lineBegin;

    Eigen::Vector3f dot_dir = line_dir.dot(line_start_to_point);
    return dot_dir .norm() / line_dir.norm();
}
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐