半空间到点的测试

3

我想了解一种非常特定的方法,用于计算二维平面上点到直线的距离。以下是具体步骤:

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

我知道这是真的,因为Erin Catto在他的Box2D Lite源代码中使用了这种方法。在这个页面上,一位程序员提到了这个方程式:
distance = (V dot normal) - offset

这是我找到的唯一一个与此计算有关的资源。通常检查点与半空间相交的方法是将从所讨论平面到你的点的向量点乘,然后通过检查所得标量的符号(+或-)来确定它是否面向该平面的法线或背向法线。
在实时应用程序中,这可能是不理想的,因为找到平面上的一个点(或者在这种情况下是2D直线)可能很昂贵,并且您只有该线的法线和偏移量。
简而言之,"offset"是什么,如何计算?这个偏移量代表什么?根据我目前对自己的研究的了解,我的最佳猜测是,它是2D线的一般方程中的c变量:
ax + by + c = 0

附加信息: Erin Catto在几个地方(针对于定向边界框碰撞检测)中计算偏移量,但我不明白这里的数学或具体发生了什么:

offsetScalar = Dot(BoxPositionVector, normalVector) + BoxYHalfWidthScalar;
2个回答

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

对于某个点p,如果a是一个单位向量,则a * p - c的值也将给出该点到超平面的正交距离。这是由于标量投影等效于点积的定义equivalence of definition of dot product to scalar projection; a/ ||a|| * ppa上的投影。因此,在计算中定义超平面时,规范化a并相应缩放c是方便的。然后,c是偏移量,或者等价地说,是从超平面到原点的距离-我们必须在投影到a之后进行调整。 简短版本offset = c/||a||,这意味着如果a是一个单位向量,则offset = c

1
“offset”是指将线表示为时,从该线到原点的距离。
 ax + by + c = 0

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

更多信息请参见此处


有用的知识。我没有意识到 C 与起源有这样的关系。 - RandyGaul

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