Código
Fuente para encontrar planos de simetría bilateral
Mayo 2016
Estamos interesados en crear herramientas basadas en
computador para ayudar a los ingenieros de diseño durante la primera etapa del
proceso de diseño, conocida como diseño conceptual. Por tanto, desarrollamos
sistemas de modelado basado en bocetos (SBM por sus siglas en inglés). Nuestra
aproximación al SBM se basa en encontrar indicios o regularidades, que son
aquellas propiedades del boceto que revelan propiedades del objeto
tridimensional representado en el boceto. En este contexto, los planos de
simetría son indicios. En concreto, el algoritmo para encontrar planos de simetría que consideramos aquí (SYM) está
encaminado a encontrar circuitos de líneas que representan contornos de planos
de simetría de las formas poligonales representadas mediante modelos de
alambres de objetos poliédricos.
Se adjunta una implementación en C++ del código del nuevo
algoritmo SYM.
Usted
puede descargar el código de SYM desde aquí.
Aunque muchos de los indicios están relacionados
mutuamente, nosotros intentamos detectar cada indicio usando información
mínima. Para que SYM funcione, el boceto de entrada debe haber sido previamente
vectorizado, para convertir los trazos del boceto en
líneas del dibujo lineal. Además, las caras deben haber sido detectadas. Por
tanto, la entrada para el código es un dibujo 2D, que incluye una lista de
vértices, ejes y caras en el siguiente formato:
·
Las coordenadas de cada vértice se guardan en
una instancia de la clase POINT2D. El conjunto de todos los vértices se guarda
en un vector estándar (std::vector <POINT2D>Vertex)
o
VertexCount=
número de vértices del dibujo lineal
o
VertexX[i]=
coordenada X del i-esimo vértice
o
VertexY[i]=
coordenada Y del i-esimo vértic
·
Las aristas se definen mediante sus vértices de
cabeza y cola. El conjunto de todas las cabezas de aristas se guarda en un
vector estándar (std::vector <long>
EdgeU) y el conjunto de todas las colas de aristas se
guarda en otro vector estándar (std::vector <long> EdgeV):
o
EdgeCount=
número de aristas del dibujo lineal
o
EdgeU[i]=
Vértice de cabeza que define a la i-esima arista
o
EdgeVl[i]=
Vértice de cola que define a la i-esima arista
·
Las caras se definen mediante una secuencia
cerrada de aristas. La información se guarda en instancias de la clase FACE (std::vector <FACE> Face),
donde cada instancia FACE incluye:
o
int C=
número de aristas/vértices que definen la cara
o
std::vector
<int> E= lista de aristas que definen la cara
o
std::vector
<int> V= lista de vértices que definen la cara
El lector debe notar que la vectorización
del boceto requerida para que funcione éste método incluye la fusión previa de
los extremos de todas las aristas que comparten vértices de la forma poliédrica
(fusionando en un único vértice todos los extremos de aristas que son
percibidos por los seres humanos como una esquina o unión común).
La salida es la lista de planos de simetría, juntamente con
sus méritos:
·
Los planos de simetría se guardan en vectores
anidados. Así, SymPlanes[i][j][k] contiene la esquina
k-esima del j-esimo plano
de simetría del i-esimo sub-grafo. La información de
los planos de simetría se almacena a través de las esquina de los lados del
circuito. Las esquinas pueden ser vértices o puntos medios. Los vértices se
almacenan mediante su número, mientras que los puntos medios se almacenan
mediante el número de la aristas a la que pertenecen conmutado a negativo y decrementado en una unidad (por ejemplo, el punto medio de
la arista 3 se guarda como -4).
·
Los méritos de los planos de simetría se guardan
como vectores anidados. Así, SymMerits[i][j] contiene
el mérito del j-esimo plano de simetría del i-esimo subgrafo.
El método está encapsulado dentro de una clase principal
CCueSymmetry, que comparte fichero con
algunas clases auxiliares.
Este método para encontrar planos de simetría se describe
extensamente en:
Plumed R., Company P., y Varley P.A.C. (2010). Detecting
mirror symmetry in single-view wireframe sketches of polyhedral shapes.
Computers & Graphics, Vol. 59. pp. 1-12, 2016.
Para ayudar a entender cómo funciona el código, y para
ofrecer un entorno de prueba, se suministra también el siguiente fichero:
·
Main.cpp, y su fichero de encabezamiento Main.h.
Finalmente, queremos remarcar que el código fue escrito
para hacerlo legible. La eficiencia nunca fue un objetivo.
*************************************************************************************
El código SYM es software libre. Pero si usted lo encuentra
útil para su propia investigación, por favor cite nuestro artículo:
Plumed R., Company P. and Varley P.A.C. (2016).
Detecting mirror symmetry in single-view wireframe sketches of polyhedral
shapes.
Computers & Graphics, Vol. 59. pp. 1-12, 2016.
*************************************************************************************