我想了解更多有关在二维中获取点到线的距离的非常具体的方法。这是如何完成的:
// 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 源代码中使用了这个方法。在 this page一位程序员提到了等式:
distance = (V dot normal) - offset
这是我能找到的用于此类计算的唯一资源。 通常检查与点的半空间相交的方法是从有问题的平面到你的点点一个 vector ,然后通过检查看它是背对还是朝向该平面的法线结果标量的符号(+ 或 -)。
这在实时应用程序中可能是不可取的,因为在平面上(或在这种情况下是 2D 线)上找到一个点可能很昂贵,而且您只有这条线的法线和偏移量。
简而言之,这个“偏移量”是什么?如何计算它?这个偏移量代表什么?根据我目前对自己研究的了解,我最好的猜测是它是二维直线的一般方程中的 c 变量:
ax + by + c = 0
附加信息: Erin Catto 在几个地方(在 Oriented Bounding Box 碰撞检测的上下文中)像这样计算他的偏移量,但我不明白这里的数学或正在发生的事情:
offsetScalar = Dot(BoxPositionVector, normalVector) + BoxYHalfWidthScalar;
最佳答案
n
中的半空间尺寸由等式唯一定义
a * x >= c
在哪里a
和 x
是长度为 n
的 vector , *
是标量(点)积,c
是一个标量。 a
是与超平面正交的 vector a * x = c
.正如你所说,在二维中这是方程式 ax + by - c = 0
, 所有标量。
你说的很对; offset
与这个常量的值有关 c
.对于任何一点 p
在超平面中,你将有 a * p = c
.对于半空间中的任何一点,你都会有 a * p >= c
.任何不在半空间中的点都将满足 a * p < c
.
对于某些点 p
, a * p - c
的值还将为您提供从点到超平面的正交距离 - 如果 a
是单位 vector 。这是因为 equivalence of definition of dot product to scalar projection ; a/||a|| * p
是 p
的投影到 a
.因此,在计算中定义超平面时,规范化 a
很方便和规模c
因此。 c
然后是偏移量,或者等效于从超平面到原点的距离 - 我们必须在投影到 a
后对此进行调整.
TL;DR 版本:offset = c/||a||
, 这意味着 offset = c
如果a
是单位 vector 。
关于c++ - 半空间到点测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15400277/