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 线)上查找一个点可能很昂贵,并且您只有这条线的法线和偏移量。

简而言之,这个“偏移量”是什么,你如何计算它?这个偏移量代表什么?根据我目前对自己研究的了解,我最好的猜测是它是二维直线一般方程中的 c 变量:

ax + by + c = 0

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

offsetScalar = Dot(BoxPositionVector, normalVector) + BoxYHalfWidthScalar;
4

2 回答 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 * p - c还会为您提供从该点到超平面的正交距离 - 如果a是单位向量。这是因为点积的定义与标量投影等价a/||a|| * p是 上的p投影a。因此,在计算中定义超平面时,可以方便地进行归一化a和相应的缩放c。然后c是偏移量,或者等效地是从超平面到原点的距离 - 我们必须在投影到 之后对此进行调整a

TL;DR 版本: offset = c/||a||,这意味着offset = cifa是一个单位向量。

于 2013-03-14T03:05:56.270 回答
1

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

 ax + by + c = 0

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

请参阅此处了解更多信息。

于 2013-03-14T03:26:04.993 回答