Für ein Projekt, an dem ich gerade arbeite, versuche ich Code zu schreiben, um Kollisionen zwischen Nicht-Punkt-Partikeln in einem 2D-Raum zu erkennen. Mein Ziel ist es, zu versuchen, eine Kollision für ein paar tausend Partikel mindestens ein paar Mal pro Zeitschritt zu erkennen, von dem ich weiß, dass es eine große Herausforderung für Python ist. Ich bin diesemgefolgt, der einen Quadtree implementiert, um die Anzahl paarweiser Überprüfungen wesentlich zu reduzieren, die ich machen muss. Also, wo ich glaube, ist ich laufe in Probleme diese Funktion:Effiziente Implementierung von Quadtree in 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
Diese Funktion wird aus meiner ersten Profilierung ist die Engpass und ich brauche es schnell zu Blasenbildung, wegen seiner hohen Anrufzahl. Ursprünglich lieferte ich nur eine Objektachsen-ausgerichtete Begrenzungsbox, die fast mit der Geschwindigkeit arbeitete, die ich benötigte, und dann erkannte ich, dass ich keine Möglichkeit hatte zu bestimmen, welche Partikel tatsächlich kollidieren könnten. Jetzt gebe ich eine Liste von Partikeln an meinen Quadtree-Konstruktor weiter und benutze einfach das Klassenattribut aabb, um meine Grenzen zu bekommen.
Gibt es eine Möglichkeit, etwas Analoges zu einem Objektzeiger anstelle des gesamten Objekts zu übergeben? Gibt es zusätzlich noch eine Empfehlung, diesen obigen Code zu optimieren?
Python bereits durch Verweis übergibt (was sein kann, warum jemand anonym Ihre Frage downvoted), so wider Kopieren Sie den Code unten nicht verlangsamt. Für jedes Objekt könnten Sie im Zeitschritt eine Begrenzungsbox für den Vektor erstellen. Dann müssen Sie nur Objekte überprüfen, bei denen sich die Begrenzungsrechtecke in der gleichen Quadtree-Region befinden, um zu sehen, ob sie sich kreuzen, um die detaillierte Kollisionskontrolle durchzuführen. – barny