J'ai implémenté un QuadTree fonctionnel. Il subdivise l'espace 2-d afin d'accommoder les objets, identifiés par leur boîte englobante (x, y, largeur, hauteur) sur le plus petit quad possible (jusqu'à une superficie minimale).QuadTrees - comment mettre à jour lorsque des éléments internes sont en mouvement
Mon code est basé sur cette mise en œuvre (la mienne est en Lua au lieu de C#): http://www.codeproject.com/KB/recipes/QuadTree.aspx
Je suis en mesure de mettre en œuvre avec succès des insertions et des suppressions. Je me tourne maintenant vers la fonction update(), car la position et les dimensions de mes objets changent avec le temps.
Ma première mise en œuvre fonctionne, mais il est tout à fait naïve:
function QuadTree:update(item)
self:remove(item)
return self.root:insert(item)
end
Eh oui, je supprimer essentiellement et réinsérez chaque élément à chaque fois qu'ils se déplacent.
Cela fonctionne, mais je voudrais l'optimiser un peu plus; après tout, la plupart du temps, les éléments en mouvement restent sur le même nœud quadTree.
Existe-t-il un moyen standard pour gérer ce type de mise à jour?
Dans le cas où il aide, mon code est ici: https://github.com/kikito/middleclass-ai/blob/master/QuadTree.lua
Je ne cherche pas quelqu'un pour la mettre en œuvre pour moi; des pointeurs vers une implémentation de travail existante (même dans d'autres langues) suffiraient.
Merci d'avoir répondu. La géométrie est mise à jour en dehors du quadtree - les éléments eux-mêmes sont chargés de le faire. Le problème avec votre exemple est oldNode: contains() - même s'il contient l'item, il se peut que le nouveau node soit l'un des enfants de oldNode; par exemple, si l'article est plus petit. J'ai des difficultés à essayer de modéliser ça. – kikito
C'est un bon point que je n'ai pas précisé: contains, remove et insert peuvent tous être des implémentations non récursives parce que le nœud sur lequel ils travaillent est correct, c'est-à-dire qu'ils travaillent sur un Node, même s'il y n'est pas une classe de noeud distincte.findNode doit fonctionner de manière récursive sur un arbre, il est similaire à insert, mais sans faire l'insertion réelle. – richj
À la réflexion, il serait préférable que findNode ne divise pas un nœud complet, car tous les appels findNode ne sont pas suivis d'un insert. J'ai mis à jour le pseudo-code pour permettre à newNode.insert (item) de renvoyer un noeud enfant de newNode. – richj