代码之家  ›  专栏  ›  技术社区  ›  Justin Meiners

平面与点的有符号距离

  •  7
  • Justin Meiners  · 技术社区  · 14 年前

    我找不到一个一致的方法来求点和平面之间的有符号距离。我如何计算这个给定的平面定义为一个点和一个法向?

    struct Plane
    {
        Vec3 point;
        Vec3 normal;
    } 
    
    2 回复  |  直到 8 年前
        1
  •  21
  •   Beta    14 年前

    你把事情搞得太复杂了。如果你的正常值是标准化的,你可以这样做:

    float dist = dotProduct(p.normal, (vectorSubtract(point, p.point)));
    
        2
  •  2
  •   Pavan    14 年前

    别担心,我完全理解你的感受。我假设您需要一些代码片段。所以你可以自己实现它。你需要做更多的工作,而不仅仅是找出点积。

    这取决于你理解这个算法并把它实现到你自己的程序中。 我要做的是给你一个这个算法的实现

    点与平面的有符号距离

    下面是这些算法的一些示例“C++”实现。

    // Assume that classes are already given for the objects:
    //    Point and Vector with
    //        coordinates {float x, y, z;}
    //        operators for:
    //            Point  = Point ± Vector
    //            Vector = Point - Point
    //            Vector = Scalar * Vector    (scalar product)
    //    Plane with a point and a normal {Point V0; Vector n;}
    //===================================================================
    
    // dot product (3D) which allows vector operations in arguments
    #define dot(u,v)   ((u).x * (v).x + (u).y * (v).y + (u).z * (v).z)
    #define norm(v)    sqrt(dot(v,v))  // norm = length of vector
    #define d(u,v)     norm(u-v)       // distance = norm of difference
    
    // pbase_Plane(): get base of perpendicular from point to a plane
    //    Input:  P = a 3D point
    //            PL = a plane with point V0 and normal n
    //    Output: *B = base point on PL of perpendicular from P
    //    Return: the distance from P to the plane PL
    float
    pbase_Plane( Point P, Plane PL, Point* B)
    {
        float    sb, sn, sd;
    
        sn = -dot( PL.n, (P - PL.V0));
        sd = dot(PL.n, PL.n);
        sb = sn / sd;
    
        *B = P + sb * PL.n;
        return d(P, *B);
    }
    

    从这里取: http://www.softsurfer.com/Archive/algorithm_0104/algorithm_0104.htm

    PK