En travaillant sur un projet vraiment seulement pour le plaisir j'ai rencontré un problème.De quelle manière présenteriez-vous un algorithme pour détecter les collisions entre différents objets?
Il existe un monde en 2D peuplé de balles rondes, de triangles pointus et de lignes fines (et d'autres animaux sauvages, peut-être). Ils sont tous des sous-classes de WorldCreatures. Ils peuvent se déplacer dans ce monde. Quand ils se rencontrent, une collision se produit.
La chose que je voudrais faire est de trouver un moyen de détecter la collision entre eux. Voici ce que je suis debout en ce moment:
- Pour moi Ball-Ball est facile, je calcule juste leur distance de leurs positions et le compare à la somme de leurs «tailles».
- La collision entre la balle et le bord du monde est aussi simple - je vérifie simplement la distance qui le sépare, ce qui, en coordonnées cartésiennes, est simple.
- Plus de problèmes génériques sont - comment détecter une collision entre la ligne (début et fin à certains points) ou d'autres objets que je pourrais avoir là? Distance entre une ligne et un point peut être calculé facilement aussi, mais ce que je voudrais est d'avoir
Une sorte de manière générique pour dire si l'objet A
entre en collision avec l'objet B
. Le code tel qu'il est semble maintenant un peu comme:
class WorldCreature:
def detectCollision(self, otherObject):
# do something
if collision:
self.onCollision(otherObject)
otherObject.onCollision(self)
class Ball(WorldCreature):
# someing here
class Line(WorldCreature):
# someing here
Maintenant, la détection de collision mechanizm devrait dépendre de ce que les objets peuvent entrer en collision. Donc, l'effet sera.
Devrais-je simplement garder une liste de tous les objets en mémoire et les parcourir tous en à chaque étape? Ou, y a-t-il une meilleure façon d'améliorer les performances de cette tâche?
+1 pour quadtree. Une autre question est de savoir si vous voulez détecter une collision réelle ou simplement une intersection. La collision réelle vous obligera à balayer vos formes. – BigSandwich