Determinare se la rimozione di un voxel spezzerà un gruppo


8

Ho la seguente situazione: ho una griglia 3d di voxel (on / off, la dimensione massima è probabilmente 128x128x128). So in anticipo che all'interno della griglia, tutti i voxel che sono accesi sono interconnessi, formando un singolo gruppo.

Ora devo determinare: quando rimuovo un voxel (lo spengo), si romperà il gruppo?

La mia idea iniziale era di guardare i vicini del voxel che è stato rimosso e determinare se sono ancora interconnessi attraverso altri voxel (vedi la mia altra domanda: Algoritmo per vedere se due voxel sono interconnessi ). Ma potrebbero esserci modi migliori / altri per farlo.

Quindi quale sarebbe un buon modo per determinare se la rimozione di un voxel spezzerà il gruppo di cui faceva parte?

Risposte:


4

L'ho trattato in qualche modo nell'altro mio commento, ma penso che qui stai pensando alla classificazione esterna / interna. Rimuovendo un voxel, si stanno cambiando i voxel attorno ad esso in voxel 'edge' (se non lo fossero già). Questo dovrebbe ridursi in 3 casi reali (la simmetria ti porta il resto di loro) - nell'esempio sotto i numeri sono gli ID di gruppo, il - è il voxel che viene rimosso

11      2    
1-     1-     1-2
  • Il primo caso è banale: è un angolo, ma i voxel sopra e a sinistra rimangono completamente collegati attraverso l'altro voxel.

  • Il secondo caso: è un angolo e il voxel rimosso ha disconnesso i voxel precedenti e di quelli precedentemente collegati

  • Il terzo caso: è una linea e il voxel rimosso ha disconnesso i voxel sinistro e destro precedentemente collegati.

Se ti accorgi che si sono verificati il ​​2o o il 3o caso, devi fare un po 'di ricerca del percorso per vedere se 1 e 2 sono ancora connessi attraverso i loro altri voxel adiacenti.

Puoi ottenere un po 'di efficienza qui però. Se un voxel è interamente interno a un gruppo (ovvero tutti e 8 i suoi vicini fanno parte dello stesso gruppo), allora può essere scontato. Perché? È una questione di topologia. Immagina il caso 2D: ci sono solo due possibilità. O c'è un solo bordo che, indipendentemente da come si gira e gira, forma ancora un anello di voxel. Oppure, ci sono due anelli, uno contenente un voxel e uno contenente l'altro. Per esempio:

 xxx xxx
 x x-x x
 xxx xxx

o

 xxxxxxx
 x     x
 xxx xxx
   x-x 
 xxx xxx

Ciò dovrebbe estendersi anche al 3D, tranne che al posto di un anello perimetrale, avresti una superficie perimetrale. Quindi, quando stai cercando di determinare se i due voxel recentemente disconnessi sono ancora connessi, puoi escludere tutti i voxel interni dal tuo attraversamento, perché per definizione se un voxel è collegato a uno dei voxel di confine di un gruppo, è anche collegato a tutti i voxel interni in quel gruppo.

È una sorta di effetto inverso dei voxel hub di cui ho parlato nella mia risposta all'altra domanda: non devi trovare la tua strada da ogni voxel a ogni altro voxel, devi solo trovare la tua strada verso i voxel interessanti .


Grazie, usare solo i voxel sulla superficie del volume sembra un'ottima ottimizzazione.
Bram Vaessen,

3

Se stai usando A *, puoi utilizzarlo qui.

A partire da un elenco dei voxel che erano collegati al voxel rimosso. Inizia con il primo nell'elenco, usa A * per trovare un percorso al secondo nell'elenco. Se esiste un percorso, trova un percorso dal secondo al terzo, dal terzo al quarto e così via.

La maggior parte di queste ricerche sarà molto veloce, perché i voxel saranno uno accanto all'altro. Se c'è qualche percorso che fallisce, significa che è stata creata una discontinuità.

Questo dovrebbe essere abbastanza facile da implementare se hai già implementato la funzionalità A *.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.