寻找一种轻量级方法来查找半径范围内的对象。
到目前为止,对我来说很明显的答案是遍历每个对象,将其x和y位置与半径的中心进行比较。
示例:
Turret
- 寻找半径范围内的目标。
TargetArray
- 可能的目标数组。
WithinRangeArray
- 数组我们将适用的目标推送到
Distance^2 = (TargetArray[n].x - Turret.x)^2 + (TargetArray[n].y - Turret.y)^2
if( Distance^2 < maxRadius^2 ){
WithinRangeArray.push(TargetArray[n])
}
避免平方根应该可以节省一些处理能力。但我觉得可能有其他算法/理论/方法可能更好(更轻量级)。
TargetArray的理想长度:一次少于500个目标。
答案 0 :(得分:3)
在计算径向距离之前,首先检查物体是否位于炮塔位置中心的方框内。如果target_x&lt; turret_x-range然后它超出范围而不需要检查距离,也检查turret_x + range,turret_y-range,turret_y + range。这需要最多4次比较和4次加/减操作来确定目标是否在框中。
答案 1 :(得分:2)
在2D中你可以实现一个四叉树,在3D中你可以实现一个八叉树,这意味着你可以在实际检查它们的确切距离之前对对象进行分组并更有效地丢弃它们的大组。如果你想了解更多,你应该谷歌为他们。它们是对象世界非常有用的数据结构。
最终实现可能不会节省太多空间,但速度会非常快,因为您可以非常快速地丢弃大量对象。
答案 2 :(得分:0)
您可以将可能的目标存储在键入其占据的网格方块的多重集中。然后你只需要迭代目标,这些目标的网格方格足够靠近炮塔的网格方格,它们可能是目标。
这是否值得做,取决于目标的数量和可能带有范围的目标的数量。我正在开发一个包含数十万个目标的应用程序,其中只有10或20个可能在范围内。在这种情况下,值得投入大量复杂性来修剪潜在的目标列表。在你的情况下,只有500个目标,这可能是不值得的。