O uso de estruturas de dados avançadas para representação de objetos poligonais é importante em muitos casos, por exemplo: durante a simplificação da malha poligonal de um modelo tridimensional. É necessário o conhecimento das adjacências entre os componentes da malha, como faces e vértices. Tais estruturas são conhecidas como boundary representations (“representações de bordas”) ou simplesmente b-reps, que armazenam os dados de um objeto poligonal (vértices, arestas e faces), além de informações adicionais sobre adjacências (Glassner, 1991).
1. Geometria Computacional - Winged Edge
Michel Alves dos Santos ∗
Outubro de 2011
Resumo
O uso de estruturas de dados avançadas para
representação de objetos poligonais é impor-
tante em muitos casos, por exemplo: durante a
simplificação da malha poligonal de um modelo
tridimensional (figura 3). É necessário o conhe-
cimento das adjacências entre os componentes
da malha, como faces e vértices. Tais estruturas
são conhecidas como boundary representations
(“representações de bordas”) ou simplesmente
b-reps, que armazenam os dados de um objeto
poligonal (vértices, arestas e faces), além de in-
formações adicionais sobre adjacências (Glass-
ner, 1991). Neste pequeno artigo iremos falar
sobre a estrutura de dados Winged-Edge pro-
posta por (Baumgart, 1975) para representação
de modelos poligonais e exibir alguns trechos al-
gorítmicos relativos a consultas que podem ser
realizadas nessa estrutura com o intuito de des-
cobrir relações de adjacência e incidência envol-
vendo vértices, arestas e faces. As consultas se-
rão apresentadas em formato de pseudo-código.
1 Introdução
Uma das estruturas de dados baseada em
aresta é a Winged-Edge, introduzida por (Baum-
gart, 1975; Hanks, 2005). Esta estrutura associa
a cada aresta identificadores das arestas imedi-
atamente anterior e posterior. Para cada sen-
tido da aresta temos, portanto, uma aresta an-
terior e posterior, ou seja, anterior horária (pcw
ou egde-head-right), posterior horária (ncw ou
egde-tail-right), anterior anti-horária (pccw ou
egde-tail-left) e posterior anti-horária (nccw ou
egde-head-left). As relações de adjacência e in-
cidência podem ser observadas nas figuras 1, 2,
4, 5 e 6.
∗Bacharelando em Ciência da Computação, Univer-
sidade Federal do Estado de Alagoas (UFAL). E-mail:
michel.mas@gmail.com. Disciplina: Geometria Compu-
tacional. Docente Responsável: Thales Vieira.
Figura 1: Visualização da estrutura de dados
Winged-Egde. Observe que existe uma orien-
tação entre os vértices inicial e final da aresta
e que esta mesma ainda mantêm apontadores
para as arestas posteriores e anteriores, ocor-
rendo o mesmo com as faces adjacentes. A face
denotada pelo apontador face_right possui sen-
tido horário de navegação em relação a orienta-
ção v0v1 enquanto a face face_left possui sen-
tido anti-horário.
Figura 2: Visualização da estrutura de dados
Winged-Egde em relação a um polígono. Ob-
serve como a estrutura e sua semântica de ori-
entação facilitam a navegação em relação a dis-
posição de elementos: vértices, arestas e faces.
1
2. Explorando esta representação das arestas,
as faces incluem somente o identificador de
uma aresta arbitrária e sua orientação na face.
Partindo-se desta aresta, todas as demais ares-
tas da face podem ser acessadas utilizando os
identificadores de aresta anterior ou posterior.
Uma variação desta estrutura adiciona os iden-
tificadores das faces incidentes nos dois sentidos
(Farin et al., 2003).
A estrutura de dados Winged-Egde é um po-
deroso mecanismo para manipulação de mode-
los poligonais, onde a idéia básica é baseada em
uma aresta e seus polígonos adjacentes. O nome
dessa estrutura é proveniente do corpo de uma
borboleta, imaginando os dois polígonos como
suas asas e a aresta como o seu corpo, separando
suas asas.
2 Estrutura
Uma listagem em pseudo-código da estrutura
Winged-Edge pode ser visualizada logo abaixo.
Podemos observar que o receptáculo que repre-
senta uma aresta através da abordagem Winged-
Edge armazena oito apontadores: dois para os
vértices inicial e final (tail e head), dois para as
faces incidentes da esquerda e da direita (left e
right) e quatro para as arestas adjacentes.
/∗ Data s t r u c t u r e − Vertex ∗/
c l a s s WE_Vertex
{
WE_Edge ∗ incident_edge ;
WE_VertexDataObject data ;
}
/∗ Data s t r u c t u r e − Edge∗/
c l a s s WE_Edge
{
// V e r t i c e s
WE_Vertex ∗ v e r t e x _ t a i l ;
WE_Vertex ∗ vertex_head ;
// Faces
WE_Face ∗ f a c e _ l e f t , ∗ f a c e _ r i g h t ;
// Edges
WE_Edge ∗ egde_head_left ;
WE_Edge ∗ egde_head_right ;
WE_Edge ∗ e g d e _ t a i l _ l e f t ;
WE_Edge ∗ e g d e _ t a i l _ r i g h t ;
// A data
WE_EdgeDataObject data ;
}
/∗ Data s t r u c t u r e − Face ∗/
c l a s s WE_Face
{
WE_Edge ∗ incident_edge ;
WE_FaceDataObject data ;
}
O receptáculo que representa vértices arma-
zena apenas um apontador para a aresta no qual
o mesmo incide. O receptáculo que representa
uma face armazena, da mesma maneira, ape-
nas um apontador para uma aresta arbitrária
na qual a face incide.
3 Consultas Suportadas
A escolha de uma estrutura de dados é deter-
minada pelo conjunto de operações elementares
que são suportadas eficientemente. A estrutura
Winged-Edge possui um conjunto de operações
básicas decorrentes de sua prototipação e um
conjunto de operações extendidas de baixa com-
plexidade. Alguns exemplos de consulta podem
ser visualizados logo abaixo:
• (FV) Todos os vértices de uma face;
• (EV) Vértices de uma aresta (extremos);
• (VF) Todas as faces que compartilham um
vértice;
• (EF) Todas as faces que compartilham uma
aresta;
• (FE) Todas as arestas de uma face;
• (VE) Todas as arestas que compartilham
um vértice;
Para a estrutura Winged-Edge as operações EV
e EF são consideradas básicas ou trivias (Nepe-
rud et al., 2007).
3.1 Consultas Básicas
Como dito antes, a estrutura Winged-Edge
possui um conjunto de operações básicas decor-
rentes de sua prototipação. Algumas dessas ope-
rações são listadas logo abaixo:
• Dado um vértice, retornar a aresta imedi-
tamente incidente ao vértice;
• Dada uma aresta, retornar os vértices de
suas extremidades (EV);
• Dada uma aresta, retornar as faces que o
compartilham;
• Dada uma aresta, retornar as arestas adja-
centes;
• Dada uma face, retornar a aresta imediata-
mente incidente.
2
3. /∗ I n c i d e n t Edge∗/
WE_Edge E = v−>incident_edge ;
/∗ Extreme V e r t i c e s ∗/
WE_Vertex t a i l = e−>v e r t e x _ t a i l ;
WE_Vertex head = e−>vertex_head ;
/∗ A l l f a c e s s h a r i n g an edge ∗/
WE_Face l e f t = e−>f a c e _ l e f t ;
WE_Face r i g h t = e−>f a c e _ r i g h t ;
// Adjacent Edges
WE_Edge h l = e−>egde_head_left ;
WE_Edge hr = e−>egde_head_right ;
WE_Edge t l = e−>e g d e _ t a i l _ l e f t ;
WE_Edge t r = e−>e g d e _ t a i l _ r i g h t ;
// I n c i d e n t Edge
WE_Edge E = f −>incident_edge ;
3.2 Consultas Extendidas
Como dito antes, a estrutura Winged-Edge
possui um conjunto de operações extendidas de
baixa complexidade. Alguns exemplos são apre-
sentados a seguir:
• Dada uma face retornar todas as arestas;
/∗ A l l edges o f a f a c e ∗/
WE_Edge_List FE (WE_Face f )
{
WE_Edge_List l i s t ;
WE_Edge e0 = f −>incident_edge ;
WE_Edge e = e0 ;
do
{
l i s t . put ( e ) ;
i f ( e−>f a c e _ l e f t == f )
{
e = e−>egde_head_left ;
}
e l s e
{
e = e−>e g d e _ t a i l _ r i g h t ;
}
} w h i l e ( e != e0 ) ;
r e t u r n l i s t ;
}
As operações FV e VF são similares.
• Dado um vértice retornar todas as arestas
que o compartilham;
/∗ A l l edges s h a r i n g a v e r t e x ∗/
WE_Edge_List VE (WE_Vertex v )
{
WE_Edge_List l i s t ;
WE_Edge e0 = v−>incident_edge ;
WE_Edge e = e0 ;
do
{
l i s t . put ( e ) ;
i f ( e−>vertex_head == v )
{
e = e−>egde_head_right ;
}
e l s e
{
e = e−>e g d e _ t a i l _ l e f t ;
}
} w h i l e ( e != e0 ) ;
r e t u r n l i s t ;
}
• Dado um vértice retornar todas as faces in-
cidentes;
WE_Face_List VFL (WE_Vertex v )
{
WE_Face_List l i s t ;
WE_Edge e0 = v−>incident_edge ;
WE_Edge e = e0 ;
WE_Face f = e−>f a c e _ l e f t ;
do
{
l i s t . put ( f ) ;
i f ( e−>vertex_head == v )
{
e = e−>egde_head_right ;
f = e−>f a c e _ l e f t ;
}
e l s e
{
e = edge−>e g d e _ t a i l _ l e f t ;
f = e−>f a c e _ r i g h t ;
}
} w h i l e ( e != e0 ) ;
r e t u r n l i s t ;
}
• Dado um vértice retornar todos os demais
vértices vizinhos;
WE_Vertex_List VVL (WE_Vertex v )
{
WE_Vertex_List l i s t ;
WE_Edge e0 = v−>incident_edge ;
WE_Edge e = e0 ;
WE_Vertex v = e−>vertex_head ;
do
{
l i s t . put ( v ) ;
i f ( e−>vertex_head == v )
{
e = e−>egde_head_right ;
v = e−>vertex_head ;
}
e l s e
{
e = edge−>e g d e _ t a i l _ l e f t ;
v = e−>v e r t e x _ t a i l ;
}
} w h i l e ( e != e0 ) ;
r e t u r n l i s t ;
}
• Dado uma aresta retornar todos as demais
arestas vizinhas;
WE_Edge_List EEL (WE_Edge E)
{
WE_Edge_List l 1 = VEL(E−> v e r t e x _ t a i l ) ;
WE_Edge_List l 2 = VEL(E−>vertex_head ) ;
3
4. // Remove edge E from the l i s t s
l 1 . remove (E) ;
l 2 . remove (E) ;
// Combine l i s t s
r e t u r n l 1 + l 2 ;
}
• Dada uma face retornar as demais faces in-
cidentes;
WE_Face_List FFL (WE_Face F)
{
WE_Edge_List l 1 = FE(F) ;
WE_Face_List l i s t ;
WE_Edge e ;
f o r each ( e i n l 1 )
{
i f ( e−>f a c e _ l e f t == F)
{
l i s t . put ( e−>f a c e _ r i g h t ) ;
}
e l s e
{
l i s t . put ( e−>f a c e _ l e f t ) ;
}
}
r e t u r n l i s t ;
}
• Calcular a K-ésima vizinhança estrelada,
dado K e um vértice;
/∗ KStarryNeighborhood − Neighbourhood s t a r ∗/
//K − s i z e o f neighborhood
// v l − v e r t e x l i s t with one v e r t e x i n i t i a l l y
// b l − l i s t t h a t c h e c k s i f v e r t e x l a b e l e d
WE_Vertex_List KSN( I n t K,
WE_Vertex_List vl ,
B o o l L i s t& b l )
{
i f (K == 1 )
{
r e t u r n Neighbors ( vl , b l ) ;
}
e l s e
{
r e t u r n Neighbors (KSN(K−1 , vl , b l ) , b l ) ;
}
}
/∗ Returns l i s t o f a l l n e i g h b o r s ∗/
WE_Vertex_List Neighbors ( WE_Vertex_List vl ,
B o o l L i s t& b l )
{
WE_Vertex v ;
WE_Vertex_List l i s t
f o r each ( v i n v l )
{
l i s t = l i s t + VVL( v , b l ) ;
}
r e t u r n l i s t ;
}
/∗ Returns a l l marked n e i g h b o r s ∗/
WE_Vertex_List VVL( WE_Vertex v , B o o l L i s t& b l )
{
WE_Vertex_List l i s t ;
WE_Edge e0 = v−>i n c i d e n t _ e d g e ;
WE_Edge e = e0 ;
WE_Vertex v = e−>vertex_head ;
do
{
// c h e c k s i f t he v e r t e x i s marked
i f ( ! b l [ v−>i d ] )
{
l i s t . put ( v ) ;
b l [ v−>i d ] = t r u e ;
}
i f ( e−>vertex_head == v )
{
e = e−>egde_head_right ;
v = e−>vertex_head ;
}
e l s e
{
e = edge −> e g d e _ t a i l _ l e f t ;
v = e−> v e r t e x _ t a i l ;
}
} w h i l e ( e != e0 ) ;
r e t u r n l i s t ;
}
4 Conclusões
A estrutura de dados Winged-Edge foi intro-
duzida por (Baumgart, 1975) para simplificar
a manipulação de modelos poligonais pois man-
têm tanto informação geométrica quanto topoló-
gica (figura 6), o que facilita ainda mais o trata-
mento de alguns modelos. Além disso Winged-
Edge possui um conjunto de operações triviais
que facilitam a execução de consultas de adja-
cência e incidência sem proporcionar demasiada
sobrecarga.
A estrutura de dados Winged-Edge permite
a passagem rápida entre faces, arestas e vér-
tices, devido à sua estrutura explicitamente li-
gada em rede (figura 4). Esta forma de especifi-
car uma grade desestruturada está em contraste
com especificações mais simples de malhas de
polígonos, tais como nó e lista de elementos, ou
a conectividade implícita de uma grade regular
(de Berg et al., 2008).
Figura 3: A estrutura Winged-Egde é uma re-
presentação de dados utilizada para descrever
modelos poligonais em computação gráfica. Ex-
plicitamente descreve a geometria e a topologia
de faces, arestas e vértices quando três ou mais
superfícies se reúnem e se encontram em uma
aresta comum.
O principal incômodo da estrutura Winged-
Egde é sua grande demanda de armazenamento
o que ocasiona maior complexidade devido à
manutenção dos vários índices pertencentes as
listas de vértices, arestas e faces. Um exemplo
dessa demanda pode ser observado através da
figura 5.
4
5. Figura 4: A estrutura Winged-Egde permite a pas-
sagem rápida entre faces, arestas e vértices, devido
à estrutura explicitamente ligada em rede. Esta re-
presentação é amplamente utilizada em programas
de modelagem para fornecer maior flexibilidade na
alteração dinâmica da geometria da malha, com isso
operações de divisão e mesclagem podem ser execu-
tadas rapidamente (Foley, 1996).
Referências
Baumgart, B. G. (1975), ‘Winged-edge polyhe-
dron representation for computer vision’, Na-
tional Computer Conference.
Beall, M. W. & Shephard, M. S. (1997), ‘A ge-
neral topology-based mesh data structures’,
International Journal for Numerical Methods
in Engineering 40(9), 1573–1596.
Braid, I., Hillyard, R. & Stroud, I. (1980),
‘Stepwise construction of polyhedra in geo-
metric modelling’, Mathematical Methods in
Computer Graphics and Design pp. 123–141.
de Berg, M., Cheong, O. & van Kreveld, M.
(2008), Computational geometry: algorithms
and applications, 3 ed., Springer.
Farin, G., Hamann, B. & Hagen, H. (2003), Hie-
rarchical and geometrical methods in scientific
visualization, Mathematics and visualization,
Springer.
Fischer, R. (1991), Genesys - um sistema hí-
brido de modelagem de sólidos, Master’s the-
sis, Departamento de Informática - Pontifícia
Universidade Católica - PUC-Rio - Rio de Ja-
neiro.
Foley, J. D. (1996), Computer graphics: princi-
ples and practice, 2 ed., Addison-Wesley Pro-
fessional.
Glassner, A. S. (1991), ‘Maintaining winged-
edge models’, Graphics Gems II - Academic
Press 2, 191–201.
Gois, J. & Piteri, M. (2002), ‘Geração automá-
tica de malhas de elementos finitos e a estru-
tura de dados winged-edge modificada’, Ten-
dências em Matemática Aplicada e Computa-
cional 3(1), 121–130.
Hanks, B. W. (2005), Proceedings of the 14th
International Meshing Roundtable, Springer.
Leondes, C. T. (2002), Database and data com-
munication network systems: techniques and
applications, Vol. 2, Elsevier Science - Acade-
mic Press.
Neperud, B., Lowther, J. & Shene, C.-K. (2007),
‘Visualizing and animating the winged-edge
data structure’, Elsevier.
O’Rourke, J. (1998), Computational geometry in
C, 2 ed., Cambridge University Press.
Piteri, M. (1999), Geração Automática de Ma-
lhas Hierárquico-Adaptativas em Domínios
Bidimensionais e Tridimensionais, PhD the-
sis, Universidade Técnica de Lisboa.
Piteri, M. & Almeida, J. (1995), ‘Hierarchical 2d
mesh generation using topological data struc-
tures’, Education, Practice and Promotion of
Computational Methods in Engineering Using
Small Computers 2, 981–986.
Vince, J. A. (2000), Essential computer anima-
tion fast: how to understand the techniques
and potential of computer animation, Sprin-
ger.
Conteúdo
1 Introdução 1
2 Estrutura 2
3 Consultas Suportadas 2
3.1 Consultas Básicas . . . . . . . . . . . 2
3.2 Consultas Extendidas . . . . . . . . 3
4 Conclusões 4
Referências 5
5
6. Figura 5: A principal desvantagem da estrutura Winged-Egde é a sua grande demanda de armazenamento
o que acarreta maior complexidade devido à manutenção de muitos índices. Uma boa discussão das
questões de implementação da estrutura Winged-Egde para malhas pode ser encontrada no livro Graphics
Gems II.
Figura 6: Uma estrutura de dados topológica representa a completa topologia de um objeto em estudo
(Gois & Piteri, 2002; Beall & Shephard, 1997; Piteri & Almeida, 1995; Piteri, 1999). Uma característica
fundamental associada a essas estruturas é que qualquer informação relativa à topologia pode ser obtida
em tempo constante ou proporcional ao número de entidades envolvidas, independentemente da dimensão
do problema, quer a malha possua 1 milhão de elementos triangulares ou 100 mil elementos, já que estas
informações são de natureza local. A estrutura de dados topológica Winged-Egde concentra a maior parte
de suas informações na entidade aresta (O’Rourke, 1998). Isto acontece em função do fato de que em
qualquer modelo poliedral manifold, uma aresta pertence a exatamente duas faces, ou seja, este número
é invariante (Baumgart, 1975). Da forma como foi concebida originariamente, esta estrutura não permite
representar diretamente uma face com mais de uma componente conexa, ou seja, buracos em seu interior
(Vince, 2000). Com a introdução da entidade ciclo (Braid et al., 1980), pode-se representar faces com mais
de uma componente conexa, e assim, a estrutura passa a ser referenciada como winged-edged modificada
(Fischer, 1991; Leondes, 2002).
6