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).
*************************************************************************************