平面与点之间的有向距离

15

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

struct Plane
{
    Vec3 point;
    Vec3 normal;
} 

为什么dist = dotProduct(dif,dif)?距离应该是:d(P,*B); ?? - Pavan
d(p,b) 简单地调用 this = norm(sqrt(dot(p - b, p - b))); - Justin Meiners
所以我的代码做了同样的事情。 - Justin Meiners
有sqrt在里面,怎么可能是负数呢? - Justin Meiners
一个数的平方根可以是正数或负数... - Žarko Tomičić
@ŽarkoTomičić 在这种情况下,对于R^n中的所有向量,dot(a, a) >= 0。(请注意,此问题也已有12年历史)。 - Justin Meiners
2个回答

40

你让事情变得太复杂了。如果你的法线已经被标准化,你只需要这样做:

float dist = dotProduct(p.normal, (vectorSubtract(point, p.point)));

1
抱歉,我无法理解点积如何能够产生“p.normal”和“point - p.point”之间的距离。您能否请解释一下(也许使用图片)?在我的情况下,“p.normal =(1,0,0)”,而“point - p.point =(-200,0,0)”。 - Bla...
@user26409021:这个想法是找到pointp之间的有符号距离。在你的情况下,你认为它是多少?我认为是-200。 - Beta
是的,我知道它给出了-200的距离。那么如果我说通过使用dotProduct我们可以找到两点之间的距离,这样说是否正确? - Bla...
@user26409021:是的,pq 之间的距离是 sqrt((p-q).(p-q)) - Beta
1
这个方法有效的一个解释是,你正在计算从平面上的任意点到该点的向量; d = point - p.point。然后我们将 d 投影到法线上。投影公式为 p=dot(d,n)/||n||^2*n={n is unit}=dot(d,n)*n。由于 n 是单位向量,因此该向量的有符号长度为 dot(d,n) - Alexander Torstling

4

对于那些好奇Beta发布的点积公式是如何推导出来的人,这里有一个可视化证明:

           N        Q
           ^      / | 
           |    /   | d
           |  /     | 
           |/       |
---------- P -------+------ > plane

d是Q点到平面的有向距离

P是位于平面上的已知点。

N是垂直于P点处平面的法向单位向量。

为了找到d,我们将d移动到P和N所在的位置。

           N
           ^
           |
           |
           +--------Q
           |      / 
         d |    /   
            /     
           |/       
---------- P -------------- > plane

使用余弦函数

cos(θ) = adjacent / hypotenuse
cos(θ) = d / |PQ|                -- |PQ| is length of (Q-P)
     d = |PQ| x cos(θ)           -- Equation 1

使用以下点积公式:
a · b = |a| × |b| × cos(θ)

我们推导。
    N . (Q-P) = |N| x |PQ| x cos(θ)
    N . (Q-P) = 1 x |PQ| x cos(θ)    -- |N| is 1 because unit vector
|PQ| x cos(θ) = N . (Q-P)            -- Equation 2

用方程1替换方程2的左侧

d = N . (Q-P)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接