Que biblioteca para octrees ou kd-trees? [fechadas]

8

Existem bibliotecas robustas de desempenho para indexação de objetos?

Os objetos teriam limites próprios, em vez de serem representados por pontos; e um objeto poderia estar em mais de um compartimento se o índice dividir as coisas em partições de tamanho fixo.

Seria necessário selecionar e visitar objetos atingidos por um raio, bem como buscas nas vizinhanças.

Eu posso encontrar muitos artigos mostrando a matemática para as partes componentes, geralmente como álgebra, em vez de C simples, mas nada que junte tudo (exceto talvez o Ogre, embora aparentemente o PyOrge não exponha o octree ). Certamente os criadores de jogos de hobby nem todos têm que criar seus próprios índices espartiais?

(Estou sentado escrevendo minha própria implementação esfera-esfera, raio-esfera, raio-aabb, cone-aabb, cone-fustrum, aabb-fustrum e octree; certamente há uma maneira melhor, ou seja, alguém já fez isso e faça uma pacote legal?!?!)

(Python ou C / C ++ com ligações preferenciais)

Vai
fonte

Respostas:

10

Certamente os criadores de jogos de hobby nem todos têm que criar suas próprias cenas?

A menos que estejam usando algo maior (como Ogre, ou outro mecanismo de física / renderização), muitos o fazem. Um octree é uma estrutura bastante simples de implementar, e há muitas vantagens e desvantagens:

  • O octree é intrusivo ou não? Se for intrusivo, você obtém melhor desempenho do cache, mas estruturas maiores.
  • Se não for invasivo, ele armazena ponteiros ou algum tipo de identificador seguro?
  • É armazenado plano ou com ponteiros filhos?
  • Quão seguro é o tipo? Se ele usa modelos, será muito mais seguro com sobrecarga mínima de tempo de execução, mas muito mais difícil de vincular ao Python.
  • Qualquer octree com consulta espacial precisará incluir algum tipo de vetor / ponto / raio, e qualquer coisa com seleção de frustum incluirá rotinas matemáticas de frustum e matriz. Escrever o código para fazer a interface com as dezenas de classes de matriz / vetor que você já arrastou de todas as outras bibliotecas que você está usando, na verdade, é menos trabalhoso do que escrever o octree base que você deseja?
  • É thread-safe?

Dito isto, existem muitas implementações de octree online . Apenas não assuma que pegar um deles economize muito trabalho e não assuma que existe uma maneira verdadeira de criar qualquer estrutura de dados que não seja uma matriz.


fonte
Bom insight! Eu me pergunto como é para as árvores KD, o que eu vi delas é que elas ainda precisam ser implementadas (há muitos detalhes complicados a serem levados em consideração). Talvez alguém saiba mais sobre isso?
Nef
Os kd-trees são realmente mais difíceis de implementar? Eu acho que eles são mais difíceis de raciocinar, principalmente sem desenhar, porque dividem a geometria de uma maneira menos intuitiva. Mas os algoritmos básicos de construção / consulta não são realmente mais ou menos explorados que o octree.
2
Um Octree é na verdade apenas um caso KD-tree especial. Com planos de divisão de posição fixa. Ao implementar as árvores KD, você precisará de alguma maneira de encontrar o seu "melhor" deslocamento de divisão de eixos por nó.
vazio
2

Para ser justo, o Python Octree vinculado foi publicado em 2006, então o Python-Ogre pode muito bem ter exposto a classe Octree até agora.

No entanto, olhando as fontes do Ogre, posso ver duas implementações do Octree: uma Plugins/OctreeSceneManager/OgreOctree.he outra Plugins/OctreeZone/OgreOctreeZoneOctree.h.

Se você me indicar o que você precisa expor, eu o colocarei na minha lista de tarefas para o meu próprio invólucro Python escrito à mão (está disponível no bitbucket, vinculado no meu perfil).

De qualquer forma, boa sorte. : D

jsandell
fonte
isso é uma oferta muito gentil; I Ahem já escrevi o meu próprio embora.
Will
1

Encontrei algum código para uma implementação octree do Python aqui , pesquisando 'octree python' no Google. ; D

Não é dependente da biblioteca (embora originalmente escrito para o PyOgre) e seja bem comentado.

O Pato Comunista
fonte
Uma coisa que eu encontrei nos octrees de puro-Python é que a sobrecarga adicional para chamadas de função para passagem de árvore domina rapidamente seu tempo de execução e os torna piores do que simples pesquisas em listas, para qualquer quantidade de objetos que você possa processar em puro-Python de qualquer maneira. Esse exemplo em particular também parece muito otimizado.
Embora seja um bom código para digerir se você criar seu próprio octree, fora da caixa que octree não possui todos os recursos - interseção de raios e fustrum, por exemplo - que citei na pergunta. Na verdade, ele nem tem a pesquisa de vizinhos mais próxima. Gostaria de saber para que eles usam esse octtree, se eles podem colocar dados, mas não consultá-los além do ponto exato? E armazena pontos, em vez de coisas com limites. Listo todas essas deficiências porque isso é indicativo de todos os octrees python que encontrei na web; talvez outros possam encontrar uma octree mais completa no google? Eu não posso :(
Will
1

Após tentar, sem êxito, alguns dos pacotes mencionados acima, encontrei o RTree , que é um invólucro do libspatialindex .

Glennr
fonte