• Eigen 求点到平面的距离


    一、原理

    1.平面的一般方程

    a x + b y + c z + d = 0 ax+by+cz+d=0 ax+by+cz+d=0
    其中 n = ( a , b , c ) n=(a,b,c) n=(a,b,c)是平面的法向量, d d d是将平面平移到坐标原点所需的距离, d = 0 d=0 d=0时,平面过原点

    2.向量的模

      给定一个向量 V ( x , y , z ) V(x,y,z) V(x,y,z),其模为 ∣ V ∣ = s q r t ( x 2 + y 2 + z 2 ) |V|=sqrt(x^2+y^2+z^2) V=sqrt(x2+y2+z2)

    3.向量的点积

      给定两个向量 V 1 ( x 1 , y 1 , z 1 ) V_1(x_1,y_1,z_1) V1(x1,y1,z1) V 2 ( x 2 , y 2 , z 2 ) V_2(x_2,y_2,z_2) V2(x2,y2,z2),则他们的内积 V 1 V 2 = x 1 x 2 + y 1 y 2 + z 1 z 2 V_1V_2=x_1x_2+y_1y_2+z_1z_2 V1V2=x1x2+y1y2+z1z2。其几何意义为一个向量到另一个向量的投影长度,有 V 1 V 2 = ∣ V 1 ∣ ∣ V 2 ∣ ⋅ cos ⁡ θ V_1V_2=|V_1||V_2|\cdot \cos \theta V1V2=V1∣∣V2cosθ,其中 θ \theta θ为两个向量的夹角。

    4.点到平面的距离

      给定平面方程 a x + b y + c z + d = 0 ax+by+cz+d=0 ax+by+cz+d=0,求平面外一点 Q ( x 0 , y 0 , z 0 ) Q(x_0,y_0,z_0) Q(x0,y0,z0)到平面的距离 d d d。如下图所示:
    在这里插入图片描述
      取平面中任意一点 P ( x , y , z ) P(x,y,z) P(x,y,z),链接 P Q PQ PQ,过 P P P做平面的法向量 n → = ( a , b , c ) \mathop{n}\limits ^{\rightarrow}=(a,b,c) n=(a,b,c),可知 Q Q Q到平面的距离 d d d恰恰是 P Q → = ( x 0 − x , y 0 − y , z 0 − z \mathop{PQ}\limits ^{\rightarrow}=(x_0-x,y_0-y,z_0-z PQ=(x0x,y0y,z0z在法向量 n → ) \mathop{n}\limits ^{\rightarrow}) n)上面的投影长度,即:
    d = ∣ P Q → ∣ ⋅ cos ⁡ θ = ∣ n → ∣ ∣ n → ∣ ∣ P Q → ∣ ⋅ cos ⁡ θ (分子的三项组合刚好为向量 n → 和向量 P Q → 的点积) = P Q ⋅ n ∣ n → ∣ = a ( x 0 − x ) + b ( y 0 − y ) + c ( z 0 − z ) a 2 + b 2 + c 2 = a x 0 + b y 0 + c z 0 − ( a x + b y + c z ) a 2 + b 2 + c 2 = a x 0 + b y 0 + c z 0 + d a 2 + b 2 + c 2 ( 因为 a x + b y + c z = − d ) = ∣ a x 0 + b y 0 + c z 0 + d ∣ a 2 + b 2 + c 2 ( 为保证结果为正,所以加绝对值 ) d=|PQ|cosθ=|n||n||PQ|cosθnPQ=PQn|n|=a(x0x)+b(y0y)+c(z0z)a2+b2+c2=ax0+by0+cz0(ax+by+cz)a2+b2+c2=ax0+by0+cz0+da2+b2+c2(ax+by+cz=d)=|ax0+by0+cz0+d|a2+b2+c2()

    d=PQcosθ=nnPQcosθ(分子的三项组合刚好为向量n和向量PQ的点积)=nPQn=a2+b2+c2 a(x0x)+b(y0y)+c(z0z)=a2+b2+c2 ax0+by0+cz0(ax+by+cz)=a2+b2+c2 ax0+by0+cz0+d(因为ax+by+cz=d)=a2+b2+c2 ax0+by0+cz0+d(为保证结果为正,所以加绝对值)
    如果法向量是单位向量的话,分母为1,参考

    二、Eigen实现

    double point2planeDistance(
        const Eigen::Vector3d &P,
        const Eigen::Vector4d &plane_coeff)
    {
        Eigen::Vector4d point;
        point<<P,1;
        return fabs(point.dot(plane_coeff))/plane_coeff.block<3,1>(0,0).norm();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
     Eigen::Vector3d p;
     Eigen::Vector4d plane;
     p<<0,0,5;
     plane<<0,0,1,1;
     std::cout<<point2planeDistance(p,plane)<<std::endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    输出:6
    输出的是点 ( 0 , 0 , 5 ) (0,0,5) (0,0,5)到平面 z = − 1 z=-1 z=1的距离。

  • 相关阅读:
    [SWPUCTF 2021 新生赛]web方向(七到11题) 解题思路,实操解析,解题软件使用,解题方法教程
    我与Java的故事
    洛谷刷题C语言:距离函数、闰年展示、计算阶乘、猴子吃桃、培训
    spring 获取ioc容器,从容器中获取bean
    Alibaba(获得店铺的所有商品) API接口
    vue-lazyload图片懒加载
    JS之手写bind原理
    sql中如何实现递归
    30天Python入门(第十六天:深入了解Python中的日期与时间)
    Turtle中circle用法详解
  • 原文地址:https://blog.csdn.net/qq_39400324/article/details/126852515