Código Fuente para detectar vértices en dibujos bocetados
de formas poliédricas
Noviembre 2018
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, las uniones
de los dibujos bocetados de formas poliédricas son indicios que describen los
vértices de figuras poliédricas. En concreto, el algoritmo para detectar vértices que consideramos aquí
(JUNC) está encaminado a fusionar los extremos de todas las aristas que
comparten nodos o 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)
Se adjunta una implementación en C++ del código
del nuevo algoritmo JUNC.
Usted puede descargar el
código de JUNC desde aquí.
Aunque muchos de los indicios están
relacionados mutuamente, nosotros intentamos detectar cada indicio usando
información mínima. El boceto de entrada comprende sólo trazos discretos,
secuencias de puntos adquiridos entre los movimientos de bajada y subida de un
lápiz. Para que JUNC funcione, los extremos de cada línea de segmento deben ser
previamente filtrados aplicando algún método de detección de esquinas. Algunos
de estos métodos conocidos son:
·
IStraw
(implementado por Xiong Y., LaViola J.:
A shortstraw-based algorithm for corner finding in
sketch-based interfaces. Computers and Graphics 34(5) (2010), 513–27);
·
Shortstraw (Wolin A., Eoff B., Hammond T.: Shortstraw: a simple and effective corner finder for
polylines. SBIM 2008 (2008), 33–40);
·
Sliding strips (propuesto
por Masood A., Sarfraz
M.: Corner detection by sliding rectangles along planar curves. Computers
and Graphics 31 (2007), 440–48).
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 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-ésimo vértice
o VertexY[i]= coordenada Y del i-ésimo vértice
·
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> EdgeHead) y el conjunto de todas las colas de aristas se
guarda en otro vector estándar (std::vector <long> EdgeTail):
o EdgeCount= número de aristas del dibujo
lineal
o EdgeHead[i]= Vértice de cabeza que
define a la i-ésima arista
o
EdgeTail[i]=
Vértice de cola que define a la i-ésima arista
El lector debe notar que los ejemplos adjuntos
(correspondientes a los ejemplos del informe técnico) han sido filtrados
previamente con el método IStraw para encontrar las
esquinas de los trazos que definen los extremos de cada línea de segmento.
La salida del algoritmo es una lista de
vértices, que describen uniones en el modelo 3D, y una lista de aristas:
·
Para cada vértice, el algoritmo devuelve sus coordenadas y la figura de mérito que estima la probabilidad de que un vértice sea percibido
como una union por los seres
humanos.
·
La lista de aristas con sus extremos actualizados
de acuerdo a los nuevos vertices.
El método está encapsulado dentro de una clase
principal CCuePerimeter.
Otros dos ficheros contienen clases y operaciones auxiliares requeridas para el
funcionamiento del método:
·
Tools_Geometry.cpp, y su correspondiente cabecera Tools_Geometry.h.
·
Tools_Vector.cpp, y su correspondiente cabecera Tools_Vector.h.
Este método para detectar vértices se describe
extensamente en:
Company P., Varley P.A.C., Plumed R. and Camba J.D. (2018).
Detection of vertices in sketched drawings of polyhedral shapes.
CIARP: 23rd Iberoamerican Congress on Pattern Recognition (2018).
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.
Finalmente, queremos remarcar que el código fue
escrito para hacerlo legible. La eficiencia nunca fue un objetivo.
*************************************************************************************
El código JUNC 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., Plumed R. and Camba J.D. (2018).
Detection of vertices in sketched drawings of polyhedral shapes.
CIARP: 23rd Iberoamerican Congress on Pattern Recognition (2018).
*************************************************************************************