半空间到点测试

HalfSpace to Point Test

本文关键字:测试 空间      更新时间:2023-10-16

我想知道更多关于在2D中获得点到线的距离的非常具体的方法。如下所示:

// 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
<<p> 附加信息/strong>:Erin Catto在几个地方(在面向边界盒碰撞检测的背景下)像这样计算他的偏移量,但我不明白这里的数学或发生了什么:
offsetScalar = Dot(BoxPositionVector, normalVector) + BoxYHalfWidthScalar;

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的值也将给出该点到超平面的正交距离。这是因为点积的定义等价于标量投影;a/||a|| * ppa上的投影。因此,在计算中定义超平面时,可以方便地规范化a并相应地缩放c。然后c是偏移量,或者相当于从超平面到原点的距离——我们必须在投影到a后对此进行调整。

TL;DR version: offset = c/||a||,如果a是单位向量,则为offset = c

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

 ax + by + c = 0

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