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.

*************************************************************************************