Dividi il modello 3D per loop del bordo
-
21-12-2019 - |
Domanda
Ho un modello 3D, rappresentato qualcosa del genere:
class Vertex
{
double x, y, z;
}
class Edge
{
Vertex *v1, *v2; // no particular order
Face *f1, *f2; // no particular order. f2 may be null.
}
class Face
{
List<Vertex*> vertices; // clockwise order
List<Edge*> edges; // clockwise order
}
class Model
{
List<Face*> faces;
List<Vertex*> vertices;
List<Edge*> edges;
}
Naturalmente questo può essere trasformato in qualunque rappresentazione sia più conveniente.
Voglio dividere questo modello in più parti sconnesse, lungo più anelli di bordi collegati e creare nuove facce per coprire le estremità.Esempio con un ciclo:
I nuovi volti dovrebbero essere nella stessa posizione e identici a parte le connessioni con gli altri volti, ma per questo esempio li ho spostati.Come potrei farlo?
Non importa se i vertici sono condivisi tra le parti altrimenti disconnesse.
Poiché ogni bordo collega esattamente due facce, ho provato a dividere ciascun bordo individualmente in due copie (una per ciascuna faccia).Questo separa il modello come richiesto, ma non riesco a vedere un modo per aggiungere correttamente i nuovi volti.
Questa domanda è etichettata come algoritmo dei grafi perché questo problema sembra essere in qualche modo correlato alla teoria dei grafi.
Soluzione
- Correggi il tuo modello.
class Edge
dovrebbe contenere puntatori aFace
EVertex
invece che valori. - Vuoi usare qualche tipo di
set
invece diList
dentro il tuoclass Model
.Questo aiuta a trovare e rimuovere cose e ti assicuri che non ci siano duplicati.
- Realizza un prototipo della tua funzione.suggerisco
pair<Model*, Model*> split_model( const Model* mx, const List<Edge*>& loop );
- creare due nuovi modelli vuoti, diciamo
ma
Emb
.Aggiungi i bordi daloop
a ciascuno di essi. - scegli un bordo da
loop
.Chiamiamo le due facce ad esso collegatefa
Efb
. - aggiungere
fa
al modelloma
.A partire dafa
, esegui una ricerca grafica completa seguendo tutti gli spigoli collegati afa
, e tutte le facce collegate a tali bordi e così via.Tutte le facce e i bordi incontrati devono essere seguiti e aggiunti al modelloma
.Se incontri facce o bordi che fanno già partema
non li segui.In particolare questo è ciò che accade ogni volta che si incontra un bordo che gli appartieneloop
quindi non attraversi mai il confine.In questo modo esegui una ricerca completa di tutti i bordi e le facce su un lato e ti ritroverai con un modello completoma
.Infine aggiungi una faccia che rappresenta il taglio.I vertici possono essere per lo più ignorati qui, ma ovviamente alla fine probabilmente vorrai aggiungere tutti i vertici che appartengono alle facce che hai aggiunto. - Ripeti questo passaggio partendo dal viso
fb
per creare il modellomb
rappresentare l'altra parte.