Quelle bibliothèque pour octrees ou kd-trees? [fermé]

8

Existe-t-il des bibliothèques performantes robustes pour l'indexation des objets?

Les objets auraient eux-mêmes des limites, plutôt que d'être représentés par des points; et un objet pourrait donc être dans plus d'un compartiment si l'index divise les choses en partitions de taille fixe.

Cela nécessiterait un tri sélectif et des objets visités frappés par un rayon ainsi que des recherches dans le quartier.

Je peux trouver beaucoup d'articles montrant les mathématiques pour les composants, souvent sous forme d'algèbre plutôt que de simple C, mais rien qui les rassemble (à part peut-être Ogre, bien qu'apparemment PyOrge n'expose pas l'octree ). Les créateurs de jeux de loisir n'ont certainement pas tous à créer leurs propres indices spartiaux?

(Je suis assis à écrire ma propre sphère-sphère, sphère-rayon, rayon-aabb, cône-aabb, cône-fustrum, aabb-fustrum et mise en œuvre d'octree; il y a sûrement une meilleure façon c'est-à-dire que quelqu'un a déjà fait cela et fait un joli paquet?!?!)

(Python ou C / C ++ avec liaisons préféré)

Volonté
la source

Réponses:

10

Les créateurs de jeux amateurs n'ont-ils pas tous à faire leurs propres octrees?

À moins qu'ils n'utilisent quelque chose de plus grand (comme Ogre ou un autre moteur de physique / rendu), beaucoup le font. Un octree est une structure assez simple à implémenter, et il y a beaucoup de compromis:

  • L'octree est-il intrusif ou non? S'il est intrusif, vous obtenez de meilleures performances de cache, mais des structures plus grandes.
  • S'il n'est pas intrusif, stocke-t-il des pointeurs ou une sorte de poignée sûre?
  • Est-il stocké à plat ou avec des pointeurs enfants?
  • Dans quelle mesure est-il sûr? S'il utilise des modèles, il sera beaucoup plus sûr avec un temps d'exécution minimal, mais beaucoup plus difficile à lier à Python.
  • Tout octree avec interrogation spatiale devra inclure une sorte de type vecteur / point / rayon, et tout ce qui comporte un tri sélectif va inclure un sous-programme et des routines mathématiques matricielles. Est-ce que l'écriture du code pour interfacer cela à la douzaine de classes matricielles / vectorielles que vous avez déjà glissées depuis toutes les autres bibliothèques que vous utilisez est en fait moins de travail que d'écrire l'octree de base que vous voulez?
  • Est-il compatible avec les threads?

Cela étant dit, il existe de nombreuses implémentations octree en ligne . Ne présumez pas que la capture de l'un d'eux vous fera économiser beaucoup de travail, et ne supposez pas qu'il existe une seule façon de créer une structure de données autre qu'un tableau.


la source
Belle perspicacité! Je me demande comment c'est pour les arbres KD, ce que j'ai vu d'eux, c'est qu'ils sont assez bien à mettre en œuvre (il y a beaucoup de détails délicats à prendre en compte). Peut-être que quelqu'un en sait plus à ce sujet?
Nef
Les arbres kd sont-ils réellement plus difficiles à mettre en œuvre? Je pense qu'ils sont plus difficiles à raisonner, surtout sans dessiner d'images, car ils divisent la géométrie de manière moins intuitive. Mais les algorithmes de base de construction / interrogation ne sont pas vraiment plus longs ou moins explorés que l'octree.
2
Un Octree n'est en fait qu'un arbre KD de cas particulier. Avec plans de séparation à position fixe. En implémentant les arbres KD, vous aurez besoin d'un moyen de trouver votre "meilleur" décalage de division d'axe par nœud.
nul
2

Pour être honnête, le Python Octree lié a été publié en 2006, donc Python-Ogre peut très bien avoir exposé la classe Octree maintenant.

Cependant, en regardant à travers les sources Ogre, je peux voir deux implémentations Octree: une en Plugins/OctreeSceneManager/OgreOctree.het une en Plugins/OctreeZone/OgreOctreeZoneOctree.h.

Si vous me dirigez vers celle dont vous avez besoin d'être exposée, je la mettrai sur ma liste de tâches pour mon propre wrapper Python écrit à la main (il est disponible sur bitbucket, lié dans mon profil.)

De toute façon bonne chance. :RÉ

jsandell
la source
c'est une offre très aimable; J'ahem déjà écrit mon propre bien.
Will
1

J'ai trouvé du code pour une implémentation de Python octree ici , simplement en googlant 'octree python'. ;RÉ

Il ne dépend pas de la bibliothèque (bien qu'il ait été initialement écrit pour PyOgre) et est bien commenté.

Le canard communiste
la source
Une chose que j'ai trouvée dans les octets en Python pur est que la surcharge supplémentaire pour les appels de fonction pour la traversée de l'arbre domine rapidement votre exécution et les rend pires que les recherches simples dans les listes, pour toute quantité d'objets que vous pourriez traiter en pure Python de toute façon. Cet exemple particulier semble également très peu optimisé.
Bien que ce soit un bon morceau de code à digérer si vous deviez créer votre propre octree, hors de la boîte qui ne possède pas toutes les fonctionnalités - intersection ray et fustrum par exemple - que j'ai citées dans la question. En fait, il n'a même pas de recherche de voisin le plus proche. Je me demande à quoi ils utilisent cet octtree, s'ils peuvent mettre des données mais pas les interroger autrement que par point exact? Et il stocke des points, plutôt que des choses avec des limites. J'énumère toutes ces lacunes car cela indique tous les octrois de python que j'ai trouvés sur le Web; peut-être que d'autres peuvent trouver un octree plus complet sur google? Je ne peux pas :(
Will
1

Après avoir essayé sans succès quelques-uns des packages mentionnés ci-dessus, j'ai trouvé RTree , qui est un wrapper autour de libspatialindex .

glennr
la source