Dividir modelo 3D por loop de aresta
-
21-12-2019 - |
Pergunta
Eu tenho um modelo 3D, representado mais ou menos assim:
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;
}
É claro que isto pode ser transformado em qualquer representação que seja mais conveniente.
Quero dividir este modelo em várias partes desconectadas, ao longo de vários loops de arestas conectadas, e criar novas faces para cobrir as extremidades.Exemplo com um loop:
As novas faces devem estar na mesma posição e idênticas, exceto por suas conexões com outras faces, mas neste exemplo eu as separei.Como eu poderia fazer isso?
Não importa se os vértices são compartilhados entre as partes desconectadas.
Como cada aresta conecta exatamente duas faces, tentei dividir cada aresta individualmente em duas cópias (uma para cada face).Isso separa o modelo conforme necessário, mas não consigo ver uma maneira de adicionar corretamente as novas faces.
Esta questão é marcada como algoritmo de grafos porque este problema parece estar de alguma forma relacionado à teoria dos grafos.
Solução
- Corrija seu modelo.
class Edge
deve conter ponteiros paraFace
eVertex
em vez de valores. - Você quer usar algum tipo de
set
em vez deList
dentro do seuclass Model
.Isso ajuda a encontrar e remover coisas e garante que não haja duplicatas.
- Crie um protótipo de sua função.Eu sugiro
pair<Model*, Model*> split_model( const Model* mx, const List<Edge*>& loop );
- crie dois modelos novos e vazios, digamos
ma
emb
.Adicione as bordas deloop
para cada um deles. - escolha uma borda do
loop
.Vamos chamar as duas faces ligadas a elefa
efb
. - adicionar
fa
para o modeloma
.Começando defa
, faça uma pesquisa completa no gráfico seguindo todas as arestas anexadas afa
, e todas as faces anexadas a essas arestas e assim por diante.Todas as faces e arestas encontradas devem ser seguidas e adicionadas ao modeloma
.Se você encontrar faces ou arestas que já fazem partema
você não os segue.Em particular, isso é o que acontece sempre que você encontra uma aresta que pertence aloop
então você nunca cruza a fronteira.Desta forma você faz uma pesquisa completa de todas as arestas e faces de um lado e acaba com um modelo completoma
.Finalmente você adiciona uma face representando o corte.Os vértices podem ser ignorados aqui, mas é claro que no final você provavelmente desejará adicionar todos os vértices que pertencem às faces que você adicionou. - Repita este passo começando pelo rosto
fb
para criar o modelomb
representando a outra parte.