Source code for Detecting Vertices in sketched drawings of polyhedral shapes

November 2018

We are interested in creating computer-based tools to help design engineers during the first stage of the design process, known as conceptual design. Hence, we develop Sketch-Based Modelling (SBM) systems. Our approach for SBM relies on finding cues or regularities, which are those sketch properties which reveal properties of the three-dimensional object depicted in the sketch. In this context, junctions of sketched drawings are cues which depict vertices of polyhedral shapes. In particular, the detecting-vertices algorithm we consider here (JUNC) is aimed to merge the endpoints of all the edges that share nodes or vertices of the polyhedral shape (merging into a single vertex all endpoints that should be perceived by humans as a common junction).

Attached is a C++ implementation of the code of the new JUNC algorithm.

You can download the JUNC code from here.

Although most of the cues are mutually related, we intend to detect every cue using minimal information. The input sketch comprise only discrete strokes, sequences of points obtained between a pen down and a pen up. For JUNC to work, tips or endpoints of each segment line need to be previously filtered by applying some corner detection approach. Some of these known approaches are:

        IStraw (implemented by Xiong Y., LaViola J.: A shortstraw-based algorithm for corner finding in sketch-based interfaces. Computers and Graphics 34(5) (2010), 51327);

        Shortstraw (Wolin A., Eoff B., Hammond T.: Shortstraw: a simple and effective corner finder for polylines. SBIM 2008 (2008), 3340);

        Sliding strips (proposed by Masood A., Sarfraz M.: Corner detection by sliding rectangles along planar curves. Computers and Graphics 31 (2007), 44048).

Hence, the input to the code is a 2D drawing, which includes a list of tips of line segments and edges in the following format:

        Coordinates of every vertex are stored in an instance of the POINT2D class. The set of all vertices is stored in a standard vector (std::vector <POINT2D>Vertex)

o   VertexCount= number of vertices in the drawing

o   Vertex[i].x= X coordinate of the i-th vertex

o   Vertex[i].y= Y coordinate of the i-th vertex

        Edges are defined by means of their head and tail vertices, which correspond with the endpoints of each stroke. The set of all edge heads is stored in a standard vector (std::vector <long> EdgeHead) and the set of all edge tails is stored in another standard vector (std::vector <long> EdgeTail):

o   EdgeCount= number of edges in the line drawing

o   EdgeHead[i]= Head junction defining the i-th edge

o   EdgeTail[i]= Tail junction defining the i-th edge

Reader must note that examples attached (corresponding to the examples of the technical report) have been previously filtered by the IStraw approach, to find the corners of the strokes which define the endpoints of each segment line.

The output of the algorithm is a list of vertices, which depict junctions in the 3D model, and a list of edges:

        For each vertex, the algorithm returns its coordinates and the figure of merit that estimates how likely a vertex is to be perceived as a junction by human beings.

        The list of edges with their endpoints updated according to the new vertices.

The approach is encapsulated into a main class CueJunctions. Two more files containing auxiliary classes and operations are required for the approach to work:

       Tools_Geometry.cpp, and its corresponding header Tools_Geometry.h.

       Tools_Vector.cpp, and its corresponding header Tools_Vector.h.

This approach for detecting junctions is extensively described in:

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

To help understanding how the code works, and in order to offer a test environment too, the following main file is also provided:

        Main.cpp.

Finally, we must highlight that the code was written to make it readable. Efficiency never was a goal.

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

The JUNC code is free software. But if you find it useful for your own research,
please cite our paper:

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

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