對於我正在研究的項目,我試圖編寫一些代碼來檢測2D空間中非點粒子之間的碰撞。我的目標是嘗試每個時間步至少幾次檢測幾千個粒子的碰撞,我知道這是python的一個高階命令。我遵循這個實現了四叉樹的blog post,以顯着減少我需要進行的成對檢查次數。那麼,我相信,我遇到的問題是這樣的功能:python中有效的四叉樹實現
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
這從我最初的分析功能是瓶頸,我需要它來起泡,因爲它的高調用數快。最初我只是提供一個物體軸對齊的邊界框,它幾乎以我需要的速度工作,然後意識到我沒有辦法確定哪些粒子實際上可能會碰撞。所以現在我將一個粒子列表傳遞給我的四叉樹構造函數,並使用class屬性aabb來獲得我的邊界。
有沒有辦法將類似物傳遞給對象指針而不是整個對象?另外還有其他建議來優化這個代碼嗎?
的Python已經按引用傳遞(這也許可以解釋爲什麼有人匿名downvoted你的問題),所以對象拷貝不會拖慢你的代碼。對於每個對象,您可以在時間步中爲它的向量構造一個邊界框。那麼您只需要檢查邊界框位於同一個四叉樹區域中的對象,以查看它們是否相交以完成對碰撞的詳細檢查。 – barny