Código Fuente para encontrar perímetros en dibujos bocetados de formas polihédricas

Septiembre 2017

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 perímetros de los dibujos bocetados de formas poliédricas son indicios. En concreto, el algoritmo para encontrar perímetros que consideramos aquí (PER) está encaminado a encontrar circuitos de líneas y uniones (incluyendo intersecciones y uniones en T) del dibujo líneas original que pertenecen al contorno de las formas poliédricas representadas mediante modelos de alambres de objetos poliédricos.

Se adjunta una implementación en C++ del código del nuevo algoritmo PER.

Usted puede descargar el código de PER desde aquí.

Aunque muchos de los indicios están relacionados mutuamente, nosotros intentamos detectar cada indicio usando información mínima. Para que PER funcione, el boceto de entrada debe haber sido previamente vectorizado, para convertir los trazos del boceto en líneas del dibujo lineal. Por tanto, la entrada para el código es un dibujo 2D, que incluye una lista de vértices, y aristas en el siguiente formato:

·        Las coordenadas de cada vértice se guardan en una instancia de la clase POINT2D. El conjunto de todos los vertices se guarda en un vector estándar (std::vector <POINT2D>Vertex)

o   VertexCount= número de vertices 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

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 ordenadas de líneas y esquinas que pertenecen al perímetro:

·        Las aristas que pertenecen al perímetro están ordenadas en secuencia en PerimeterLines.

·        Las esquinas (uniones, intersecciones o uniones en T) que pertenecen al perímetro están ordenadas en secuencia en PerimeterCorners. Los números positivos en la lista de esquinas se refieren a uniones (vértices) del dibujo lineal original, mientras que los números negativos son punteros a una lista de intersecciones y uniones en T que pertenecen al perímetro. Note que la distinción entre intersecciones y uniones en T es simple: las intersecciones devienen en uniones si están suficientemente cerca de alguno de los vértices de la arista saliente.

·        Las coordenadas de las intersecciones y uniones en T que pertenecen al perímetro se salvan (lista TX), tanto como las líneas que producen cada intersección (lista TEdges).

El método está encapsulado dentro de una clase principal CCuePerimeter, que comparte fichero con algunas clases auxiliares.

Este método para encontrar perímetros se describe extensamente en:

Company P., Varley P.A.C., and Plumed R. (2017).
Perimeter detection in sketched drawings of polyhedral shapes.
STAG: Smart Tools and Applications in Graphics (2017).
A. Giachetti, P. Pingi and F. Stanco (Editors).

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 PER es software libre. Pero si usted lo encuentra útil para su propia investigación, por favor cite nuestro artículo:

Company P., Varley P.A.C., and Plumed R. (2017).
Perimeter detection in sketched drawings of polyhedral shapes.
STAG: Smart Tools and Applications in Graphics (2017).
A. Giachetti, P. Pingi and F. Stanco (Editors).

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