c++ - 半空间到点测试

标签 c++ math geometry box2d physics

我想了解更多有关在二维中获取点到线的距离的非常具体的方法。这是如何完成的:

// 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

在哪里ax是长度为 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|| * pp 的投影到 a .因此,在计算中定义超平面时,规范化 a 很方便和规模c因此。 c然后是偏移量,或者等效于从超平面到原点的距离 - 我们必须在投影到 a 后对此进行调整.

TL;DR 版本:offset = c/||a|| , 这意味着 offset = c如果a是单位 vector 。

关于c++ - 半空间到点测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15400277/

相关文章:

c++ - 重载 << 运算符以插入到 vector 中

c++ - rand() 可以用来生成可预测的数据吗?

c++ - 游戏 vs 游戏引擎?

javascript - 我怎样才能让我的角色沿对 Angular 线移动?

algorithm - 一个聪明的自制模数实现

r - 如何总结指向线串并在 r 中保留数据框列?

algorithm - 大量圆圈的碰撞检测

c++ - 使用 gdb 自动调试

postgresql - 是否有一种功能可以知道我的几何体中有多少百分比包含在另一个几何体中?

python - 使用 Kabsch 算法在 3d 中进行最佳旋转