半空间到点测试
HalfSpace to Point Test
我想知道更多关于在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
其中a
和x
为长度为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|| * p
是p
在a
上的投影。因此,在计算中定义超平面时,可以方便地规范化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).
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 在命名空间中定义函数还是限定函数
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- C++:对不存在的命名空间使用命名空间指令
- 数据成员SFINAE的C++17测试:gcc vs clang
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间进行 QT 测试
- 在命名空间中定义变量,但在测试中获取空值
- 为什么Google测试样本将测试放在匿名名称空间中
- 如何存根命名空间以进行单元测试
- 使用c++分层命名空间解析为单元测试提供模拟组件是一种好做法吗?< / h1 >
- Boost测试失败,命名空间中有枚举类
- 如何使用谷歌测试与免费功能在匿名命名空间
- 半空间到点测试
- 如何将变量放入较高的地址空间(64位)进行测试