Código Fuente para encontrar caras (Finding Faces)
Abril 2010
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 caras son indicios. En concreto, el algoritmo para encontrar-caras que
consideramos aquí (FF) está encaminado a encontrar circuitos de líneas que representan
caras
de la forma poligonal representada en representaciones mediante modelos de
alambres de
objetos poliédricos.
Se adjunta una implementación en C++ del código del nuevo
algoritmo FF.
Usted puede descargar el código de FF desde aquí.
Aunque muchos de los indicios están relacionados
mutuamente, nosotros intentamos detectar
cada indicio usando información mínima. Para que FF 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 ejes
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 un conjunto de listas de líneas del dibujo,
cada una listando las líneas que pertenecen
a una cara particular de la forma representada en el dibujo. El conjunto de
listas de vertices que
pertenecen a cada cara se devuelve también.
·
La información se guarda en un vector de
instancias de la clase FACE,
(std::vector <FACE> Face),
donde cada instancia FACE incluye:
int C= úmero
de aristas/vertices que definen la cara
std::vector <int> E= Lista
de aristas que defien la cara
std::vector <int> V= Lista
de vertices que definen la cara
El método está encapsulado dentro de una clase principal
CFacesVarley, que comparte fichero
con algunas clases auxiliares (CueFacesVarley.cpp). Se incluyen, además, otros
tres ficheros
auxiliares (CueFacesV.Geometry.cpp, CueFacesV_Nuts.cpp and
CueFacesV_Ortholin.cpp).
Este método para encontrar caras se describe extensamente
en:
Varley P.A.C. and Company P. (2010).
A new algorithm for finding faces in wireframes.
Computer-Aided Design, 42(4), pages 279-309.
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 FF es software libre. Pero si usted lo encuentra
útil para su propia investigación,
por favor cite nuestro artículo:
Varley P.A.C. and Company P. (2010).
A new algorithm for finding faces in wireframes.
Computer-Aided Design, 42(4), pages 279-309.
*******************************************************************************************************************