是点A在3D附近的B点 - 距离检查

kja*_*llo 4 algorithm performance distance

我正在寻找有效的算法来检查一个点是否在3D附近.

sqrt((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2) < radius
Run Code Online (Sandbox Code Playgroud)

这似乎不太快,实际上我不需要这么大的准确性.我怎么能这样做?

unw*_*ind 24

平方距离,然后拨打电话sqrt(),这要快得多:

(((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2 < radius * radius
Run Code Online (Sandbox Code Playgroud)

当然,在许多情况下,至少radius * radius可以提前计算并存储为例如squaredRadius.

  • @darid:再做数学.√p<q等于p <q²,只要p,q是非负的.0.6 =√0.36<0.7且0.36 <0.49 =0.7². (5认同)
  • 你为什么不认为这很快?您是否有任何理由认为此代码会成为问题,例如运行十亿次? (2认同)
  • 也许您需要的是将您的点存储在像八叉树这样的空间结构中,以便能够比较少得多的点.点之间的距离受到盒子之间距离的限制. (2认同)

Jac*_*yan 10

好吧,如果你可以满足于立方体距离而不是球形距离,那么非常天真的实现就像这样:

Math.Abs(x2-x1) < radius && Math.Abs(y2-y1) < radius && Math.Abs(z2-z1) < radius 
Run Code Online (Sandbox Code Playgroud)

如果它被证明是瓶颈,您可以使用自己喜欢的优化Math.Abs​​的方法.

我还应该补充一点,如果其中一个尺寸通常变化小于其他尺寸,那么最后一个尺寸应该会带来性能提升.例如,如果您主要处理"地面"xy平面上的对象,则最后检查z轴,因为您应该能够通过使用x和y检查更早地排除碰撞.