Un piccolo background sulle decisioni di design fino ad ora ... Ho sviluppato una struttura ad otto che può memorizzare punti. Ho scelto di limitare la ricorsione di "generazioni" in base a una determinata dimensione voxel di base. I nodi figli vengono creati solo quando i punti vengono aggiunti a quel nodo. Questo è non un'applicazione grafica dinamica: questo otto e gli oggetti in esso contenuti sono statici, quindi la pre-elaborazione per migliorare le prestazioni non è un problema.Dove immagazzino le forme in un ottetto?
Ora, vorrei aggiungere "forme" al mio otto - in particolare, una mesh di superficie composta da triangoli. I vertici di questi triangoli non corrispondono ai punti memorizzati nell'occhiello. Come si memorizzano queste forme nell'occhiello? Vedo due opzioni ...
nodi grigio sono "vuoto", nel senso che non hanno forme. Nell'alternativa 1, le forme vengono memorizzate in ogni nodo che intersecano, ovvero il nodo 1a contiene shape1 e 4c & 4d share shape2. Nell'alternativa 2, le forme sono memorizzate solo nel nodo più piccolo che intersecano, cioè il nodo 1a contiene shape1 e il nodo 4 contiene shape2.
La maggior parte dei post su octree che ho visto presuppongono Alt1, ma non spiegano mai perché. Alt2 ha più senso per me e creerà solo un lavoro extra per quelle forme che risiedono sui confini dei nodi. Perché è preferibile Alt1?
Modifica: per chiarire, il mio linguaggio di implementazione è C++, quindi preferirei implementazioni di esempio in quella lingua, ma la domanda è indipendente dalla lingua. Scusa se l'uso dei tag è errato.
Edit2: Sebbene non sia direttamente correlato alla questione dell'archiviazione delle forme, this link ha una buona discussione sull'ottava traversal dietro la domanda. Ho pensato che potesse aiutare chiunque fosse interessato a lavorare su questa domanda.
+1 Trovo questa domanda interessante e ben presentata (e non ho assolutamente alcun indizio su una risposta, solo dicendo in anticipo). È corretto supporre che il motivo per il tag C++ sia la tua preferenza per proposte di schemi di indirizzamento validi da presentare? Se è così, potresti voler chiarire che nella domanda, anche se suppongo che qualcuno possa favorire una risposta in Forth, probabilmente la analizzerai facilmente. Come scritto, sarebbe ben indipendente dal tag di lingua. – WhozCraig
Il motivo di Alt1 è la precisione implicita. I test octree aabb vengono eseguiti più rapidamente rispetto ai test a triangolo. Così un albero di grano più fine con più registrazioni della stessa maglia consentirà query più rapide. Come nel log n rispetto a n, in termini di complessità. Ma dall'altra parte ha una memoria più intensa di alt2. Inoltre, per la geometria non statica, gli aggiornamenti sono più costosi di quelli di alt2. Nel complesso, la scelta su quale tipo di suddivisione si sceglie dipende dal tipo di scena che si sta trattando. La quantità di oggetti e la variabilità giocano ruoli uguali (e memoria). – meandbug
@WhozCraig: il flag C++ è stato incluso solo perché è la mia lingua di implementazione e qualsiasi codice di esempio sarebbe meglio compreso in quella lingua. Hai ragione che la domanda stessa è indipendente dalla lingua. – Phlucious