2013-03-14 59 views
3

我想知道更多关于在2D中获取点到线的距离的非常具体的方法。下面是它是如何做:半对点测试

// Given an arbitrary point, and a normal vector 
// to a line along with a scalar offset 
distance = DotProduct(normal, point) - offset 

我知道这是因为艾琳卡托使用他的Box2D的精简版源代码,这种方法是正确的。在this page程序员提到的公式:

distance = (V dot normal) - offset 

这是唯一的资源我可以找到这样的运算。 通常的用一个点来检查半空间交点的方法是从所讨论的平面中点出一个矢量到你的点,然后通过检查符号来查看它是否背离或朝向该平面的法线方向(+或 - )得到的标量。

在实时应用中,在平面上找到一个点(在这种情况下是2D线)可能很昂贵,并且您只有该线的法线以及偏移量,这可能是不理想的。

所以简而言之,这个“偏移”是什么,以及如何计算它?这个偏移量代表什么?从我目前知道我自己的研究我最好的猜测是,它是从线的2D一般方程的变量c:

ax + by + c = 0 

附加信息: 艾琳卡托被计算了偏移这样少数地方(在方向包围盒碰撞检测的情况下),但我不明白这里的数学或正在发生的事情:

offsetScalar = Dot(BoxPositionVector, normalVector) + BoxYHalfWidthScalar; 

回答

1

n尺寸半空间由方程式唯一定义

a * x >= c 

ax是长度n的载体,*是标量(点)的产品,以及c是一个标量。 a是与超平面a * x = c正交的向量。正如你所说,在二维方面,这是所有标量的方程ax + by - c = 0

你说的是完全正确的; offset与此常数c的值有关。对于超平面中的任何点p,您将有a * p = c。对于半空间中的任何点,您将有a * p >= c。任何不在半空间内的点将满足a * p < c

对于某个点pa * p - c的值也会给出从点到超平面的正交距离 - 如果a是单位向量。这是因为equivalence of definition of dot product to scalar projection; a/||a|| * ppa的投影。因此,在计算中定义超平面时,将a归一化并相应地缩放c是方便的。那么c就是偏移量,或者等于从超平面到原点的距离 - 在投影到a之后,我们必须对此进行调整。

TL; DR版本offset = c/||a||,这意味着如果offset = ca的单位矢量。

+0

非常棒的答案,非常感谢! – RandyGaul 2013-03-14 03:17:04

1

offset是从线到原点的距离,如果线路被表示为:

ax + by + c = 0 

然后offset = c/sqrt(a*a+b*b).

更多信息参见here

+0

有帮助了解。我没有意识到C通过这种方式与原点相关。 – RandyGaul 2013-03-14 03:29:01