【发布时间】:2016-03-21 15:27:17
【问题描述】:
对于我正在进行的项目,我正在尝试编写一些代码来检测二维空间中非点粒子之间的碰撞。我的目标是尝试在每个时间步至少检测几千个粒子的碰撞,我知道这对 python 来说是一个很高的要求。我遵循了这个blog post,它实现了一个四叉树,以显着减少我需要进行的成对检查的数量。所以我认为我遇到问题的地方是这个功能:
def get_index(self, particle):
index = -1
bounds = particle.aabb
v_midpoint = self.bounds.x + self.bounds.width/2
h_midpoint = self.bounds.y + self.bounds.height/2
top_quad = bounds.y < h_midpoint and bounds.y + bounds.height < h_midpoint
bot_quad = bounds.y > h_midpoint
if bounds.x < v_midpoint and bounds.x + bounds.width < v_midpoint:
if top_quad:
index = 1
elif bot_quad:
index = 2
elif bounds.x > v_midpoint:
if top_quad:
index = 0
elif bot_quad:
index = 3
return index
我最初分析的这个函数是瓶颈,我需要它快速起泡,因为它的调用次数很高。最初我只是提供一个对象轴对齐的边界框,它几乎以我需要的速度工作,然后意识到我无法确定哪些粒子实际上可能正在碰撞。所以现在我将一个粒子列表传递给我的四叉树构造函数,并且只使用类属性 aabb 来获取我的边界。
有没有办法可以将类似的东西传递给对象指针而不是整个对象?另外还有其他建议来优化上面的代码吗?
【问题讨论】:
-
Python 已经通过引用传递(这可能是为什么有人匿名否决了您的问题),因此对象复制不会减慢您的代码速度。对于每个对象,您可以在时间步长中为其向量构造一个边界框。然后你只需要检查边界框在同一个四叉树区域中的对象,看看它们是否相交,就可以进行详细的碰撞检查。
标签: python pointers optimization quadtree