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

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