¿Qué biblioteca para octrees o kd-trees? [cerrado]

8

¿Hay alguna biblioteca robusta de rendimiento para indexar objetos?

Los objetos tendrían límites, en lugar de estar representados por puntos; y, por lo tanto, un objeto podría estar en más de un compartimento si el índice divide las cosas en particiones de tamaño fijo.

Necesitaría el sacrificio y la visita de objetos golpeados por un rayo, así como búsquedas en el vecindario.

Puedo encontrar muchos artículos que muestran las matemáticas para las partes componentes, a menudo como álgebra en lugar de simple C, pero nada que lo reúna todo (aparte de quizás Ogre, aunque aparentemente PyOrge no expone el octree ). ¿Seguramente los creadores de juegos de pasatiempos no tienen que hacer sus propios índices parciales?

(Estoy sentado escribiendo mi propia esfera-esfera, esfera-ray, ray-aabb, cone-aabb, cone-fustrum, aabb-fustrum y octree implementación; seguramente hay una mejor manera, es decir, alguien ya ha hecho esto y ha hecho un ¡¿¡¿lindo paquete?!?!)

(Python o C / C ++ con enlaces preferidos)

Será
fuente

Respuestas:

10

¿Seguramente los creadores de juegos de pasatiempos no tienen que hacer sus propios octrees?

A menos que estén usando algo más grande (como Ogre u otro motor de física / renderizado), muchos lo hacen. Un octree es una estructura bastante simple de implementar, y hay muchas compensaciones:

  • ¿El octree es intrusivo o no? Si es intrusivo, obtienes un mejor rendimiento de caché, pero estructuras más grandes.
  • Si no es intrusivo, ¿almacena punteros o algún tipo de asa segura?
  • ¿Se almacena plano o con punteros infantiles?
  • ¿Qué tan seguro de tipo es? Si usa plantillas, será mucho más seguro con una sobrecarga de tiempo de ejecución mínima, pero mucho más difícil de vincular a Python.
  • Cualquier octree con consultas espaciales tendrá que incluir algún tipo de vector / punto / rayo, y cualquier cosa con eliminación de frustum incluirá rutinas matemáticas de matriz y frustum. ¿Escribir el código para interconectarlo con la docena de clases de matriz / vector que ya ha arrastrado de todas las otras bibliotecas que está utilizando en realidad es menos trabajo que solo escribir el octree base que desea?
  • ¿Es seguro para subprocesos?

Dicho esto, hay muchas implementaciones de octree en línea . Simplemente no asuma que agarrar uno de ellos le ahorrará mucho trabajo, y no asuma que hay una forma verdadera de hacer cualquier estructura de datos que no sea una matriz.


fuente
Buena idea! Me pregunto cómo es para los árboles KD, lo que he visto de ellos es que son bonitos de implementar (hay muchos detalles difíciles de tener en cuenta). Tal vez alguien sabe más sobre esto?
Nef
¿Son los árboles kd realmente más difíciles de implementar? Creo que son más difíciles de razonar, especialmente sin hacer dibujos, porque dividen la geometría de una manera menos intuitiva. Pero los algoritmos básicos de construcción / consulta ya no se exploran ni se exploran menos que el octree.
2
Un Octree es en realidad solo un caso especial KD-tree. Con posición fija dividiendo planos. Implementando árboles KD necesitará alguna forma de encontrar su "mejor" desplazamiento de división de eje por nodo.
nulo
2

Para ser justos, el Python Octree vinculado se publicó en 2006, por lo que Python-Ogre podría haber expuesto la clase Octree por ahora.

Sin embargo, mirando a través de las fuentes de Ogre, puedo ver dos implementaciones de Octree: una en Plugins/OctreeSceneManager/OgreOctree.hy otra en Plugins/OctreeZone/OgreOctreeZoneOctree.h.

Si me señala el que necesita exponer, lo pondré en mi lista de tareas para mi propio envoltorio de Python escrito a mano (está disponible en bitbucket, vinculado en mi perfil).

De todos modos, buena suerte. :RE

jsandell
fuente
esa es una oferta muy amable; Me ejem ya escribí mi propia sin embargo.
Will
1

Encontré un código para una implementación de Python Octree aquí , simplemente buscando en Google 'Octree Python'. ;RE

No depende de la biblioteca (aunque originalmente se escribió para PyOgre) y está bien comentado.

El pato comunista
fuente
Una cosa que he encontrado en los octrees de Python puro es que la sobrecarga adicional para las llamadas de función para el recorrido del árbol domina rápidamente su tiempo de ejecución y los hace peores que las búsquedas simples en listas, para cualquier cantidad de objetos que pueda procesar en Python puro de todos modos. Ese ejemplo particular también parece muy poco optimizado.
Si bien es un buen código para digerir si tuviera que hacer su propio octree, fuera de la caja ese octree carece de todas las características, por ejemplo, la intersección de ray y fustrum, que cité en la pregunta. De hecho, ni siquiera tiene la búsqueda de vecino más cercano. Me pregunto para qué usan ese octtree, si pueden poner datos pero no consultarlos más que por punto exacto. Y almacena puntos, en lugar de cosas con límites. Enumero todas estas deficiencias porque esto es indicativo de todos los octreos de python que he encontrado en la web; tal vez otros puedan encontrar un octree más completo en google? No puedo :(
Will
1

Después de probar sin éxito un par de los paquetes mencionados anteriormente, encontré RTree , que es un contenedor alrededor de libspatialindex .

glennr
fuente