J'essaie d'utiliser un quadtree pour la détection de collision 2D, mais je suis un peu perplexe sur la façon de l'implémenter. Tout d'abord, j'aurais un quadtree qui contient quatre sous-arbres (un représentant chaque quadrant), ainsi qu'une collection d'objets qui ne rentrent pas dans un seul sous-arbre.
Lors de la vérification d'un objet pour les collisions dans l'arbre, je ferais quelque chose comme ça (grâce à QuadTree pour la détection de collision 2D ):
Pour rechercher toutes les collisions dans un arbre à quatre arbres:
Pour insérer dans un quadtree:
Pour mettre à jour un quadtree:
Est-ce que ça va? Peut-il être amélioré?
Votre structure à quatre arbres n'est pas optimale. Vous avez raison de stocker 4 sous-arbres par nœud, mais les objets réels ne doivent être stockés qu'à l'intérieur des feuilles, pas les nœuds intérieurs. Par conséquent, la collection contenant les objets réels doit être déplacée vers les feuilles.
Jetons un coup d'oeil à l'implémentation des opérations :
Cela présente plusieurs avantages :
Seul désavantage :
Les arbres quadruples ne sont pas toujours la meilleure structure de données pour la détection de collision. Le surdébit d'un quadtree peut potentiellement être illimité (si vous ne limitez pas la profondeur de l'arbre) et, dans le pire des cas, n'accélérez pas du tout. Au lieu de cela, vous voudrez peut-être envisager d'utiliser une grille clairsemée, qui donne de meilleures performances qu'un quadtree uniquement sans la surcharge supplémentaire de traverser plusieurs niveaux d'arborescence.
Il existe également d'autres approches complètement différentes qui pourraient être encore meilleures. Par exemple, vous pouvez essayer d'implémenter l'algorithme de Zomorodian et Edelsbrunner, comme je l'ai fait dans le module suivant:
Voici également quelques articles que j'ai écrits qui discutent de ces problèmes plus en détail:
En particulier, si vous regardez les benchmarks dans la dernière section, vous verrez que de toutes les bibliothèques étudiées, les quadtrees avaient tendance à fonctionner assez mal par rapport à d'autres méthodes de détection de collision comme les R-Trees, les grilles ou les arbres à segments.
Je ne sais pas encore à quel point le processeur est efficace, mais il semble bien fonctionner sur mon duo de base dans Eclipse, fonctionne toujours à plus de 2400 fps lol ..
fondamentalement, j'ai ajouté une liste d'objets collidables pour stocker des références à des objets de noeud à quatre arbres auxquels j'ai associé l'objet (via l'insertion dans le quadtree). J'ai également ajouté une liste à chaque nœud quadtree, qui stocke les références à tous les objets jugés dans les limites de ce nœud. Ainsi, chaque nœud n'aura qu'une seule occurrence de chaque objet. chaque nœud stocke également une référence à son nœud parent, pour la navigation vers les nœuds voisins si je veux vérifier l'un d'eux après le nœud initial pour une précision de collision supplémentaire.
il est très facile d'obtenir des références à tous les autres objets dans une cellule:
list temp_checklist = object.cells[cell_index].objects
//('objects' being some sort of array or list of object references as described above)
espérons que cela aide quelqu'un;)