Professional Documents
Culture Documents
"
#
%
&
!"
NDICE
1 INTRODUCCIN.....................................................................................................................................9
1.1 Presentacin de la problemtica ........................................................................................................9
1.2 Objetivo: CAD Mecnico ..................................................................................................................9
1.3 Trabajo previo y temporalizacin del proyecto ...............................................................................10
1.4 Metodologa utilizada: UML ...........................................................................................................13
1.4.1 Introduccin al UML ...............................................................................................................13
1.4.2 Porqu utilizar UML?.............................................................................................................15
1.5 Estructura del documento ................................................................................................................15
2 PIEZAS Y CONECTORES LEGO .........................................................................................................19
2.1 Piezas Lego......................................................................................................................................19
2.1.1 Qu son?.................................................................................................................................19
2.1.2 Grandes grupos de piezas Lego ...............................................................................................19
2.2 Conectores Lego ..............................................................................................................................20
2.2.1 Qu son?.................................................................................................................................20
2.2.2 Clasificacin de conectores Lego.............................................................................................20
3 LDRAW ..................................................................................................................................................29
3.1 Qu es?...........................................................................................................................................29
3.2 Historia ............................................................................................................................................29
3.3 Formato de los ficheros del paquete LDraw ....................................................................................32
3.4 CADs que utilizan el paquete Ldraw ...............................................................................................40
3.4.1 MLCAD ...................................................................................................................................40
3.4.2 LeoCAD...................................................................................................................................42
3.4.3 Limitaciones de los CADs .......................................................................................................44
3.4.4 Eleccin del LeoCAD ..............................................................................................................44
4 ARQUITECTURA DEL LEOCAD ........................................................................................................49
4.1 Diagrama de clases ..........................................................................................................................49
4.2 Libreras utilizadas...........................................................................................................................57
4.2.1 Librera 3dsftk..........................................................................................................................57
4.2.2 Librera jpeglib.........................................................................................................................58
4.2.3 Librera libpng .........................................................................................................................58
4.2.4 Librera zlib..............................................................................................................................58
5 DISEO ..................................................................................................................................................61
5.1 Conceptos previos............................................................................................................................61
5.1.1 Definiciones tiles ...................................................................................................................61
5.1.2 Sistemas de referencia del conector, de la pieza y del mundo .................................................62
5.1.3 Sistema de referencia de los conectores...................................................................................64
5.1.4 Hermandad entre conectores ....................................................................................................65
5.2 Diagrama de clases ..........................................................................................................................66
5.2.1 Clase pieza ...............................................................................................................................66
5.2.2 Jerarqua de clases del conector ...............................................................................................68
5.2.3 Clase Simbolo ..........................................................................................................................73
5.3 Assembling ......................................................................................................................................75
5.3.1 Qu es? ...................................................................................................................................75
5.3.2 Pasos para realizar el assembling.............................................................................................75
5.3.3 Seleccin de conectores a ensamblar .......................................................................................75
5.3.4 Verificacin de compatibilidad entre conectores .....................................................................76
5.3.5 Evitar lazos y cadenas ..............................................................................................................78
5.3.6 Realizacin del assembling......................................................................................................82
5.3.7 Propagacin del assembling.....................................................................................................94
5.4 Transformaciones a realizar sobre piezas ensambladas ................................................................. 106
5.5 Comunicacin de transformaciones sobre piezas ensambladas ..................................................... 107
5.5.1 Comunicacin de la rotacin.................................................................................................. 107
' () "
*'
UdG
INTRODUCCIN
1.1
Presentacin de la problemtica
1.2
El objetivo del presente proyecto es el de disear una herramienta de CAD mecnico que modele
interacciones especficas entre objetos de un modelo. Estas interacciones permitirn unir partes de un
modelo en construccin con mayor eficiencia que utilizando simples restricciones, debido a que cada
interaccin se representar mediante primitivas que equivalen a un nmero de restricciones elementales
del tipo de las utilizadas tradicionalmente en los CADs mecnicos.
Para poder llevar a cabo este objetivo se ha eligido el sistema de ladrillos
, debido principalmente
a tres motivos:
1
UdG
Captulo 1. Introduccin
Las piezas Lego ofrecen toda la riqueza, en trminos de interacciones, de un motor real y a solo
una fraccin del coste de ste.
1.3
El trabajo previo para llevar a cabo el desarrollo del CAD Mecnico para piezas Lego se puede dividir en
seis fases:
1
Conocimiento de las piezas y conectores Lego. Este estudio se bas en la identificacin de los
conectores (ver Captulo 2. Piezas y conectores Lego) ms usuales que se pueden encontrar
dentro de las piezas que forman el catlogo de Lego. Todo este estudio permiti definir los
posibles conectores y comprobar empricamente la forma cmo diferentes piezas Lego se
conectan entre si.
Estudio del paquete LDraw. Conocer los elementos que forman el paquete LDraw [1], as
como el peculiar formato de los ficheros que lo componen, fue vital para obtener toda la
informacin referente a una determinada pieza y a los conectores de la misma (ver Captulo 2.
Piezas y conectores Lego). Su comprensin ha sido fundamental, debido a que es la base de los
CADs de piezas Lego (ver Captulo 3. LDraw apartado 3.4 CADs que utilizan el paquete
LDraw).
Estudio de los CADs para piezas Lego. Esta parte del trabajo previo del proyecto se bas en el
conocimiento de los dos CADs de piezas Lego que actualmente existen: el LeoCAD [2] y el
MLCAD [3] (ver Captulo 3. LDraw apartado 3.4 CADs que utilizan el paquete LDraw). Con el
anlisis de ambos se pudo determinar sus pros y contras y posteriormente elegir el CAD ms
adecuado para poder llevar a cabo la implementacin del assembling o interaccin (ver Captulo
5. Diseo apartado 5.3 Assembling) entre las piezas Lego.
UML. Este trabajo previo se bas en la ampliacin de los conocimientos adquiridos sobre diseo
[5] y programacin orientada a objetos (OOP) [10] en las asignaturas de Enginyeria del
Software: Disseny y Llenguatges de Programaci de la titulacin.
Conocimiento de la herramienta de desarrollo Visual C++ 6.0. Una vez decidido el CAD que
se va a utilizar para desarrollar el assembling o interaccin entre piezas Lego, es muy importante
conocer las peculiaridades de la herramienta con la que ha sido desarrollado para poder
modificar e introducir el cdigo que sea necesario. Por eso, hubo una etapa de adaptacin y
10
EPS
conocimiento a la aplicacin. Cabe comentar que, pese a que ya conoca tal lenguaje, nunca
haba realizado programacin orientada a objetos con l, con lo que hubo un perodo importante
de conocimiento de las caractersticas de dicho lenguaje. Con todo ello tuve la base necesaria
para implementar todo lo que se haba diseado con anterioridad utilizando la metodologa UML
[5].
6
Estudio de la arquitectura del LeoCAD. Probablemente, esta fase fue una de las ms
importantes, ya que en ella se tuvieron que conocer y comprender las estructuras de datos de la
aplicacin e identificar las partes donde se tendra que introducir una implementacin adicional.
ste estudio, conjuntamente con la fase de implementacin, ha sido una de las fases ms largas
del proyecto, puesto que no es trivial la comprensin global de una aplicacin tan compleja y
extensa como puede serlo un CAD, donde son necesarios conocimientos en diversos campos
(programacin orientada a objetos, lgebra, grficos por computador), y con la dificultad
aadida que supone entender un cdigo ajeno.
Estudio piezas y conectores Lego. Esta fase corresponde al estudio realizado en el trabajo
previo sobre los tipos, comportamiento y caractersticas de las diferentes piezas y conectores
Lego.
UdG
11
Captulo 1. Introduccin
Estudio del paquete LDraw. En esta etapa se pretendi conocer el paquete que abastece de
piezas Lego a los CADs que lo utilizan. Corresponde con la fase dos del estudio previo.
Estudio del LeoCAD y MLCAD. Etapa basada en el aprendizaje de los dos CADs para piezas
Lego disponibles y decisin de la utilizacin del LeoCAD para la implementacin de la
interaccin entre piezas. Esta etapa se corresponde con la fase tres del trabajo previo.
UML y Visual C++ 6.0. Esta etapa se corresponde con el trabajo previo descrito en las fases
cuatro y cinco para ampliar los conocimientos ya adquiridos durante la carrera sobre diseo e
implementacin orientado a objetos.
Diseo. Etapa de diseo de los diagramas de clases y diagramas de secuencia para documentar la
parte esttica aadida a la aplicacin y la comunicacin entre los elementos de esa parte esttica
(parte dinmica) mediante los diagramas de secuencia. Tambin se definieron las
funcionalidades bsicas a aadir as como los pasos a seguir para ello.
Pruevas. Fase de pruevas donde se comprobaron diveros casos para certificar la ausencia de
bugs en la aplicacin y por lo tanto su correcto funcionamiento. La principal prueva se bas en la
creacin de un modelo de piezas Lego completo.
12
EPS
1.4
UML es un lenguaje de propsito general que pueden usar todos los modeladores. No tiene
propietario y est basado en el comn acuerdo de gran parte de la comunidad informtica.
Ser tan simple como sea posible pero manteniendo la capacidad de modelar toda la gama de
sistemas que se necesita construir. UML necesita ser lo suficientemente expresivo para manejar
todos los conceptos que se originan en un sistema moderno, tales como la concurrencia y
distribucin, as como tambin los mecanismos de la ingeniera del software, como la
encapsulacin y componentes.
UdG
13
Captulo 1. Introduccin
REAS CONCEPTUALES
Los conceptos y modelos de UML pueden agruparse en las siguientes reas conceptuales:
Estructura esttica. Cualquier modelo preciso debe primero definir su universo, esto es, los
conceptos clave de la aplicacin, sus propiedades internas, y las relaciones entre cada una de
ellas. Este conjunto de construcciones es la estructura esttica. Los conceptos de la aplicacin
son modelados como clases, cada una de las cuales describe un conjunto de objetos que
almacenan informacin y se comunican par implementar un comportamiento. La informacin
que almacena es modelada como atributos. La estructura esttica se expresa con diagramas de
clases y puede usarse para generar la mayora de las declaraciones de estructuras de datos en un
programa.
Organizacin del modelo. La informacin del mdelo debe ser dividida en partes coherentes,
para que los equipos puedan trabajar en las diferentes partes de forma concurrente. El
conocimiento humano requiere que se organice el contenido del modelo en paquetes de tamao
modesto. Los paquetes son unidades organizativas, jerrquicas y de propsito general de los
modelos de UML. Pueden usarse para almacenamiento, control de acceso, gestin de la
configuracin y construccin de bibliotecas que contengan fragmentos de cdigo reutilizable.
Mecanismos de extensin. UML tiene una limitada capacidad de extensin pero que es
suficiente para la mayora de las extensiones que requiere el da a da sin la necesidad de un
cambio en el lenguaje bsico. Un estereotipo es una nueva clase de elemento de modelado con la
misma estructura que un elemento existente pero con restricciones adicionales.
14
EPS
1.5
Capulo 3. LDraw. Aqu se profundiza en todo lo referente al paquete LDraw [1] , desde su
historia hasta su peculiar sintaxis. Tambin se ofrece un resumen de los dos CADs que utilizan
tal paquete como mtodo de abastecimiento de piezas Lego, las limitaciones de ellos y los
motivos que han llevado a la eleccin de uno de los dos para la implementacin del assembling
(ver Captulo 5. Diseo apartado 5.3 Assembling) entre piezas.
Captulo 5. Diseo. Sin duda alguna, uno de los captulos ms extensos e importantes de toda la
documentacin. En l se darn a conocer todos los pormenores en lo que se refiere al diseo del
CAD mecnico para piezas Lego.
UdG
15
Captulo 1. Introduccin
Captulo 7. Resultados y conclusiones. El captulo siete pretende dar a conocer los resultados
obtenidos con la realizacin del CAD Mecnico para piezas Lego y las conclusiones derivados
de los mismos.
16
EPS
- )'
)
)(
18
EPS
En este captulo se pretende dar a conocer dos conceptos sencillos, a la vez que importantes, para el
proyecto que se ha desarrollado: el concepto de pieza Lego y el de conector Lego. La comprensin de
tales conceptos es ms que relevante ya que aparecern de forma constante en todo el documento.
2.1
Piezas Lego
2.1.1 Qu son?
Podramos definir una pieza Lego como cualquier elemento que forma parte del catlogo que ofrece el
paquete LDraw [1] (ver Captulo 3. LDraw) y por lo tanto utilice su sintaxis y las subpartes que ste
ofrece. As pues, una pieza siempre estar formada por un conjunto de subpartes (son nicamente
geometra a dibujar) y conectores (partes de las piezas que permitirn realizar el assembling o conexin
con el resto de piezas).
Tiles. En cuanto a los Tiles podramos decir que son como los plates, pero
con la diferencia que no poseen conectores en su parte superior.
Slope Bricks. Los Slope Bricks podramos definirlos como Bricks, pero
con diferencias en la geometra bsica.
UdG
19
Other Bricks. En los Other Bricks tendremos a los Bricks que por
diferencias geomtricas no se han incluido dentro de los anteriores tipos de
Bricks..
2.2
Conectores Lego
2.2.1 Qu son?
Un conector es la parte de la pieza que, por su naturaleza, permite la conexin (ver Capitulo 5. Diseo
apartado 5.3 Assembling) con otras piezas, siendo ste fundamental para el proyecto que se ha abordado,
ya que sin la existencia de l, el ensamblaje de piezas sera imposible. Hay que aclarar que el concepto de
conector ha sido creado para el presente proyecto y por lo tanto la clasificacin realizada de los mismos
es totalmente nueva.
Dentro de los conectores que poseen las piezas Lego, podemos encontrar dos grandes grupos si los
distinguimos segn al tipo de conector que pertenezcan:
20
EPS
Conectores puntuales. Un conector clasificado como puntual (ver Figura 2.1) es aqul que
se caracteriza por poder ser interpretado como un punto en el espacio y por permitir realizar
assembling (ver Capitulo 5. Diseo apartado 5.3 Assembling) con un solo conector al mismo
tiempo. Para el proyecto se han identificado dos de ellos:
STUD. Este conector es el ms abundante dentro de las piezas de tipo Plates, Bricks
Slope Bricks y Other Bricks, lo que no significa que no podemos encontrarlo dentro
de otro grupo de piezas. Tal y como se explicar en el captulo de diseo de la
memoria (ver Captulo 5. Diseo) ms extensamente, los conectores de tipo Stud
pueden ensamblar con conectores de tipo Stud Inlet y conectores de tipo Cylindrical
Hole, pero con solo uno de ellos al mismo tiempo.
Nombre
Stud
N conectados
Grupo de piezas
Ejemplo
STUD INLET. Este conector puede ensamblar nicamente con conectores de tipo
Stud y lo podemos encontrar bsica pero no exclusivamente en el mismo grupo de
piezas que los conectores de tipo Stud. El nmero de conectores que pueden
ensamblar, al mismo tiempo, con los conectores de tipo Stud Inlet son los mismos
que en el caso de los conectores Stud: uno.
Nombre
Stud Inlet
N conectados
Grupo de piezas
Ejemplo
UdG
21
Conectores de tipo segmento. Un conector definido dentro de este grupo es aqul que posee
un cuerpo de una cierta longitud interpretable como un segmento, que le permite ensamblar
con ms de un conector a la vez (ver Figura 2.2). Los conectores de tipo segmento poseen la
peculiaridad de que solo pueden ensamblar a travs de sus extremos. Tal y como se ver en
posteriores captulos (ver Captulo 5. Diseo), el nmero de conectores que se podrn
conectar a este tipo de ellos depender de la longitud de los propios conectores.
extremo
longitud
extremo
longitud
Vista perspectiva 3D
AXLE. Los conectores de tipo Axle se encuentran dentro del grupo de piezas
Technic y pueden ensamblar (ver Captulo 5.Diseo apartado 5.3 Assembling) con
los conectores de tipo Axle Hole y Cylindrical Hole. Tal como se ha dicho para todo
conector de tipo segmento, los conectores de tipo Axle pueden estar conectados con
ms de un conector al mismo tiempo.
Nombre
Axle
N conectados
Grupo de piezas
Technic
Ejemplo
22
EPS
Nombre
Axle Hole
N conectados
Grupo de piezas
Technic
Ejemplo
Cylindrical Hole
N conectados
Ejemplo
Los conectores de una pieza pueden clasificarse como conectores libres y conectores ocupados.
Tales definiciones variarn segn si hablamos de conectores puntuales o si lo hacemos de conectores
de tipo segmento.
A
Estado de conectores puntuales. Diremos que un conector puntual est libre cuando no se
encuentre conectado a ningn otro conector, por el contrario, diremos que esta tipologa de
conectores se encuentra en estado ocupado cuando se encuentre realizando assembling (ver
Captulo 5. Diseo apartado 5.3 Assembling) con otro conector. As pues, para los conectores
de tipo puntual, podramos decir que si un conector est libre ser lo mismo decir que no se
encuentra ocupado y viceversa (ver Figura 2.3).
Stud libre
Stud Inlet
ocupado
Stud Inlet libre
Stud
ocupado
UdG
23
libre
libre
No
ocupado
ocupado
CH = Cylindrical Hole
No
libre
No
libre
ocupado
ocupado
24
EPS
STUD
C1
C2
STUD
Figura 2.5. Dos conectores de tipo Stud pero con una geometra diferente.
Cabe decir que hay ms tipos de conectores dentro de las piezas Lego, pero se ha escogido un
subconjunto de ellos para demostrar la implementacin del assembling dentro de una
herramienta de CAD para piezas Lego en un espacio de tiempo razonable.
UdG
25
26
EPS
( /
Captulo 3. LDraw
28
EPS
LDRAW
3.1
Qu es?
LDraw [1] no es ms que un paquete que ejerce de proveedor de piezas Lego (ver Captulo 2. Piezas y
conectores Lego) para las aplicaciones (editores, visualizadores...) que lo utilizan.
ste paquete est compuesto principalmente por cuatro elementos bsicos:
1
Un conjunto de librerias.
3.2
Historia
A continuacin se presenta, de forma esquematizada, la evolucin que ha sufrido todo lo relacionado con
el paquete LDraw y las aplicaciones (editores, visualizadores...) que hacen uso de l.
AO
1995
DESCRIPCIN
La comunidad Lego inicia un proyecto llamado Minifig World Tour. El tour incluye
un libro donde todos los participantes crean instrucciones de montaje para sus
modelos con el programa basado en LDraw de James. En este preciso instante
LDraw comienza a adquirir popularidad.
1996
(Mayo) Steve Bliss crea un Add-on para el paquete LDraw, una herramienta de
administracin para varias aplicaciones que utilizan LDraw.
UdG
29
Captulo 3. LDraw
AO
1996
DESCRIPCIN
(Junio) Leonardo Zide finaliza el LeoCAD [2], un editor para plataformas Windows
y Linux basado en LDraw.
1997
(Marzo) Paul Gyugyi crea LDrawVR, una aplicacin web que permite al usuario
transformar un modelo LDraw a VRML.
Jean-Pierre Paris crea LD2Vr, el cual transforma los ficheros LDraw para permitir
su posterior visualizacin mediante un plugin para VRML.
Lars Hassing finaliza el L3P, aplicacin que tambin convierte los ficheros LDraw a
ficheros POV-Ray, con extensin POV. La principal diferencia entre el L3P y el L2P
es que el primero no requiere tener el conjunto del librerias LGEO. Los usuarios no
estn limitados a que partes estn en las libreras LGEO, ya que el L3P genera las
partes de las piezas en POV-Ray como parte del proceso de conversin.
1998
(Agosto) Paul Gyugyi crea LDLite, un programa para sistemas operativos Windows
de renders de ficheros DAT (extensin de los ficheros del paquete LDraw) basado en
el LDrawVR.
30
EPS
AO
1998
DESCRIPCIN
(Septiembre) Bram Lambrecht crea dos tutoriales. Uno basado en LDraw y otro en
LEdit1.
Los MPD (Multi-Part DAT) se introducen permitiendo a los usuarios tener multiples
ficheros DAT en uno de solo. Normalmente un usuario crea un modelo y utiliza
diversos subficheros, que actuan como unidades del modelo a crear, para despus
unir todos los ficheros en un MPD.
1999
Michael Lachmann crea el MLCAD [3], un editor para sistemas operativos Windows
de modelos LDraw. Rpidamente comienza a ganar popularidad dentro de la
comunidad Lego.
2000
(Junio) Tim Courtney y Bram Lambrecht realizan una presentacin sobre LDraw en
el BrickFest 2000, en Arlington, Virginia (USA).
(Julio) Tim con la ayuda de Bram Lambrecht, Terry Keller y Mike Poindexter
presenta LDraw en el LEGO Maniac KidVention, un evento del club Lego que tuvo
lugar en Legoland (parque de atracciones de Lego), California. La presentacin se
bas en los modelos fsicos de Lego y en escenas renderizadas de los mismos.
Travis Cobbs crea el LDView, otro visualizador para LDraw en sistemas operativos
Windows. El LDView tiene la caracterstica de poseer renderizado 3D en tiempo real
gracias al uso de OpenGL.
El LEdit es un editor de piezas Lego que se caracteriza por utilizar el paquete LDraw y por haber sido
creado para sistemas operativos MS-DOS.
UdG
31
Captulo 3. LDraw
AO
2001
DESCRIPCIN
(Julio) Don y Robyn Jessiman, los padres de James Jessiman, viajan desde Australia
para conocer a muchos de los organizadores de LDraw en el BrickFest 2001. Dentro
de los organizadores se encuentran Steve Bliss, Tim Courtney, Bram Lambrecht y
Erik Olson. Cabe decir que se realiz una presentacin sobre la historia y los
conceptos bsicos de lo que el paquete LDraw era y Steve se convierte en el primer
ganador del premio anual James Jessiman Memorial Award.
(Octubre) Jaco Van Der Molen realiza una demostracin de LDraw en el LegoWorld
2001, un evento para fans de Lego en Zwolle, Holanda. Esta pequea feria tuvo una
asistencia de pblico de 40.000 personas.
3.3
Los ficheros que albergan la informacin necesaria para definir un modelo LDraw (pieza o partes de
ellas) son de extensin DAT. Actualmente sta se ha visto modificada, adoptando por defecto la extensin
LDR (LDraw). El motivo que ha llevado a este cambio es que la extensin DAT es demasiado genrica,
lo cual puede llegar a producir errores en las asociaciones aplicacin-fichero que los usuarios tengan en
su ordenador (muchos programas utilizan la extensin DAT). As pues, en estos momentos la extensin
LDR es la extensin por defecto para las creaciones de los usuarios (conjunto de piezas). Las partes que
forman estos modelos (piezas o partes de ellas) continuan utilizando la extensin DAT.
Los ficheros del paquete LDraw [1] poseen la peculiaridad de que su nombre es el nmero de serie real
que la pieza tiene, lo cual permite una distincin unvoca de cada una de las piezas.
Un ejemplo de la relacin entre el nombre de un modelo LDraw y su nmero de referencia real sera la
siguiente pieza:
32
EPS
La pieza de la Figura 3.1, la cual es un Brick 2 x 3, est definida en el fichero 3002.dat. Esto nos viene a
decir que la pieza tiene como nmero de referencia el 3002.
Los ficheros que contienen la definicin de las piezas tienen una estrucutra un tanto peculiar. A
continuacin se muestra un fragmento del cdigo que se utiliza para definir la pieza de la Figura 3.1.
Tipo de lnea
0
0
0
0
Brick 2 x 3
Name: 3002.dat
Author: James Jessiman
Original LDraw Part - LDraw beta 0.27 Archive
1
1
1
16 20 4 0
16
0 4 0
16 -20 4 0
1 0 0 0 5 0 0 0 1
1 0 0 0 5 0 0 0 1
1 0 0 0 5 0 0 0 1
stud4.dat
stud4.dat
stud4.dat
Figura 3.2. Parte del cdigo de la pieza Lego Brick 2 x 3 con nmero de referencia 3002.
En la Figura 3.2 se puede observar parte del cdigo que permite definir a la pieza de la Figura 3.1. ste
formato se ha mantenido, principalmente, en memoria de James Jessiman, su creador all por el ao
1995.
Como se puede comprovar, el contenido de los ficheros del paquete LDraw es nica y exclusivamente
texto. Cada lnea de estos ficheros es un comando individual e independiente del resto de lneas. El
significado de cada una de ellas nos lo proporciona lo que en la Figura 3.2 se ha especificado como tipo
de lnea, es decir, el primer nmero de cada lnea. Los posibles valores de este parmetro van desde el
cero hasta el cinco (0..5) con los significados que en la siguiente tabla se descriven:
TIPO DE LNEA
0
1
2
3
4
5
SIGNIFICADO
Comentarios o meta-comandos
Referencia a una parte de la pieza
Lnea
Tringulo
Cuadriltero
Lnea condicional
UdG
33
Captulo 3. LDraw
El nmero que identifica el tipo de lnea va seguido de una palabra clave que identifica el metacomando correspondiente.
Los meta-comandos no son utilizados por los CADs (LeoCAD y MLCAD), sin que son
nicamente de utilidad para el visualizador que el propio paquete LDraw posee (ldraw.exe).
ttulo-modelo
donde
ttulo-parte
donde
Metacomando Paso
Marca el fin de los pasos de construccin de un modelo determinado.
Este comando provocar a LDraw (ldraw.exe) detenerse hasta que se presione <enter> y tambin
provocar que salve la imagen actual en un bitmap en el directorio ldraw\bitmap.
Formato de lnea:
0
34
CLEAR
EPS
Metacomando Escritura
Imprime un mensaje en la parte superior de la pantalla.
Formato de lnea:
0 WRITE texto-mensaje
0 PRINT texto-mensaje
donde
Metacomando Borrado
Este meta-comando limpia la pantalla.
Formato de lnea:
0
CLEAR
Metacomando Pausa
Provoca que LDraw se detenga en la visualizacin del modelo, hasta que se presione la tecla <enter>.
Formato de lnea:
0
PAUSE
Metacomando Salvar
Provoca que LDraw (ldraw.exe) salve la imagen que actualmente se est visualizando en un bitmap.
Formato de lnea:
0
UdG
SAVE
35
Captulo 3. LDraw
donde
color indica el color de la parte de la pieza. Los valores posibles para este parmetro son: 015, 16, 24, 32-47, 256-511. Los valores ms comunes son los que se encuentran
comprendidos entre el rango 0-15, por eso a continuacin se especifica el color asociado a
cada cdigo dentro de dicho rango.
0 = Negro
8 = Gris Oscuro
1 = Azul
9 = Azul Claro
2 = Verde
10 = Verde Claro
3 = Cian Oscuro
11 = Cian
4 = Rojo
12 = Rojo Claro
5 = Magenta
13 = Rosa
6 = Marrn
14 = Amarillo
7 = Gris
15 = Blanco
36
EPS
2 - Lnea.
Dibuja una lnea entre dos puntos.
Formato de lnea:
2 color x1 y1 z1 x2 y2 z2
donde
color indica el color de la lnea. Los posibles valores son: 0-15, 16, 24, 32-47, 256-511.
3 - Tringulo.
Dibuja un tringulo lleno dados tres puntos.
Formato de lnea:
3 color x1 y1 z1 x2 y2 z2 x3 y3 z3
donde
UdG
color indica el color del tringulo. Los posibles valores son: 0-15, 16, 24, 32-47, 256-511.
37
Captulo 3. LDraw
4 - Cuadriltero.
Dibuja un cuadriltero lleno a partir de cuatro puntos.
Formato de lnea:
4 color x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4
donde
color indica el color del tringulo. Los posibles valores son: 0-15, 16, 24, 32-47, 256-511.
5 - Lnea condicional.
Dibuja una lnea entre los dos primeros puntos si las projecciones de los dos ltimos en la pantalla se
encuantran en el mismo lado, de una lnea imaginria, a travs de las projecciones de los dos primeros
puntos en la pantalla.
Formato de lnea:
5 color x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4
donde
38
color indica el color del tringulo. Los posibles valores son: 0-15, 16, 24, 32-47, 256-511.
EPS
A continuacin se muestra un ejemplo de uso del comando lnea condicional. Supongamos el siguiente
prisma hexagonal, el cual viene a representar un conector de tipo Stud.
3
5
La lnea bajo el punto 1 no debera ser dibujada por que el punto 6 y el 2 estn en diferentes
lados.
La lnea bajo el punto 2 no debera ser dibujada por que el punto 1 y el 3 estn en diferentes
lados.
La lnea bajo el punto 3 debera ser dibujada por que el punto 2 y el 4 estn en el mismo lado.
La lnea bajo el punto 4 no debera ser dibujada por que el punto 3 y el 5 estn en diferentes
lados.
La lnea bajo el punto 5 no debera ser dibujada por que el punto 4 y el 6 estn en diferentes
lados.
La lnea bajo el punto 6 debera ser dibujada por que el punto 5 y el 1 estn en el mismo lado.
3
5
Figura 3.4. Prisma hexagonal una vez aplicado el comando lnea condicional.
UdG
39
Captulo 3. LDraw
3.4
Antes de la aparicin los dos CADs que ocupan las siguientes lneas, las personas que querian realizar
modelos basados en las piezas de Lego utlizaban los editores creados para los sistemas operativos MSDOS, principalmente LEdit, con las limitaciones que ello conllevaba en cuanto a interfaz se refiere.
Actualmente ya existen diversos CADs, que utilizan el paquete LDraw [1] como sistema de
abastecimiento de piezas Lego y que han sido desarrollados para los sistemas operativos Windows y/o
Linux. Dentro de stos, los ms conocidos son el MLCAD [3] y el LeoCAD [2].
3.4.1 MLCAD
En el ao 1999 Mike Lachmann cre el MLCAD [3], el cual usa la librera LDraw. El aspecto ms
importante de sta herramienta se encuentra en que la aplicacin est creada para entornos Windows, con
una diferencia abismal en lo que a interfaz respecta, en relacin a las aplicaciones para DOS.
El MLCAD, como cualquier aplicacin para Windows, presenta la caracterstica de permitir la utilizacin
del ratn. sta opcin es aprovechada por el editor para la traslacin,rotacin... de las piezas Lego. Tal
caracterstica, la ausencia de la cual resultara hoy en da impensable en cualquier programa, permite crear
un modelo de una forma drsticamente ms rpida en comparacin al antiguo sistema de teclas que
utilizaban los editores para piezas Lego de MS-DOS. An as, cabe decir, que el MLCAD no soporta el
movimiento de las piezas mediante teclas, lo cual es un handicap para los usuarios ms veteranos que
estaban familiarizados con tal tipo de interaccin con el editor de piezas Lego.
40
EPS
ms que proyectos creados con el MLCAD pero con la particularidad de que las partes que forman el
modelo no son piezas bsicas si no otros modelos creados con antelacin. sta opcin es realmente til,
ya que en el momento de crear una escena se pueden utilizar otros proyectos realizados anteriormente y
as no tener que volver a construirlos, es decir, esta opcin nos permite la reutilizacin de modelos ya
creados.
Las extensiones de ficheros que la aplicacin reconoce son de tres tipos:
PROS
Cdigo cerrado.
UdG
41
Captulo 3. LDraw
3.4.2 LeoCAD
Tal y como se comentaba antes para el MLCAD, el LeoCAD permite tambin trasladar y rotar las piezas
con la ayuda del mouse. En lo que se refiere al soporte de las teclas para tales efectos, el LeoCAD lo
implementa de forma parcial.
Una de las principales diferencias que encontramos entre el MLCAD y el LeoCAD es la ausencia de
MPDs en ste ltimo, lo cual provoca que no se puedan utilizar modelos creados con anterioridad para la
formacin de uno de nuevo.
Dentro de las novedades que aporta el LeoCAD podramos destacar tres realmente interesantes:
2 Animacin bsica via Keyframing: ste tipo de animacin sirve principalmente para indicar
los pasos a seguir en la creacin de un cierto modelo, lo cual es de gran ayuda para el resto de
usuarios que pretendan recrear un modelo ya existente. As pues, la informacin creada por el
propio CAD con este tipo de animacin se podr utilizar de forma anloga a las instrucciones de
construccin que se adjuntan con cualquiera de los modelos de Lego que se pueden comprar
actualmente.
42
EPS
PROS
Minifig Wizard.
Excelente posicionamiento
mediante el ratn.
de
piezas
UdG
43
Captulo 3. LDraw
La facilidad de uso disminuye, ya que para poder encajar dos piezas hay que rotar
constantemente la cmara para comprovar desde diferentes ngulos que la posicin de las
mismas es la correcta y no se producen superposiciones (ver Figura 3.9).
Lo importante del proyecto era modelar las interacciones entre las piezas y mejorar as la
ergonoma y facilidad de uso de una aplicacin ya existente y por lo tanto, no crear una de
nueva.
44
EPS
Cabe remarcar que en el proyecto se ha utilizado la versin para sistemas operativos Windows del
LeoCAD, principalmente porque la mayora de usuarios poco familiarizados con la informtica utilizan
tal aplicacin por su facilidad de uso, con lo cual, el proyecto podr ser disfrutado potencialmente por un
nmero de usuarios mucho mayor.
UdG
45
Captulo 3. LDraw
46
EPS
(1 "
"(
)
UdG
47
Captulo 3. LDraw
48
EPS
En este captulo se pretende dar a conocer las clases ms importantes utilizadas por el LeoCAD [2] y el
uso que ste realiza de ellas, as como la descripcin del conjunto de libreras externas que el CAD
utiliza. Cabe aclarar que las clases que se presentan en este captulo son las ms importantes pero no
forman ni tan solo la cuarta parte del conjunto de clases que posee el LeoCAD y que por motivos de
volmen de datos, los mtodos y atributos expuestos son nicamente los ms representativos de las
mismas.
4.1
Diagrama de clases
A continuacin se van apresentar las clases ms relevantes para comprender mnimamente como est
estructurado el LeoCAD.
UdG
49
A coninuracin se explica, classe por clase, sus principales utilidades dentro del LeoCAD.
CLASE PROJECT
Esta es la clase ms importante dentro del LeoCAD, tal y como se puede observar en el diagrama de
clases anterior. Es la clase en torno a la cual giran todas las dems. En esta clase se gestionan todas las
caractersticas principales que posee LeoCAD. Como se puede comprobar, la clase Project utiliza la gran
mayora de clases para la gestin de las caractersticas de las que dispone el CAD. Veamos pues, para que
necesita cada una del resto de clases presentes en el diagrama de la Figura 4.1:
50
EPS
Clase Piece. En la clase Project encontramos una lista dinmica simplemente enlazada para
poder gestionar todas las piezas de un modelo. Tal lista se mantiene de la sigiuente forma: la
clase Project sabe cal es la primera pieza del modelo y cada pieza sabe cul es la siguiente, as
hasta que haya una pieza que nos indique que es la ltima de la lista.
Clase PieceInfo. La clase Project necesita crear instancias de la clase PieceInfo para poder
inicializar la informacin de toda pieza instanciada para la creacin de un determinado modelo.
Clase Camera. La clase Camera es utilizada por la clase Project para gestionar los diferentes
puntos de vista que ofrece LeoCAD para la visualizacin de la escena. Para ello, al igual que las
piezas, posee una lista dinmica simplemente enlazada de las cmaras activas.
Clase Light. El LeoCAD permite la introduccin de luces en cualquier modelo. Para su gestin ,
el CAD posee una lista dinmica simplemente enlazada de luces.
Clase Group. La utilizacin de esta clase por parte de la clase Project se debe a la propiedad que
posee LeoCAD de permitir crear grupos de piezas para tratar a un conjunto de ellas como a una
de sola. La estructura de un grupo es una estructura jerrquica en forma de rbol (ver Figura
4.3). Con esto lo que se consigue es que si a un grupo se le aplica algn tipo de transformacin
(rotacin o traslacin), tales transformaciones se le apliquen a todos los elementos que
pertenecen a tal grupo, inclusive a subgrupos pertenecientes a los mismos.
G1
G2
G3
G4
G5
Figura 4.3. Esquema de la estructura de arbol de los grupos en el LeoCAD.
Clase File. Clase utilizada tanto para la lectura de los ficheros de texto DAT del paquete LDraw
[1] (ver Captulo 3. LDraw apartado 3.3 Formato de los ficheros del paquete LDraw) como para
la lectura de los ficheros binarios que utiliza el propio CAD. Hay que destacar que LeoCAD ya
posee una base de piezas Lego almacenadas en formato binario que utiliza por defecto, pero ello
no impide que tambin sea compatible con el paquete LDraw.
UdG
51
LC_UNDOINFO. Esta estructura la utiliza la clase Project para la gestin de la opcin de undo
y el redo de la aplicacin, es decir, para la recuperacin de estados anteriores o posteriores,
siempre que los haya, del estado en el que nos encontremos. El nmero de undos o redos que
gestiona el LeoCAD son treinta.
CLASE OBJECT
Esta clase es la base de toda pieza creada dentro del LeoCAD [2]. De esta clase abstracta derivan las
clases Piece, Light y Camera, las cuales implementan los mtodos que la clase base deja sin implementar
a parte de heredar un conjunto de mtodos y atributos comunes a todo objeto. El motivo de esta jerarqua
de clases es obvio: todo objeto puede ser seleccionado, trasladado, rotado, eliminado, posee una caja
englobante para la deteccin de su seleccin...Un conjunto de propiedades comunes que hacen necesaria
la definicin de una clase base comn a las tres dichas anteriormente.
52
EPS
CLASE CAMERA
Clase que deriva de la clase base Object y que es utilizada por el LeoCAD para la gestin de las cmaras
del LeoCAD. Los atributos ms importantes a destacar de la clase Camera son: la direccin de la cmara,
el estado (visible o no visible), la profundiad mxima y mnima a visualizar y el campo de visin de la
cmara.
En cuanto a los mtodos ms representativos de esta clase tenemos: implementacin de los mtodos
virtuales puros heredados para trasladar y seleccionar una cmara, redifinicin de los mtodos para
almacenar o leer la informacin referente a las cmaras en o de un fichero, mtodos que permiten realizar
diferentes acciones con las cmaras como zooms, rotaciones..., mtodo para renderizar todos los elmentos
dentro del campo de visin de la cmara y tambin posee otros conjuntos de mtodos para saber si la
cmara debe renderizarse o no.
UdG
53
54
EPS
En cuanto a los mtodos, tal y como se puede observar implementa los heredados que no lo estaban de la
clase Object (Move y Select), as como reimplementa los mtodos para gestionar la animacin via
keyframing y los mtodos para leero y escribir toda la infromacin referente a una pieza.
Tambin podemo encontrar mtodos para agrupar o desagrupar piezas en o de grupos, as como un
mtodo para inicializar la informacin de la pieza (PieceInfo). Por otro lado tambin existen mtodos ms
triviales como los que actualizan y nos informan del valor de los diferentes atributos de la pieza.
UdG
55
Los principales atributos de todo grupo son el nombre dado por el usuario, el centro del grupo de piezas
que lo forman, el prximo grupo de la lista que posee el modelo en construccin y el grupo al que
pertenece el propio grupo, si es que pertenece a otro.
Los mtodos de esta clase nos permiten agrupar y desagrupar as como guardar o leer la informacin
referente a un grupo.
CLASE FILE
La clase File es una clase abstracta que posee los mtodos y atributos comunes a todo fichero, tales como
la lectura y escritura de los mismos. Se utiliza principalmente para el parseo de los ficheros DAT del
paquete LDraw (ver Captulo 3. LDraw), los ficheros LDR (extensin de los ficheros creados con el
LeoCAD) y los binarios del propio LeoCAD.
Como se puede comprobar, la gran mayora de mtodos son virtuales puros [10] y son implementados por
las clases que derivan de File: FileDisk y FileMem. El motivo de ello es claro, ya que las acciones a
realizar para escribir en memoria secundaria (FileDisk) sern diferentes que las que haya seguir para
realizar la misma accin pero en memoria principal (FileMem).
CLASE FILEDISK
Clase que deriva de la clase base File y que se encarga de la lectura y escritura de un fichero en memoria
secundaria o, lo que es lo mismo, de la lectura de ficheros almacenados en el disco duro.
56
EPS
4.2
Libreras utilizadas
El LeoCAD a parte de utilizar sus propias libreras tambin realiza uso de otras para diferentes objetivos.
A continuacin se explica las librerias utilizadas y sus principales funcionalidades.
UdG
57
58
EPS
UdG
3)
59
60
EPS
DISEO
5.1
Conceptos previos
Antes de empezar a explicar exhaustivamente todo lo que se refiere al diseo llevado a cabo para
conseguir el objetivo principal del proyecto (ver Captulo 1. Introduccin apartado 1.2 Objetivo: CAD
Mecnico), es necesaria la introduccin de diversos conceptos que sern indispensables para comprender,
sin problemas, lo que en el captulo en el que nos encontramos se aborda.
Pieza dinmica. Es aquella sobre la que se aplican todas las transformaciones, modificando su
rotacin y posicin para que quede perfectamente ensamblada con la pieza esttica con la que
quiere conectar (ver Figura 5.1). Esta es la pieza que se desplaza y cambia de posicin.
Pieza esttica. Es aquella pieza que participa en el proceso de assembling pero sobre la que no
se aplica ningn tipo de transformacin, es decir, es la pieza que resta quieta o esttica en el
proceso (ver Figura 5.1).
Conector dinmico. Es aqul que pertenece a una pieza que asume el papel de dinmica en el
proceso de assembling (ver Figura 5.1).
Conector esttico. Es aqul conector que pertenece a una pieza considerada esttica en el
proceso de assembling (ver Figura 5.1).
Parte dinmica del modelo. Es aquella parte del modelo en construccin que posee a la pieza
dinmica que interviene en el proceso de assembling y a todas las conectadas a ella, tanto de
forma directa como indirecta (ver Figura 5.1). Es la nica parte del modelo que cambia su
configuracin geomtrica.
Parte esttica del modelo. Es aquella parte del modelo que no pertenece a la parte dinmica, es
decir, las piezas que forman el modelo a construir excluyendo las piezas que forman la parte
dinmica del mismo (ver Figura 5.1).
UdG
61
Captulo 5. Diseo
5
4
6
1
Pieza esttica
Conector dinmico
Pieza 3005
Pieza dinmica
Pieza 3004
Conector esttico
Pieza 3004
Figura 5.1. Ejemplo de pieza esttica, pieza dinmica, conector esttico, conector dinmico, parte
sttica del modelo y parte dinmica del modelo.
C2P1
C2P3
( 0, 0, 0)
C2P2
.. .
. .
P2W
C2P4
Brick 1 x 2
..
Centro pieza
Centro Conector j
Figura 5.2. Sistemas de referencia del conector, de la pieza y del mundo de un Brick 1 x 2.
62
EPS
As pues, para toda pieza i tenemos una matriz P2Wi (Piece To World) y para cada conector j de la pieza i
existe una matriz C2Pij (Connector To Piece).
Para saber las coordenadas de un determinado conector j en el mundo, solo har falta componer las
matrices de dicho conector y la de la pieza i a la que pertenece, de la siguiente forma (ver Figura 5.3):
C2Wij = P2Wi * C2Pij
Hay que dejar claro que el orden al componer las matrices es importante, ya que el producto de las
mismas no es conmutativo. Esquemticamente:
C2P
P2W
W
C2W
Figura 5.3. Esquema de los sistemas de referencia del conector, de la pieza y del mundo, as
como la transicin de uno al otro.
Con este proceso conseguimos que al aplicar transformaciones (traslaciones o rotaciones) a una
determinada pieza, nicamente sea necesaria la actualizacin de la matriz de transformacin P2Wi, con lo
que podemos saber en todo momento las coordenadas de cualquier conector respecto al mundo sin tener
que actualizar constantemente las matrices de todos los conectores de una determinada pieza.
UdG
63
Captulo 5. Diseo
Sistema de Referencia
Conector
Sistema de Referencia
Stud
Stud Inlet
Y
X
Axle
Cylindrical
Hole
Y
Axle Hole
Como se puede comprobar tanto los conectores de tipo Stud como los de tipo Axle tiene su eje Z hacia
fuera del cuerpo del propio conector. Por su parte el resto de conectores, es decir, el Stud Inlet, el Axle
Hole y el Cylindrical Hole, poseen dicho eje en direccin opuesta a los primeros, esta es, hacia el interior
de los propios conectores.
64
EPS
Pieza 3704
Figura 6.45.
Final2
Inicial2
ZAxle2
Hermanos
Axle2
ZAxle1
Axle1
Axle1
Axle2
Inicial1
Final1
Figura 5.4. Ejemplo de pieza que posee conectores con hermanos y su esquema pertinente.
Pieza 32013
Figura 6.45.
ZAxle1
Axle Hole
Axle
Inicial
Final
Figura 5.5. Ejemplo de pieza con un conector sin hermano y su esquema pertinente.
Diremos que dos conectores comparten el parentesco de hermandad si:
1
Son coaxiales.
Son consecutivos, es decir, el punto inicial o final de uno coincide con el punto inicial o final del
otro.
Dos conectores que mantengan una relacin de hermandad debern conocerse, es decir, saber de todos los
conectores de la pieza a la que pertenecen, cuales son. Para ello se ha provisto a todo conector de tipo
segmento que posea hermano de una referencia al conector con el que tiene establecida dicha relacin.
Tal y como se ver en sucesivos apartados, que un conector conozca a su hermano ser fundamental para
llevar a cabo comprobaciones en el proceso de assembling y propagacin del mismo (ver apartado 5.4
Assembling), as como en el proceso de traslacin y deslizamiento de las piezas que posean conectores
disponibles para ello (ver apartado 5.6.2 Comunicacin de la traslacin y 5.6.3 Comunicacin del
deslizamiento).
UdG
65
Captulo 5. Diseo
Cabe destacar que el principal motivo que ha llevado a la introduccin del concepto de hermandad entre
conectores ha sido principalmente el hecho de que es deseable permitir al usuario poder ensamblar
conectores de tipo segmento por ambos lados de los mismos y no obligar a conectar tal tipologa de
conectores siempre por el mismo extremo. Ahora bien, es cierto que se podra haber prescindido del
concepto de hermanos y gestionar internamente la seleccin de uno u otro extremo para llevar a cabo una
cierta conexin. Es precisamente para no tener que introducir una considerable cantidad de cdigo
simplemente para tales fines, que se ha optado por la introduccin del concepto de hermandad entre
conectores de tipo segmento.
5.2
Diagrama de clases
En este apartado se pretende dar a conocer la jerarqua de clases diseada para el proyecto. Pese a todo
hay que aclarar que no se van a exponer todos los mtodos ni atributos de las clases, nicamente se van a
dar a conocer los ms esenciales para comprender sin problemas el resto de apartados de este mismo
captulo, donde se aborda el diseo de todas las caractersticas que posee la aplicacin (para los detalles
ver el Captulo 6. Implementacin). Por este motivo se recomienda al lector referenciarse a esta jerarqua
y conjunto de clases en todo momento.
66
EPS
La principal labor de la clase pieza ser la de representar al objeto que posee los conectores, que son los
elementos que realmente permiten ensamblarlas.
Ha continuacin se va a porceder a explicar brebemente los atributos y mtodos de la clase Pieza. Para
ms informacin acerca de los mismos ver el Captulo 6. Implementacin.
PRINCIPALES ATRIBUTOS
Todos los atributos aadidos a la clase pieza son atributos privados, ya que es solo dicha clase la que debe
tener acceso a los mismos de forma directa.
P2W. Toda pieza posee una matriz de transformacin 3D en coordenadas de mundo. Tal matriz
conectoresLibres conectoresOcupados. Cada pieza posee una lista (ver Anexo 8. Lista
visitada. Flag que nos permitir modificar el estado de la pieza de no visitada a visitada en
transformar. Flag que nos informa de si a la pieza se le debe aplicar o no algn tipo de
transformacin.
UdG
transformacion. Matriz a aplicar a la pieza en caso de que el flag transformar est activado.
67
Captulo 5. Diseo
PRINCIPALES MTODOS
bool
assemblingConLazosCadenas(Conector
permite a la pieza detectar posibles lazos y cadenas entre los dos conectores a ensamblar (ver
apartado 5.4.5 Evitar lazos y cadenas).
propios conectores de la pieza esttica y los de la pieza introducida como parmetro, la dinmica
(ver apartado 5.4.7 Propagacin del assembling).
comunicarRotacion(Matriz
conectadas a ella, tanto de forma directa como indirecta, la rotacin a llevar a cabo (ver apartado
5.6.1 Comunicacin de la rotacin).
conectadas a ella, tanto de forma directa como indirecta, la traslacin a llevar a cabo (ver
apartado 5.6.2 Comunicacin de la traslacin).
traslacin, a la pieza y a las conectadas a ella, tanto directa como indirectamente (ver apartado
5.7 Aplicacin de transformaciones sobre piezas ensambladas).
desconectar(). Mtodo que nos permite desconectar a una pieza de todas sus ensambladas
68
EPS
conectores utilizados en el proyecto para demostrar la implementacin del proceso de assembling entre
piezas. El motivo de crear este ltimo nivel es obvio: algunas caractersticas y comportamientos frente a
una situacin son comunes entre conectores de un tipo u otro, pero hay casos, tal y como veremos ms
adelante, en el que dos conectores de la misma tipologa pueden comportarse de forma diferente.
Para la introduccin del concepto de conector dentro del proyecto, se ha creado una jerarqua de clases
siguiendo la distincin de los mismos segn la tipologa a la que pertenecen (ver Captulo 2. Piezas y
conectores Lego). As pues, nos encontramos que tenemos la clase base Conector, que es una clase
abstracta [10]. De ella derivan las clases Puntual y Segmento, que a su vez tambin son abstractas. En el
tercer y ltimo nivel de herencia tenemos a las clases Stud y Stud Inlet que derivan de la clase Puntual y a
las clases Axle, Axle Hole y Cylindrical Hole, que derivan de la clase Segmento. Estas clases no son
abstractas ya que son clases de las cuales podremos realizar una instancia (ver Figura 5.5).
UdG
69
Captulo 5. Diseo
70
EPS
CLASE CONECTOR
A continuacin se va a proceder a explicar de forma escueta el significado de los atributos y de los
mtodos ms relevantes de la clase Conector. Para ms informacin sobre los atributos y mtodos de esta
clase referenciarse al Captulo 7. Implementacin.
PRINCIAPLES ATRIBUTOS
id. Identificador del conector. Todo conector posee un identificador nico que nos
nombre. Nombre del tipo de conector. Los valores posibles son: stud, studInlet, axle,
axleHole y cylindricalHole.
genrica).
debe ser implementado en las clases derivadas. Cada tipo de conector decidir si puede
ensamblar con el conector pasado por parmetro, dependiendo de la compatibilidad
entre ambos para ensamblar (ver apartado 5.4.4 Verificacin de compatibilidad entre
conectores).
bool
conLazosCadenasConector(Conector
conectorFinal)
bool
UdG
71
Captulo 5. Diseo
virtual
assembling(Conector
ensambla al conector estico con el dinmico (ver apartado 5.1.1 Definiciones tiles y
apartado 5.4 Assembling). Ser cada tipologa de conector que definir los pasos
necesarios a seguir para ensamblar con el dinmico compatible.
los pasos necesarios para ensamblar un conector de tipo Stud con otro de tipo
Cylindrical Hole (ver apartado 5.4 Assembling y Captulo 8 Trabajos futuros y
agradecimientos).
virtual bool
conexionSecundaria(Conector
bool
con). Mtodo
conexionSecundariaStudCylindricalHole(Conector
que devuelve cierto en caso de que la conexin secundaria entre el Stud y el Cylindrical
Hole sea posible (ver apartado 5.4.7 Propagacin del assembling y Captulo 8 Trabajos
futuros y agradecimientos).
virtual
comunicarRotacion(Matrix
comunicarRotacionConector(Matrix
R).
R)
Mtodos
virtual
que
permiten
la
virtual
comunicarTraslacion(Vector
comunicarTraslacionConector(Vector
T).
Mtodos
T)
que
permiten
la
72
EPS
transformar()
tranformarConector().
Mtodos
que
habilitan
la
proceso de deslizamiento de una pieza que tenga conectores en disposicin de ello (ver
apartado 5.5.3 Comunicacin del deslizamiento).
UdG
73
Captulo 5. Diseo
El motivo de haber creado esta sencilla jerarqua de clases, en vez de introducir dichos mtodos en la
propia clase Conector, se debe a que con este diseo lo que conseguimos es independizar el dibujado de la
seleccin del conector, del propio conector, con lo que en un futuro si queremos aadir nuevos smbolos
para nuevos conectores bastar con aadir una nueva subclase que derive de Simbolo sin modificar en
absoluto la clase conector. De la misma manera, podremos crear nuevos conectores reutilizando los
dibujos ya existentes, sin la necesidad de crear una correspondencia uno a uno entre conectores y
smbolos.
Cruz
Circulo
Cuadrado
74
EPS
5.3
Assembling
5.3.1 Qu es?
El assembling se podra definir como el proceso por el cual dos objetos se conectan de la misma manera
que lo haran fsicamente en el mundo real. En el caso del proyecto realizado, los objetos que
interaccionan entre s son las piezas, que mediante sus conectores (ver Captulo 2. Piezas y conectores
Lego) ensamblan unas con otras.
UdG
75
Captulo 5. Diseo
Los motivos que han llevado a la utilizacin de la distancia al cuadrado en vez de la distancia
convencional han sido dos:
1
Debido a la asiduidad con la que se lleva a cabo la seleccin de conectores y al gran nmero
de conectores libres que puede llegar a tener una cierta pieza, este proceso debe ser lo ms
rpido posible. As pues, con el valor de la distancia mnima al cuadrado evitamos el clculo
de las races cuadradas.
Stud Inlet
Stud
Stud Inlet
Axle
Cylindrical Hole
2
1
1
Axle
Axle Hole
Cylindrical Hole
Axle Hole
3
2
Tabla 5.1. Compatibilidad entre conectores. Observar que la matriz es simtrica respecto a la diagonal.
A continuacin se muestran ejemplos de los assemblings posibles entre los conectores existentes (ver
Captulo 2. Piezas y conectores Lego).
76
EPS
Para llevar a cabo la verificacin de compatibilidad, cada conector posee un mtodo que le permite saber
si puede conectar con otro conector, o lo que es lo mismo, si es compatible la conexin entre ambos.
Conector
ste mtodo no posee implementacin ni en la clase abstracta Conector ni en las derivadas directamente
de ella (Puntual y Segmento), con lo que debe ser implementado por cada uno de los conectores, tanto los
de tipo segmento como los de tipo puntual, ya que cada uno de ellos sabr con que conector es compatible
para poder llevar a cabo un proceso de assembling.
Como ejemplo, un conector de tipo Stud implementara dicho mtodo de verificacin de la conexin con
otro de una forma muy similar a la siguiente:
UdG
77
Captulo 5. Diseo
Stud
Los conectores de tipo Stud al ser compatibles con los conectores de tipo Stud Inlet y con los de tipo
Cylindrical Hole, devolvera cierto en tales casos y falso en el resto.
No existen lazos en la pieza inicial Pi. Esto quiere decir que el conector inicial y el conector
final no son el mismo conector y por lo tanto no se intenta ensamblar el conector inicial con l
mismo o lo que es equivalente, que los dos conectores a ensamblar no pertenecen a la misma
pieza.
No existen cadenas entre la pieza inicial Pi y la pieza final Pf. La existencia de cadenas entre
la pieza inicial y la final implica que no se pueda llevar a cabo el assembling, ya que se intenta
ensamblar dos piezas que ya estn conectadas directa o indirectamente, tal y como puede verse
en el ejemplo de la Figura 5.10, donde las piezas A y D estn conectadas mediante la pieza B y
la C.
78
EPS
Conector inicial Ci
A2
A1
A3
Brick 1 x 1
B1
B
B2
D1
D3
GRAFO DE ASSEMBLING GA
A1,A2,A3,A4
Brick 1 x 2
A4
C1
C
C2
D2
D
A
B1,B2
C1,C2
Brick 1 x 1
D1,D2,D3,D4
Brick 1 x 2
D4
Conector final Cf
Pieza
Conexin entre piezas
Figura 5.11. Ejemplo de posible assembling con cadenas y de su grafo de assembling implcito GA.
El conector Ci (A1) no puede conectarse con Cf (D3) porque existe una cadena que nos permite
llegar de uno a otro pasando slo por conectores conectados.
Para llevar a cabo el proceso de deteccin de lazos y cadenas, solo har falta preguntarle a la pieza a la
que pertenece el conector inicial, involucrado en el proceso de conexin, si existe algn lazo o cadena
entre tal pieza y el conector final, es decir, si puedo llegar del conector inicial al final pasando por las
conexiones directas o indirectas entre las piezas Pi y Pf. Desde el cuerpo del CAD Mecnico para piezas
Lego tendramos:
...
if(not piezaInicial assemblingConLazosCadenas(conectorFinal)) return true;
else return false;
La pieza inicial llevar a cabo la deteccin de lazos y cadenas de la siguiente forma: Si no ha sido
visitada, le modificamos su estado para que en futuras llamadas a este mtodo de la misma pieza no
vuelva a realizar los clculos, con lo que evitamos que si una pieza est conectada a ms de otra, pueda
entrar en un bucle infinito donde las llamadas entre piezas conectadas que intentan encontrar lazos y
cadenas, no cesaran. A continuacin se pasa a comprobar si el conector final Cf existe como conector
libre en la pieza actual. Si es as, entonces si existir un lazo o cadena, ya que es posible llegar del
conector inicial Ci al conector final Cf. Por el contrario tendremos que buscar si desde los conectores
ocupados de la pieza actual existe una cadena hasta el conector final.
UdG
79
Captulo 5. Diseo
Pieza
Cabe aclarar que no se pretenden buscar todas las posibles cadenas entre Pi y Pf, sino que, tan solo con
encontrar una, ya podremos afirmar que el assembling no se puede llevar a cabo. Esto se puede ver
perfectamente en el ejemplo expuesto en la Figura 5.11, ya que hay dos cadenas de Pi=A a Pf =D:
(ABD ) y (ACD). As pues, si encontramos la cadena (ABD) no har falta seguir buscando la
cadena (ACD) y viceversa, ya que podremos asegurar que al menos existe una cadena de la pieza
inicial a la pieza final.
En lo que respecta a cada conector ocupado de la pieza, preguntar a cada uno de los conectores
conectados a l, si existe una lazo o cadena con el conector final.
Conector
80
EPS
Cada uno de los conectores conectados le preguntar a la pieza a la que pertenece si el conector final
existe como conector libre y por lo tanto si existe un lazo o cadena. De esta manera volveramos a repetir
el proceso descrito anteriormente para toda pieza hasta obtener la confirmacin o no de la existencia de
lazos y/o cadenas en la conexin a realizar.
Conector
Hay que destacar que despus de llevar a cabo la comunicacin expuesta entre piezas y conectores para la
deteccin de lazos y cadenas hay que volver a modificar el estado de las piezas participantes en dicho
proceso a no visitada, para as poder volver a aplicar dicha comprobacin posteriormente.
Para acabar de comprender el proceso de deteccin de lazos y cadenas, a continuacin se adjunta el
diagrama de secuencia que describira el ejemplo de la Figura 5.10.
UdG
81
Captulo 5. Diseo
Como se puede observar la pieza A recibe el mensaje para comprobar si existe un lazo o cadena entre el
conector inicial y el final. Esta modifica su estado a visitada y comprueba si el conector final existe en su
lista de conectores libres. Debido a que D3 no se encuentra en dicha lista, la pieza A le pregunta a sus
conectores ocupados si a travs de sus conectados se produce algn lazo o cadena. El primer conector de
la pieza A en recibir el mensaje es el conector A3. Este le pregunta al conector conectado a l, el B1, si
existe un lazo o cadena. El conector B1 propaga el mensaje hacindole la misma pregunta a la pieza a la
que pertenece. La pieza B vuelve a realizar el mismo proceso que inici la pieza A. La pieza B modifica
su estado a visitada y comprueba si existe el conector final dentro de sus conectores libres. Como D3 no
se encuentra como conector libre de B, sta le pregunta al conector ocupado B1 por la existencia de lazos
y cadenas. El conector B1 propaga el mensaje hacia A3, que es el conector conectado a l. ste ltimo
realiza la misma pregunta, pero a la pieza a la que pertenece. La pieza A no realizar ninguna operacin
debido a que ya ha estado visitada y por lo tanto de momento no se habr encontrado ningn lazo ni
cadena.
A continuacin la pieza B pregunta por la existencia de lazos y cadenas al conector B2, su otro conector
ocupado. ste se lo pregunta al conector conectado a l, el D1, y el conector D1 propaga el mensaje a la
pieza D. La pieza D modifica su estado a visitada, debido a que no lo ha sido anteriormente y comprueba
la existencia de D3 como conector libre suyo. El conector D3 se encuentra en la lista de conectores libres
de D y entonces el proceso finaliza, ya que hemos encontrado un lazo independientemente de los otros
posibles que puedan existir.
82
Conexin
Actualizacin
EPS
Tal y como se puede comprobar a continuacin en la explicacin de cada uno de los paso descritos, los
pasos A, B, C y D son pasos que podramos llamar de conexin y los pasos E y F son pasos de
actualizacin. Mientras los primeros llevan a cabo los cculos pertinentes para cumplir el proceso de
assembling, los segundos actualizan correctamente las listas de conectores conectados para un
determinado conector y las de conectores libres y ocupados para una determianda pieza.
Hay que aclarar que el orden de las transformaciones es estricto, es decir, que no conmutan, porque las
respectivas matrices tampoco lo hacen.
PASO A. COINCIDENCIA DE NORMALES.
Dado el conector esttico CS, el conector dinmico CD y sus respectivas piezas PS y PD, podemos obtener
w
sus normales en coordenadas de mundo (world) NS y ND de la siguiente forma (ver Figura 5.12):
w
NS
ND
CD
PS
0
c
w
NS = S2W * NS = S2W * 0
1
PD
CS
0
w
c
ND = D2W * ND= D2W * 0
1
Pieza 3005
Pieza 3005
Pieza 3004
Figura 5.12. Normales en coordenadas de mundo del conector esttico y del conector dinmico. Vista lateral.
donde D2W = PD2W * D2PD y S2W = PS2W * S2PS (ver apartado 5.1.2 Sistemas de referencia del
conector, de la pieza y del mundo).
Hay que aclarar que en vez de utilizar la matriz S2W para transformar las normales deberamos utilizar la
inversa traspuesta (S2W-1)T de la misma. El motivo de no hacerlo se debe a que no se realizan ni
traslaciones ni cambios de escala (slo rotaciones), lo cual nos permite utilizar la matriz de tranformacin
S2W.
A continuacin hay que realizar dos pasos muy importantes:
1
conector dinmico y del esttico nos dar como resultado un vector perpendicular a ambas.
2
Calcular el ngulo (
w
w
ND , NS ) . Con este segundo paso obtendremos el ngulo entre
83
Captulo 5. Diseo
Una vez obtenido el vector producto vectorial PV y el ngulo , tenemos la rotacin a aplicar a la pieza
dinmica PD y a las conectadas a ella, tanto directa como indirectamente, en forma de vector y ngulo de
rotacin alrededor suyo (ver Figura 5.13).
ND
NS
.
w
PV = ND
ND
ND
Pieza 3005
Figura 6.45.
Pieza 3004
NS
w
w
ND , NS ).
Para poder aplicar tal rotacin a las matrices de las piezas, necesitamos transformar la representacin
vectorial de la rotacin a su representacin matricial mediante la frmula de Rodrigues (ver Anexo 5.
Rotaciones y Frmula de Rodrigues), debido a la representacin interna de la rotacin de las piezas
utilizada por el propio LeoCAD [2] mediante un vector y un ngulo de rotacin. Una vez obtenida tal
matriz, solo hace falta aplicarla a la pieza dinmica PD y a las conectadas a sta ltima, tanto de forma
directa como indirecta (ver apartado 5.5 Transformaciones a ralizar sobre piezas ensambladas).
Con todo esto, tendremos la pieza dinmica y las conectadas a ella en una rotacin que cumple que las
normales de los conectores esttico y dinmico coinciden (ver Figura 5.14).
w
ND '
w
NS
PD
PS
(xD,yD,zD)
Pieza 3005
Pieza 3005
Pieza 3004
(xS,yS,zS)
Figura 5.14. La
Cabe destacar que los ejes X e Y del conector esttico y dinmico no tienen porqu coincidir, con lo que
conseguimos mantener la rotacin original de tales ejes para el conector dinmico y por lo tanto no los
modificamos (ver Figura 5.15).
84
EPS
ND '
(xS,yS,zS)
XD
PS
NS
YD
PD
YS
(xD,yD,zD)
Pieza 3005
Pieza 3005
Pieza 3004
XS
Figura 5.15. La
ND '
NS
POSS (xS,yS,zS)
POSD (xD,yD,zD)
Pieza 3005
Pieza 3005
Pieza 3004
Figura 5.16. Vector traslacin T a aplicar a la pieza dinmica. Vista lateral de la posicin inicial.
Una vez realizado este paso, tendremos el conector dinmico y el esttico en la misma posicin, tal y
como muestra la Figura 5.17.
UdG
85
Captulo 5. Diseo
NS ND '
(xS,yS,zS) = (xD,yD,zD)
Pieza 3005
Pieza 3005
Pieza 3005
Figura 5.17. Conector esttico y dinmico en la misma posicin. Vista lateral de la posicin final.
Y
Y
ND
w
NS
X
Figura 5.18. Pieza 32064 con un
conector de tipo AxleHole.
X
Figura 5.19. Pieza 3704 con un conector
de tipo Axle.
PS
Pieza 32064
Pieza 3704
PD
Figura 5.20. Piezas dinmica PD y esttica PS despus de aplicar los pasos A y B de assembling.
86
EPS
Tal y como se puede comprobar en la figura anterior, los ejes XS e YS del conector esttico deben coincidir
con los XD e YD del conector dinmico o diferenciarse en una rotacin de 90, 180 o 270 para que el
assembling en forma de cruz, entre ambos conectores, sea posible.
Para que se cumpla ( XS,YS ) =
muy similar al que se ha descrito en el paso B. Lo nico que har falta ser calcular el mnimo ngulo min
entre el eje XD y el XS, -XS, YS y el YS (ver Figura 5.21). Hay que aclarar que el proceso tambin se
podra llevar a cabo con el eje YD, ya que fijando uno de los dos automticamente se fijara el otro.
= min
Figura 5.21. ngulo min calculado entre el eje XD y los XS, -XS, YS y el YS.
El motivo de calcular el ngulo min ms pequeo de los cuatro mencionados, es debido a que de esta
forma modificaremos la rotacin original de la pieza dinmica, y como consecuencia, la rotacin de las
piezas conectadas a ella tanto directa como indirectamente, lo menos posible.
Con el ngulo min, el vector producto vectorial PV = ( XD, Ejemin ) entre el eje XD y el eje del mnimo
ngulo min, y la frmula de Rodrigues (ver Anexo 5. Rotaciones y Frmula de Rodrigues), podremos
crear la rotacin a aplicar a la pieza dinmica PD y a las conectadas a ella, tanto directa como
indirectamente (ver apartado 5.5 Transformaciones a realizar sobre piezas ensambladas), para que se
cumpla ( XS,YS ) = 0, 90, 180, 270 ( XD, YD ) (ver Figura 5.22).
.
PV = ( XS, Ejemin )
min S
XD
Figura 5.22. Vector PV y el ngulo min a partir de los cuales podremos crear la matriz de rotacin a
aplicar a la pieza dinmica y a las conectadas a ella, tanto de una forma directa como indirecta.
UdG
87
Captulo 5. Diseo
ambos conectores. Para ello solo se deber elegir la longitud mnima Lmin = min ( Llibre , Llibre ) entre la
longitud libre de los dos conectores que participan en el proceso de asssembling (ver Figura 5.23).
CD
Pieza 32064
Pieza 3704
CS
Llibre
Llibre
Ltotal
Ltotal
Figura 5.23. Seleccin de la longitud mnima Lmin, entre los dos conectores a ensamblar.
Vista lateral. Comparar con la Figura 5.23.
Una vez elegida la longitud mnima Lmin, solo har falta aplicar una traslacin T(Lmin) a la pieza dinmica
y a las conectadas a ella, tanto de forma directa como indirecta (ver apartado 5.5 Transformaciones a
realizar sobre piezas ensambladas). Tal traslacin tiene la peculiaridad que se tendr que realizar en el
eje Z del conector esttico. Para los dos casos en el que se aplica el paso en el que nos encontramos, el
vector T sera el siguiente:
T = ( 0, 0,-Lmin ) en el caso de que el conector esttico sea un Axle, ya que el eje Z+ va hacia
fuera del conector (ver apartado 5.1.3 Sistema de referencia de los conectores) y nosotros
queremos acomodar el conector dinmico hacia dentro del conector esttico, que en este caso
sera un Axle, y por lo tanto lo acomodaramos en la direccin contraria.
T = ( 0, 0, Lmin ) en el caso de que el conector esttico sea un Axle Hole o un Cylindrical Hole,
ya que el eje Z+ va hacia dentro de dichos conectores del conector (ver apartado 5.1.3 Sistema de
referencia de los conectores) y lo que queremos es acomodar el conector dinmico en tal
direccin.
Una vez aplicada la traslacin T, tendramos a los conectores tal y como se muestra en la Figura 5.24.
88
EPS
CD
Pieza 32064
Pieza 3704
CS
Llibre
Figura 5.24. Ejemplo de piezas despus de aplicar el paso D. Vista lateral. Comparar con la Figura 5.22.
PASO E. ACTUALIZACIN DE LA LISTA DE CONECTORES CONECTADOS.
Despus de haber realizado los pasos de assembling necesarios para cada tipo de conexin entre
conectores, hay que actualizar las listas de conectores conectados de los dos que han intervenido en el
ensamblaje. Simplemente hay que introducir en la lista de conectores conectados del conector esttico el
conector dinmico, y viceversa.
Con esto, sabremos en cada momento que conectores estn conectados a uno de determinado (ver Figura
5.25).
Stud Inlet
Pieza 3005
Stud
Pieza 3005
Figura 5.25. Todo conector conoce en todo momento los conectores conectados a l. Vista lateral.
UdG
89
Captulo 5. Diseo
Una vez especificados todos los pasos de assembling necsarios para que dos piezas, mediante sus
conectores, ensamblen de forma correcta vamos a determinar, para cada posible asembling entre cada par
de conectores, cuales de dichos pasos se deben realizar y cuales no. Hay que destacar que los pasos de
assembling no conmutan, ya que las matrices de las piezas tampoco, y por lo tanto debe seguirse el orden
prestablecido.
As pues tendremos, para las cuatro posibles conexiones identificadas en el proyecto, los siguientes pasos:
Todos estos pasos necesarios para llevar a cabo la conexin entre dos conectores, se podran llevar a cabo
de la siguiente forma:
90
EPS
Conector
La clase Conector posee un mtodo virtual puro [10], con el objetivo de que cada tipologa de ellos
realice los pasos necesarios, segn con el conector con el que vaya a ensamblar.
Conector
En la clase Conector tenemos un mtodo llamado assemblingStudStudInlet que realiza los pasos
necesarios para ensamblar conectores Stud y Stud Inlet entre si. El motivo de poner este mtodo en la
clase base Conector se debe a que es utilizado tanto por un conector de tipo puntual como es el Stud, as
como el conector de tipo Segmento Cylindrical Hole, que cabe recordar que puede ensamblar con
conectores de tipo Stud y por lo tanto se comporta como un Stud Inlet en dicho caso.
Stud
assemblingStudStudInlet(dinamico);
91
Captulo 5. Diseo
El conector de tipo Stud solo puede ensamblar con el Stud Inlet y con el Cylindrical Hole. Debido a que
los pasos para conectar al Stud con cualquiera de sus dos compatibles para ensamblar son exactamente los
mismos, simplemente ser necesario realizar la llamada al mtodo indicado.
Stud Inlet
Segmento
void assemblingAxleCylindricalHole(Conector dinamico)
coincidenciaNormales(dinamico);
coincidenciaPosiciones(dinamico);
acomodarConectores(dinamico);
actualizarConectoresConectados(dinamico);
dinamico.actualizarConectoresConectados(this);
actualizarListasPieza();
dinamico.actualizarListasPieza();
Dentro de la clase Segmento encontramos dos mtodos: Uno de ellos el que se encarga de la conexin
entre el Axle y el Axle Hole, y otro que ensambla a un conector de tipo Axle con otro de tipo Cylindrical
Hole.
Axle
El conector Axle solo deber preguntar por la tipologa del conector con el que se va a ensamblar y llamar
al mtodo necesario.
Axle Hole
En el caso del Axle Hole, y al igual que ocurre con el Stud Inlet, solo hace falta llamar el mtodo que se
encarga de la conexin entre el propio conector y su compatible, es decir, el Axle, ya que solo ensambla
con los de este tipo.
Cylindrical Hole
Para un conector de tipo Cylindrical Hole hay que preguntar qu tipo de conector compatible con l se le
intenta ensamblar y actuar en consecuencia llamando al mtodo correspondiente.
UdG
93
Captulo 5. Diseo
Stud
Inlet
Stud
Inlet
Conectores ensamblados
por el usuario
Pieza 3004
Pieza 3004
Conectores a propagar el
assembling
Stud
Stud
Figura 5.31. Ejemplo de conexin resultante de la realizacin del assembling entre dos
conectores. Vista lateral.
Como consecuencia de este hecho, que es lo que se ha denominado propagacin del assembling, hay
que detectar posibles nuevas conexiones como resultado de una de previa.
Las conexiones que son realizadas explcitamente por el usuario, es decir, las que intervienen el conector
dinmico y el esttico a ensamblar, las denominaremos conexiones principales y las conexiones
resultantes de las principales las llamaremos conexiones secundarias.
As pues, el objetivo de la propagacin del assembling, ser el de encontrar posibles conexiones
secundarias entre la parte dinmica y esttica del modelo que se est creando (ver apartado 5.1.1
Definiciones tiles).
Para poder dar como vlida a una conexin secundaria se deben cumplir unas condiciones, que tal y como
se puede comprobar son las mismas que se exigen par poder llevar a cabo el proceso de assembling. La
diferencia radica en que ahora nicamente hace falta comprobar dichas condiciones y en el momento de
ensamblar hay que llevarlas a cabo. Veamos pues, cuales son las condiciones:
94
Condicin D. Coaxialidad.
longitud Stud.
EPS
Convertir la normal del primer conector C1 y del segundo conector C2 a coordenadas de mundo
(ver apartado 5.1.2 Sistemas de coordenadas del conector, de la pieza y del mundo).
C
donde
N1 = ( 0, 0, 1 )
donde
N2 = ( 0, 0, 1 )
N1 = C12W * N1
N2 = C22W * N2
2
N1 = N2
Con estas premisas podremos asegurar que ambos conectores poseen la misma normal.
CONDICIN B. IGUALDAD DE POSICIONES.
Esta condicin se basa en comprobar que los dos conectores a ensamblar, como resultado de una
conexin secundaria, se encuentran en la misma posicin. Dos conectores C1 y C2 se encuentran en la
misma posicin si POSC1 = POSC2.
CONDICIN C. LONGITUD LIBRE CYLINDRICAL HOLE >= LONGITUD STUD.
En el caso de la propagacin del assembling entre dos conectores, uno de ellos de tipo Stud y otro de tipo
Cylindrical Hole, hay que comprobar que la longitud libre del Cylindrical Hole sea como mnimo, igual a
la longitud del Stud, la cual es constante, cosa que en el caso del Cylindrical Hole no tiene por que ser as.
Para realizar tal comprobacin solo har falta calcular la distancia mnima de todas las distancias entre el
punto inicial del Cylindrical Hole y el de los conectores conectados a l. Si la distancia mnima de todas
ellas es ms grande o igual a la longitud del stud entonces si se verificar esta condicin, en caso
contrario no (ver Figura 5. 32)
UdG
95
Captulo 5. Diseo
Stud
Axle
Stud
Axle
Axle
CH CH
Axle
CH CH
Pieza 32064
Pieza 3704
Figura 5.32. Ejemplos donde se cumple la premisa de la condicin C (derecha) y donde no (izquierda).
CONDICIN D. COAXIALIDAD.
Dos conectores sern coaxiales, si el eje Z de ambos es el mismo (ver Figura 5.33).
C1
. 1.
Eje coaxial
Z1
C2
Pieza 3704
Pieza 32064
96
EPS
C1
. 1.
Eje coaxial
Z1
C2
F1
I1
I2
Figura 5.34. Clculo de la distancia entre la recta r ( I1, F1 ) y el punto I2. Vista lateral
CONDICIN E. COINCIDENCIA DE SEGMENTOS.
Despus de saber si los conectores son coaxiales hay que comprobar que el segmento del primer conector
se encuentre posicionado sobre el segmento del segundo conector o viceversa (esta condicin solo se
exige en assemblings secundarios entre conectores de tipo segmento), ya que dos conectores sean
coaxiales no nos garantiza que se encuentren el uno sobre el otro (ver Figura 5.35).
C1
. Z1
. Z1
Eje coaxial
C2
Pieza 32064
Pieza 3704
Figura 5.35. Ejemplo de conectores coaxiales pero que no coinciden en el espacio. Vista lateral.
As pues, tenemos que calcular la superposicin de los segmentos S1 y S2 que forman los conectores C1 y
C2 respectivamente (ver Figura 5.36). Para ello vamos a realizar unos pasos previos que facilitarn en
gran medida dichos clculos.
C1
Pieza 32064
Pieza 3704
C2
F1
S1
I1
I2
S2
F2
Figura 5.36. Segmentos S1 y S2 resultantes, de los conectores C1 y C2, respectivamente. Vista lateral.
UdG
97
Captulo 5. Diseo
Segundo paso. Obtenemos el segmento de C2 en coordenadas del conector C1. Para obtener tal
segmento tenemos que llevar a cabo los siguientes pasos:
1
Tercer paso. Ahora ya estaremos en disposicin de crear el segmento S2 del segundo conector,
para comprobar la superposicin o no de C1 y C2.
Z
S2 = [ A2, B2 ] donde,
Z
A2 es la componente Z del vector resultante (componente del eje coaxial) de componer el punto
inicial del segundo conector y la matriz de transformacin del segundo al primer conector
Z
98
EPS
Como se puede comprobar, los dos segmentos se superponen si son el mismo segmento o si uno est
parcial o totalmente dentro del otro. En el caso en que solo coincida un extremo entre ambos conectores
los segmentos no se superpondrn. En el resto de casos tampoco. As pues, la funcin coincidencia
devolver cierto en los casos 1
5.37.
S1
S1
S2
S2
S2
S1
S1
S1
S2
S2
S1
S2
S1
S2
S1
S2
Figura 5.37. Casos en los que dos conectores coinciden y casos en los que no.
Con todos estos pasos previos evitamos realizar clculos de superposicin de segmentos en tres
dimensiones, los cuales seran bastante ms complejos, con lo que acabamos trabajando con una nica
componente perteneciente al eje Z que es el eje coaxial, la cual nos facilita mucho la verificacin de la
condicin.
CONDICIN F. SEGMENTO LIBRE.
Una vez que nos hemos asegurado que los segmentos que forman los conectores se superponen, hay que
comprobar que tal superposicin se realice sobre la parte libre del conector.
Para resolver esta condicin tendremos, para los dos conectores en los que estamos buscando conexiones
secundaria, que:
1
Comprobar que el segmento formado por el primer conector C1 no coincida con ninguno de los
conectores conectados a C2.
UdG
99
Captulo 5. Diseo
Comprobar que el segmento formado por el segundo conector C2 no coincida con ninguno de los
conectores conectados a C1.
Con esto lo que evitamos es que dos conectores, que pueden conectar a un mismo conector, se ensamblen,
ya que estaran ocupando la misma posicin y por lo tanto superponindose.
CONDICIN G. COINCIDENCIA EN CRUZ.
Para comprobar si el ngulo entre los ejes X1 de un conector C1 y el X2, -X2, Y2, -Y2 es 0, 90, 180 o 270
hay que:
1
Obtener el eje X1, el X2 y el Y2 en coordenadas de mundo. Cabe destacar que no hace falta
calcular X2 y Y2, ya que con X2 y Y2 podemos obtenerlos fcilmente.
w
X1 = C2W1 * X1 = C2W1 *
X2 = C2W2 * X2 = C2W2 *
2
1
0
0
1
0
0
Y2 = C2W2 * Y2 = C2W2 *
0
1
0
Obtener el mnimo ngulo entre min (angulo( X1,X2 ), angulo( X1, -X2 ), angulo( X1, Y2 ),
angulo( X1, -Y2 ) ).
Comprobar que el ngulo mnimo min, encontrado anteriormente, sea uno de los que producen
que se ensamble en forma de cruz, es decir, 0, 90, 180, 270, ya que esta condicin nicamente
se exige entre la conexin secundaria Axle Axle Hole.
Hay que aclarar que, al igual que el proceso de assembling, no todas las condiciones se deben cumplir
para cada posible conexin secundaria entre cada par de conectores secundarios. Veamos pues, cules se
necesitan para cada conexin entre conectores:
100
EPS
Todos estos pasos necesarios para llevar a cabo las conexiones secundarias entre dos conectores
compatibles, se podran llevar a cabo de la siguiente forma:
Tal y como se ha comentado en este mismo apartado, deberemos intentar propagar el assembling, es
decir, buscar conexiones secundarias entre la parte dinmica y esttica (ver apartado 5.1.1 Definiciones
tiles) del modelo en construccin.
void propagarAssembling()
ListaPieza piezaDinamicas, piezasEstaticas;
Pieza actualDinamica, actualEstatica, actual;
piezasDinamicas=parteDinamicaModelo();
piezasEstaticas=parteEstaticaModelo();
for each actualDinamica in piezasDinamicas do
{
for each actualEstatica in piezasEstaticas do
{
actualDinamica.propagarAssembling(actualEstatica);
}
}
for each actual in piezasModelo do
{
actual.actualizarListasConectores();
}
UdG
101
Captulo 5. Diseo
Para llevar a cabo la propagacin del assembling, primero deberemos obtener la lista de piezas que
forman la parte dinmica del modelo y la lista de piezas que forma la parte esttica del mismo. A
continuacin hay que buscar conexiones secundarias entre cada par de piezas (piezaDinamica,
piezaEstatica), donde piezaDinamica es una pieza perteneciente a la parte dinmica y piezaEstatica es
una pieza de la parte esttica del modelo en construccin.
En los casos en los que se hayan detectado conexiones secundarias se debern actualizar las listas de los
conectores conectados de cada uno de los implicados en dicha conexin, as como las listas de conectores
libres y ocupados de sus respectivas piezas.
Cabe comentar que esta ltima accin, la de actualizacin de las listas de conectores libres y ocupados de
las piezas involucradas, no se realiza a la vez que actualizamos las listas de conectores conectados al
encontrar una conexin secundaria, ya que un conector de tipo segmento puede ensamblar con ms de un
conector al mismo tiempo. Si actualizaramos las listas de conectores libres y ocupados de las respectivas
piezas para un conector de tipo Axle, por ejemplo, al encontrar una sola conexin secundaria con otro
conector compatible a l se eliminara de la lista de conectores libres, pasando a la de conectores
ocupados de su pieza y por lo tanto ya no podramos propagar ms el assembling con dicho conector.
Pieza
Cuando una pieza desea buscar conexiones secundarias entre ella y otra dada, deber intentar propagar el
assembling entre cada par de conectores de ambas piezas. Esto se basa en verificar la compatibilidad entre
los dos conectores a conectar y las propiedades de conexiones secundarias para cada par de conectores.
102
EPS
En la clase Conector se encuentra el mtodo que confirma la conexin entre un Stud y cualquiera de sus
dos conectados: el Stud Inlet y el Cylindrical Hole. Hay que destacar que el mtodo recibe el nombre del
primer tipo de conexin secundaria (Stud Stud Inlet) debido a que cuando se intenta propagar el
assembling entre un conector de tipo Stud y uno de Cylindrical Hole consideramos que ste ltimo se
comporta como un Stud Inlet, debido a que debe cumplir exactamente las mismas condiciones que para el
caso Stud Stud Inlet.
Segmento
Ya en la clase segmento, nos encontramos con los mtodos que utilizarn la clase Axle, Alxe Hole y
Cylindrical Hole para verificiar las conexiones secundarias correspondientes.
UdG
103
Captulo 5. Diseo
Segmento
En el ltimo nivel de herencia, cada tipo de conector solo deber llamar a cada mtodo de verificacin de
la conexin secundaria, dependiendo de los conectores que se pretendan propagar. En el caso de la
conexin secundaria entre el Stud y el Cylindrical Hole hay que observar que aparte de preguntar por la
validacin de la conexin secundaria se verifica que la longitud libre del Cylindrical Hole sea ms grande
o igual que la del Stud, la cual es constante a diferencia de la del Cylindrical Hole que puede variar.
Stud
LONGITUD_STUD.
Un conector de tipo Stud Inlet, debido a que solo ensambla con el conector de tipo Stud, preguntar
nicamente por la posibilidad de la conexin secundaria con dicho conector.
Stud Inlet
104
EPS
El conector de tipo segmento Axle preguntar por el tipo de conector con el que se le intenta propagar y
actuar en consecuencia llamando al mtodo de verificacin de conexiones secundarios correspondiente.
Axle
El Axle Hole nicamente deber verifcar si la propagacin de la conexin con el conector de tipo Axle es
vlida o no, ya que solo ensambla con tal conector.
Axle Hole
El Cylindrial Hole, de forma anloga al Stud y al Axle, preguntar por a tipologa del conector con el que
se le intenta ensamblar para llamar al mtodo pertinente. Fijarse que en el caso de la propagacin con un
conector de tipo Stud, hay que comprobar que la longitud libre del Cylidrical Hole sea como mnimo la
misma que la longitud del Stud.
Cylindrical Hole
UdG
105
Captulo 5. Diseo
5.4
Sobre toda pieza que se encuentre ensamblada con otra u otras, se le puede llevar a cabo tres grandes
tipos de transformaciones:
1
Rotaciones. Debido a que las piezas se encuentra fsicamente conectadas, rotar (ver apartado
5.6.1 Comunicacin de la rotacin) una pieza ensamblada supone rotar tambin todas las
conectadas, tanto de forma directa como indirecta, a las primera que se rot.
Traslaciones. Al igual que las rotaciones, trasladar (ver apartado 5.6.2 Comunicacin de la
traslacin) una pieza ensamblada, supone trasladar a su vez las piezas conectadas a ella, tanto
directa como indirectamente.
Deslizamientos. Toda pieza que se encuentre en disposicin de deslizar (ver apartado 5.6.3
Comunicacin del deslizamiento) debe a su vez deslizar todas los piezas conectadas a ella,
directa o indirectamente, excepto sobre la que se encuentra realizando el proceso de
deslizamiento.
Fase 1. Fase de comunicacin de la transformacin. Esta fase es la parte no comn a los tres
tipos de transformaciones y es en la que se le comunicar a todas las pieza ensambladas, tanto
directa o indirectamente, a la pieza que originalmente se la pretenda rotar, trasladar o deslizar;
que a posteriori se les aplicar una de las tres posibles transformaciones. Con esta primera fase
solo se pretende informar a las propias piezas, cuales de ellas van a ser rotadas, trasladadas o
deslizadas posteriormente (ver apartado 5.5 Comunicacin de transformaciones sobre piezas
ensambladas).
Fase 2. Fase de aplicacin de la transformacin. Esta fase es comn a los tres tipos de
transformaciones posibles y se basa en aplicar la transformacin realizada sobre las piezas a la
que se les ha comunicado (ver apartado 5.6 Apliacacin de transformaciones sobre piezas
ensambladas).
Cabe aclarar que el motivo de separar la comunicacin de las transformaciones a realizar de la aplicacin
de las mismas. La razn se basa en que si aplicramos las transformaciones durante la comunicacin nos
encontraramos en momentos en que existieran piezas transformadas y no transformadas al mismo
tiempo, lo que nos perjudicara en los clculos de deteccin de colisiones, ya que estaramos mezclando
datos de piezas rotadas, trasladadas o deslizadas con piezas que an no lo han sido y por lo tanto dichos
clculos no seran reales.
106
EPS
5.5
Esta es la primera fase a llevar a cabo en toda transformacin (rotacin, traslacin y deslizamiento) que se
aplique sobre una pieza ensamblada a otra u otras. Esta fase se puede clasificar en:
1
Comunicacin de la rotacin.
Comunicacin de la traslacin.
comunicarRotacion(Matrix R)
Conector ocupado;
if(not visitada)
{
visitada=true;
transformada=true;
transformacin=R;
for each ocupado in conectoresOcupados do
{
ocupado.comunicarRotacionConector(R);
}
}
Toda pieza que desee rotarse primero modificar su estado a visitada, para que en futuras llamadas de
comunicacin de rotacin a la pieza, sta no lleve a cabo ninguna operacin, con lo que evitamos posibles
bucles infinitos provocados por sucesivas llamadas de comunicacin de rotacin entre piezas conectadas.
A continuacin la pieza pone el flag transformada a cierto y guarda la rotacin R, para que
posteriormente en el proceso de transformacin de piezas ensambladas (ver apartado 5.7 Transformacin
de pieza ensambladas), dicha rotacin le sea aplicada. Para finalizar, la pieza le comunicar a todos sus
conectores ocupados que tienen que llevar a cabo el proceso de comunicacin de la rotacin R.
UdG
107
Captulo 5. Diseo
Conector
virtual comunicarRotacionConector(Matrix R)
Conector actual;
for each actual in conectados do
{
actual.comunicarRotacion(R);
}
Cuando los conectores reciben tal mensaje, actan en consecuencia. Esto es, comunicar a todos sus
conectores conectados que tiene que comunicar la rotacin.
Conector
virtual comunicarRotacion(Matrix R)
madre.comunicarRotacion(R);
Este ltimo mensaje de comunicacin de rotacin entre conectores, es diferente al mensaje que utiliza la
pieza para comunicarse con sus conectores ocupados, ya que con el primero lo que conseguimos es que
cada conector que recibe un mensaje de comunicacin de rotacin a travs de un conector conectado a l,
informe a la pieza a la que pertenece que tiene que llevar a cabo el proceso de comunicacin de la
rotacin R y con el segundo lo que conseguimos es que la pieza comunique tal rotacin a sus conectores
ocupados.
Este proceso se repetir hasta que todas las piezas conectadas, tanto de forma directa como indirecta a la
primera a la que se rot, sean visitadas y por lo tanto sepan que posteriormente seran rotadas.
Cabe comentar dos aspectos importantes:
1
Una vez aplicado el proceso de comunicacin de rotacin de piezas ensambladas, habr que
volver a modificar el estado, tanto de la pieza rotada originalmente como el de las conectadas a
ella, de forma directa o indirecta, a no visitada. Con esto lo que conseguimos es que despus de
comunicar la rotacin a una pieza ensamblada, podamos volver a comunicrselo sin perder las
conexiones.
108
EPS
La rotacin a almacenar en las piezas ensambladas, tanto directa como indirectamente, a la pieza
a la que originalmente se le aplica la rotacin, es diferente de la que se le aplica a sta ltima. La
diferencia radica en que a las conectadas directa o indirectamente hay que rotarlas respecto al
centro de la primera pieza que se rot, ya que si no sucederan cosas como las que se muestran
en la Figura 5.38.
Pieza 3005
Pieza 3004
Correcto
Pospieza
Incorrecto
UdG
M centro + =
1
0
0
0
0
1
0
0
0
0
1
0
PosXpieza
PosYpieza
PosZpieza
1
M centro - =
1
0
0
0
0
1
0
0
0
0
1
0
-PosXpieza
-PosYpieza
-PosZpieza
1
109
Captulo 5. Diseo
PECULIARIDADES
La comunicacin de la rotacin de piezas ensambladas mediante conectores Axle-Cylindrical Hole es el
nico caso que hay que diferenciar y destacar del resto. Dicho caso se caracteriza, en que el conector de
tipo Axle (ver Captulo 2. Piezas y conectores Lego) puede rotar libremente sobre un conector de tipo
Cylindrical Hole (ver Captulo 2. Piezas y conectores Lego), y viceversa, siempre y cuando la rotacin se
produzca en el eje Z de los conectores, es decir, en el eje coaxial del assembling (ver apartado 5.4.7
Propagacin del assembling) entre ambos (ver Figura 5.39).
1
Figura 5.39. Secuencia de rotacin que muestra como el Axle puede rotar libremente sobre el
Cylindrical Hole.
110
EPS
Segmento
Cylindrical Hole
comunicarRotacionConector(Matrix R)
comunicarRotacion(Matrix R)
if(not rotarEjeZ(R))
{
Segmento::comunicarRotacionConector(R);
}
if(not rotarEjeZ(R))
{
Segmento::comunicarRotacion(R);
}
Para comprobar si la rotacin se est realizando en el eje Z del conector hay que llevar a cabo los
siguientes pasos:
1
Obtener el punto inicial Iw y el final Fw del conector, en coordenadas de mundo (ver apartado
5.1.2 Sistemas de referencia del conector, de la pieza y del mundo).
Iw = C2W * Ic
donde
Fw = C2W * Fc
donde
Volver a obtener el punto inicial y final del conector en coordenadas de mundo, una vez aplicada
la rotacin a la matriz de la pieza.
IwR = C2WR * Ic donde
UdG
111
Captulo 5. Diseo
Una vez realizados estos tres pasos previos, solo har falta comprobar que el punto inicial y final del
conector, antes y despus de la rotacin, sean el mismo.
Segmento
bool rotarEjeZ(Matrix R)
return((Iw == IwR) and (Fw = FwR));
Cabe comentar, que el motivo de realizar la comprobacin utilizando dos puntos, el inicial y final del
conector, en vez de uno de solo se debe a que podemos tener rotaciones que se realicen respecto al punto
del conector seleccionado para realizar la comprobacin y por lo tanto tendramos que la rotacin se est
llevando a cabo en el eje Z del conector, cuando realmente no es as. Por el contrario, con los dos puntos
del conector, evitamos tal problema.
EJEMPLO
Veamos el ejemplo de la Figura 5.40 para comprender la problemtica que supone comunicar la rotacin
de una pieza ensamblada y la solucin utilizada.
112
EPS
Las piezas que interviene en la rotacin son las que se muestran a continuacin:
A2
A1
B1
B3
Pieza
3704
Conector
A1
A2
Tipo Conector
Axle
Axle
Pieza
6541
Conector
B1
B2
B3
B4
Tipo Conector
Stud
Stud Inlet
Cylindrical Hole
Cylindrical Hole
Pieza
32064
Conector
C1
C2
C3
C4
C5
C6
Tipo Conector
Stud
Stud
Stud Inlet
Stud Inlet
Axle Hole
Axle Hole
B1
B3
B4
B4
B
B2
B2
C1 C2
C5
C6
C1
C5
C3
C3 C4
C2
C6
C4
Tal y como se puede comprobar, la pieza A est conectada a la pieza B y C mediante sus dos conectores
de tipo Axle. Ms en concreto, el Axle A1 est conectado al Axle Hole C5 y el Axle A2 est conectado al
Cylindrical Hole B3 y B4.
El diagrama de secuencia asociado sera el que se muestra a continuacin:
UdG
113
Captulo 5. Diseo
La pieza A recibe el mensaje que le informa que debe iniciar el proceso de comunicacin de rotacin.
sta modifica su estado a visitada, actualiza el flan transformada a cierto y almacena la rotacin R para
acabar comunicando a sus conectores ocupados que deben informar de dicha rotacin. El primer conector
en recibir tal mensaje es el A1, que le comunicar a sus conectados, en este caso el conector C5, que debe
informar de la rotacin que se pretende llevar a cabo. ste se lo comunicar a su vez a la pieza C, que es a
la que pertenece, y tal pieza iniciar el proceso de comunicacin de rotacin. La pieza C cambia su estado
a visitada, actualiza su flag para saber, posteriormente, que debe ser transformada, guarda la rotacin R y
le comunica a su conector ocupado C5 que debe propagar la comunicacin de rotacin a los conectores
conectados a l. A continuacin el conector A1 recibe dicha propagacin y se lo comunica a su pieza, la
A. sta como ya ha sido visitada con anterioridad no realiza ningn tipo de operacin. Siguiendo con el
proceso, a la pieza A le falta por propagar la comunicacin de la rotacin mediante su otro conector
ocupado A2. ste enva el mensaje a los conectores conectados a l. En este caso, el B3 y el B4. Tanto el
primero como el segundo, al recibir la propagacin del mensaje de comunicacin de rotacin, debido a
que pertenecen a la tipologa de los conectores Cylindrical Hole, comprueban si la rotacin R se realiza en
su eje Z. Como dicha rotacin se lleva a cabo en el eje Z de los Cylindrical Hole, ambos no la propagan y
por lo tanto la pieza B, que es a la que pertenecen tanto B3 como B4, no se ver rotada.
114
EPS
comunicarTraslacion(Vector T)
Conector ocupado;
if(not visitada)
{
visitada=true;
transformada=true;
transformacin.trasladar(T);
for each ocupado in conectoresOcupados do
{
ocupado.comunicarTraslacionConector(R);
}
}
Toda pieza que desee trasladarse primero modificar su estado a visitada, para que en futuras llamadas de
comunicacin de traslacin a la pieza, sta no lleve a cabo ninguna operacin, con lo que evitamos
posibles bucles infinitos provocados por sucesivas llamadas de comunicacin de traslaciones entre piezas
conectadas. A continuacin la pieza pone el flag transformada a cierto y guarda la traslacion T, para
que posteriormente en el proceso de transformacin de piezas ensambladas (ver apartado 5.7 Aplicacin
de transformcaciones sobre piezas ensambladas), dicha traslacin le sea aplicada. Para finalizar, la pieza
le comunicar a todos sus conectores ocupados que tienen que llevar a cabo el proceso de comunicacin
de la traslacin T.
Conector
virtual comunicarTraslacionConector(Vector T)
Conector actual;
for each actual in conectados do
{
actual.comunicarTraslacion(R);
}
Cuando los conectores reciben tal mensaje, actuarn en consecuencia. Esto es, comunicar a todos sus
conectores conectados que deben informar de la traslacin que se pretende realizar.
UdG
115
Captulo 5. Diseo
Conector
comunicarTraslacion(Vector T)
madre.comunicarTraslacion(T);
Este ltimo mensaje de comunicacin de la traslacin entre conectores, difiere con el mensaje que utiliza
la pieza para comunicarse con sus conectores ocupados, ya que con el primero lo que conseguimos es que
cada conector que recibe un mensaje para informar de la traslacin a travs de un conector conectado a l,
comunique a la pieza a la que pertenece, que tiene que llevar a cabo el proceso de comunicacin de la
traslacin T.
Este proceso se repetira hasta que todas las piezas conectadas, tanto directa como indirectamente a la
primera que trasladamos, sean visitadas y por lo tanto sepan que en cualquier momento se les aplicar una
traslacin.
Cabe comentar que una vez finalizado el proceso de comunicacin de la traslacin de piezas
ensambladas, habr que volver a modificar el estado, tanto de la pieza trasladada como el de las
conectadas a ella, de forma directa o indirecta, a no visitada. Con esto lo que se consigue es que despus
de informar de la traslacin a llevar a cabo por una pieza ensamblada, podamos a volver a aplicar dicho
proceso sin perder las conexiones.
PECULIARIDADES
Dentro del proceso de comunicacin de la traslacin de piezas ensambladas, hay que aclarar ciertos casos
en el que los conectores, dependiendo del tipo que sean, no se comportan de la forma descrita
anteriormente.
Caso1. Todo conector de tipo segmento redefine el mtodo que permite a la pieza a la que pertenece,
comunicarse con l en un proceso de informacin de traslacin de piezas ensambladas. ste es el motivo
por el que el mtodo comunicarTraslacionConector(Vector T) de la clase Conector, est definido
como virtual. En este primer nivel de herencia el mtodo comunicarTraslacionConector(Vector
T), solo sufre una pequea modificacin. Tal modificacin se basa en preguntarle al conector si se
encuentra realizando un deslizamiento sobre otro conector (ver apartado 5.6.3 Comunicacin del
deslizamiento). Tal pregunta hay que realizarla, ya que si el conector de tipo segmento al que se le
comunica que tiene que llevar a cabo un proceso de informacin de traslacin, mediante la pieza a la que
pertenece, se encuentra deslizndose sobre otros conectores, no debe propagar dicha traslacin al conector
o conectores sobre los que se encuentra realizando tal proceso, precisamente para poderse deslizar.
116
EPS
Segmento
comunicarTraslacionConector(Vector T)
if(not deslizando) Conector::comunicarTraslacionConector(T);
Caso 2. En un segundo nivel de herencia, el nico tipo de conector que debe redefinir los mtodos de
comunicacin de traslaciones es el conector de tipo Cylindrical Hole.
Tal y como se ha comentado en este mismo captulo (ver apartado 5.4.4 Verificacin de compatibilidad
entre conectores), el Cylindrical Hole puede ensamblar tanto con el Stud como con el Axle. En el caso
del Axle y debido a las caractersticas tanto geomtricas del propio Cylindrical Hole como a la forma de
ensamblar que tienen ambos conectores, cuando uno de los dos lleva a cabo un proceso de traslacin,
sucede que el conector que se traslad primero, en vez de trasladarse se desliza sobre el otro.
Una vez explicado esto, se podra pensar que el conector de tipo Axle (ver Captulo 2. Piezas y
conectores Lego) tambin debera redefinir los mtodos que permiten la comunicacin de traslacin.
Realmente no hace falta, ya que debe ser el propio Cylindrical Hole el que al recibir el mensaje de
comunicacin de una determinada traslacin T acte en consecuencia debido a que, tal y como se ha
dicho, es l el que tiene la geometra la que, al interaccionar con el Axle en una traslacin, produce que se
deslice y por lo tanto no propague la misma.
A todo esto hay que aadirle la deteccin de colisiones que se ha implementado en el proceso de
comunicacin de traslacin, en el caso de conectores de tipo segmento.
Tal colisin se basa en detectar cual es la distancia mnima que el Cylindrical Hole permanecer quieto
sin propagar la traslacin, deslizndose, hasta que se encuentre con un conector conectado al mismo Axle
al que se encuentra ensamblado el Cylindrical Hole y por lo tanto le empuje, o hasta que se desconecte,
debido a que no encontr ningn obstculo en su camino.
Tal deteccin solo se llevar a cabo si la traslacin se realiza en el eje Z de los conectores, el cual es el eje
coaxial de assembling entre ambos (ver apartado 5.4.7 Propagacin del assembling).
As pues los mtodos de traslacin del Cylindrical Hole quedaran de la siguiente forma:
UdG
117
Captulo 5. Diseo
Cylindrical Hole
comunicarTraslacionConector(Vector T)
Conector conectorColision;
int direccion;
double distanciaColision,normaTraslacion;
if(esAssembling or mensajeAStud()) Segmento::comunicarTraslacionConector(T);
else if(not visitado)
{
visitado=true;
if(not moverEjeZ(T)) Segmento::comunicarTraslacionConector(T);
else
{
direccion=calcularDireccionTraslacion();
distanciaColision=distanciaColision(abs(direccion));
conectorColision=conectorColision(direccion);
if(distanciaColision==0) conectorColision.comunicarTraslacion(T);
else if(distanciaColision==+- ) recalcularConexiones();
else
{
moduloTraslacion=T.modulo();
if(moduloTraslacion==distanciaColision) recalcularConexiones();
else if(moduloTraslacion>distanciaColision)
{
Segmento::comunicarTraslacionConector(T-distanciaColision);
}
}
}
}
Como se puede comprobar un conector de tipo Cylindrical Hole deber comportarse como cualquier
conector de tipo Segmento si se encuentra realizando un proceso de assembling o si el mensaje va a ser
propagado a un conector de tipo Stud. Los motivos de obligar a un conector Cylindrical Hole a propagar
la comunicacin de la traslacin se deben a que en el momento del asssembling se pueden producir
traslaciones en el eje Z del conector y por lo tanto ste se deslizara y no se trasladara conjuntamente con
sus conectores conectados. Esto puede a llegar a ser molesto ya que se perderan las conexiones realizadas
anteriormente por el usuario. Por este motivo se decidido obligar a todo Cylindrical Hole a propagar la
comunicacin de la traslacin siempre que se lleve a cabo un proceso de assembling. El segundo motivo
para obligar a un Cylindrical Hole a comportarse como el resto de conectores Segmento es si se va a
propagar la comunicacin de la traslacin a un Stud. La explicacin es sencilla: las propiedades de la
conexin entre Stud Cylindrical Hole no permiten que uno se deslice sobre el otro, con lo que si el Stud
se traslada, tambin debe de hacerlo el Cylindrical Hole y viceversa, evitando as el deslizamiento entre
ambos.
118
EPS
P3
P1
A1
A2
AH1
AH2
CH1
CH2
dcolision
Figura 5.41. Esquema de la direccin de la deteccin de colisiones al recibir un conector
Cylindrical Hole el mensaje traslacin por parte de la pieza a la que pertenece.
UdG
119
Captulo 5. Diseo
Cylindrical Hole
comunicarTraslacion(Vector T)
Conector conectorColision;
int direccion;
double distanciaColision,normaTraslacion;
if(esAssembling() or mensajeParaStud()) Segmento::comunicarTraslacion(T);
else if(not visitado)
{
visitado=true;
if(not moverEjeZ(T)) Segmento::comunicarTraslacion(T);
else
{
direccion=calcularDireccionTraslacion();
distanciaColision=distanciaColision(-abs(direccion));
conectorColision=conectorColision(direccion);
if(distanciaColision==0) comunicarTraslacion(T);
else if(distanciaColision==+- ) recalcularConexiones();
else
{
moduloTraslacion=T.modulo();
if(moduloTraslacion==distanciaColision) recalcularConexiones();
else if(moduloTraslacion>distanciaColision)
{
Segmento::comunicarTraslacion(T-distanciaColision);
}
}
}
}
colisiones (ver Captulo 6. Implementacin) debe ser la contraria a la direccin de traslacin, ya que la
ieza que pretende trasladarse es tra diferente a la que pertenece el Cylindrical Hole, debido a que la
120
EPS
Direccin traslacin
Direccin deteccin colisiones
P2
P3 a trasladar
P1
A1
A2
AH1
AH2
CH1
CH2
dcolision
Figura 5.42. Esquema de la direccin de la deteccin de colisiones al recibir un conector
Cylindrical Hole el mensaje traslacin por parte de un conector conectado a l.
Cabe comentar tres aspectos de los mtodos de comunicacin de la traslacin del Cylindrical Hole:
1
Tal y como se puede observar en los mtodos, el conector cambia su estado de no visitado a
visitado. Esto se realiza para que en prximas llamadas a ste mtodo de un mismo conector, no
se produzcan bucles infinitos de llamadas de traslacin entre conectores conectados entre si o
llamadas de piezas a sus conectores que a la vez propagan la traslacin a sus conectados y as
sucesivamente.
Para saber si la traslacin se est llevando a cabo en el eje Z del conector tenemos que realizar
los siguientes pasos:
UdG
121
Captulo 5. Diseo
bool moverEjeZ(Vector T)
return (T==Z);
donde Z = ( 0, 0, 1 ).
Como se puede observar, la comprobacin debe realizarse tanto en la direccin positiva
del eje Z como en la direccin negativa del mismo.
3
En el caso en el que la distancia de colisin sea diferente de cero, habr que recalcular las
conexiones entre conectores, ya que es como si nos encontrramos en un proceso de
deslizamiento (ver apartado 5.7 Comunicacin del deslizamiento) y por lo tanto pueden haberse
producido cambios de conexiones entre los conectores participantes en la traslacin.
( xi, yi, zi )
A
B
( xf, yf, zf )
C
Las piezas que intervienen en la traslacin son las que se muestran a continuacin:
122
EPS
A1
A2
A
A3
A4
B1
B2
B
B3
B4
C1
C2
C
C3
C4
Pieza
3004
Conector
A1
A2
A3
A4
Tipo Conector
Stud
Stud
Stud Inlet
Stud Inlet
Pieza
3004
Conector
B1
B2
B3
B4
Tipo Conector
Stud
Stud
Stud Inlet
Stud Inlet
Pieza
3004
Conector
C1
C2
C3
C4
Tipo Conector
Stud
Stud
Stud Inlet
Stud Inlet
Como se puede comprobar, la pieza A, mediante sus dos Stud Inlets, est conectada a las piezas B y C.
Ms en concreto, el conector A3 est ensamblado con el B2 y el A4 con el C1. As pues, el diagrama de
secuencia que estara asociado a la comunicacin de la traslacin de la pieza A sera el que se muestra a
continuacin:
UdG
123
Captulo 5. Diseo
124
EPS
UdG
125
Captulo 5. Diseo
Se encuentra como conector ocupado dentro de la pieza a la que pertenece, es decir que est
ensamblado a otro u otros conectores.
Se encuentra conectado solo a conectores (uno o ms) de tipo segmento. Hay que recordar
que el Cylindrical Hole (ver Captulo 2. Piezas y conectores Lego) puede ensamblar con
conectores de tipo Stud, que es un conector de tipo puntual (ver apartado 5.4.4 Verificacin
de compatibilidad entre conectores) y ste no posee la propiedad de deslizamiento.
Una vez seleccionado uno de los conectores que cumplen tales condiciones, ya tenemos al conector
a deslizar CD y por lo tanto podremos pasar al siguiente paso.
Paso 2 Captura del deslizamiento. Debido a que el deslizamiento es una traslacin en el eje Z del
conector y a que el usuario la lleva a cabo mediante el ratn o el teclado (ver Captulo 6.
Implementacin), deberemos capturar la traslacin de tal forma que se aplique en dicho eje.
Supongamos que la traslacin a aplicar para deslizar el conector CD es la formada por el vector
T =( F-I ) y el centro del conector CD es CC (ver Figura 5.45).
F
T
I
CC
126
EPS
Como se puede comprobar el vector d es el que nos marca la direccin de la traslacin, que es la
direccin del eje Z del conector CD. As pues, partiendo del esquema de la Figura 5.45, la traslacin
T a aplicar en la direccin del eje Z del conector sera:
T = d ||T|| cos( )
0
donde d = C2W * 0
1
.
cos( ) =
|| T ||
Substituyendo en la frmula anterior de la traslacin el valor del coseno, tendremos que la traslacin
final a aplicar para deslizar el conector en su eje Z sera la siguiente:
T =d(T d)
Paso 3 Comunicacin del deslizamiento. Todo conector posee un mtodo virtual que le permite
deslizarse. Tal mtodo, en el caso de un conector de tipo puntual no debe ser implementado debido a
que no pueden deslizarse, pero para uno de tipo segmento si, ya que estos ltimos si que pueden
llevar a cabo dicho proceso. El motivo de que este mtodo sea virtual con una implementacin base
que no lleve a cabo ningn tipo de operacin y no virtual puro, sin implementacin base, se debe a
que todo conector debe tener accesible tal mtodo sea cual sea su tipologa. En el caso de los
conectores de tipo Puntual no se llevar a cabo ninguna operacin y por el contrario en los
conectores de tipo segmento si, ya que reimplementan dicho mtodo.
Conector
virtual deslizar(Vector T)
127
Captulo 5. Diseo
Segmento
deslizar(Vector T)
activarModoDeslizar(); //deslizando=true;
if(existeHermano) hermano.activarModoDeslizar();
madre.comunicarTraslacion(T);
madre.piezasNoVisitadas();
desactivarModoDeslizar();
if(existeHermano) hermano desactivarModoDeslizar();
A continuacin el conector CD informar a la pieza a la que pertenece que debe deslizarse. Como se
puede comprobar se ha utilizado el mismo mtodo y por lo tanto proceso que el utilizado para la
comunicacin de la traslacin de piezas ensambladas para deslizar a la pieza perteneciente al
conector CD. El motivo es muy sencillo: un deslizamiento no es ms que una traslacin en el eje Z
de un determinado conector, con lo que a partir de este punto el proceso continuara igual que el
descrito en el de comunicacin de la traslacin de piezas ensambladas (ver apartado 5.6.2
Comunicacin de la traslacin).
En estos momentos si que se puede comprender mejor la restriccin que todo conector de tipo
segmento pone en su mtodo comunicarTraslacionConector(T), que es l mtodo que utiliza
la pieza para propagar una comunicacin de futura traslacin a travs de sus conectores ocupados.
Segmento
comunicarTraslacionConector(Vector T)
if(not deslizando) Conector::comunicarTraslacionConector(T);
128
EPS
todas las piezas participantes en el proceso de deslizamiento para as no perder las conexiones en
futuros procesos de traslacin, rotacin y deslizamiento.
Cabe destacar del proceso de comunicacin del deslizamiento, que al igual que en la comunicacin
de la traslacin de piezas ensambladas (ver apartado 5.6.2 Comunicacin de la traslacin) se ha
llevado a cabo gestin de colisiones una vez decidido, por parte del usuario, el deslizamiento a
aplicar. Debido a que la comunicacin del deslizamiento utiliza los mismos mtodos que la
comunicacin de la traslacin, la deteccin de colisiones es tambin la misma (para ms
informacin acerca de la deteccin de colisiones ver el Captulo 7. Implementacin).
Paso 4 Propagacin del assembling. La propagacin se llevara a cabo entre la parte dinmica,
que en este caso estara formada por la pieza a la que pertenece el conector a deslizar y las
conectadas a ella, tanto directa como indirectamente, y la parte esttica, formada por el resto de la
escena (ver apartado 5.1.1 Definiciones tiles). Con esto lo que conseguimos es recalcular las
conexiones entre la parte dinmica y el resto del modelo en construccin, ya que hay que entender
que en el proceso de deslizamiento se pueden crear y destruir conexiones entre conectores (variar la
lista de conectores conectados de los mismos), as como la actualizacin del contenido de las listas
de conectores libres y ocupados de las piezas, como consecuencia de la propia creacin y
destruccin de assemblings (ver Figura 5.46). hay que dejar bien claro que este proceso de
propagacin de debe realizar una vez se ha aplicado la transformacin, en este caso, el
deslizamiento, ya que es despus de la aplicacin de dicha transformacin cuando se habrn
efectuado los cambios de posciones en las piezas afectadas y no en el proceso de comunicacin.
UdG
129
Captulo 5. Diseo
La opcin de deslizamiento es muy til, ya que debido a que el assembling entre conectores de tipo
segmento se puede realizar nica y exclusivamente mediante los extremos de los mismos, ser utilizando
esta propiedad que posicionaremos a los conectores en el lugar deseado. Hay que destacar que en el caso
del Cylindrical Hole no hara falta el proceso de deslizamiento ya que pueden deslizarse libremente sobre
conectores de tipo Axle si se trasladan en su eje Z, pero en el caso de los Axle Hole, el deslizamiento es la
nica forma de posicionarlos en el lugar adecuado, ya el Axle Hole no puede deslizarse sobre un conector
de tipo Axle trasladndose en la direccin de su eje Z, tal y como lo hacen los Cylindrical Holes.
5.6
Una vez llevado a cabo uno de los tres procesos de comunicacin de transformaciones sobre una pieza
ensamblada a otra u otras, se deber aplicar dicha transformacin. Para ello, tanto la clase Pieza como la
clase Conector nos proporcionan unos mtodos. Veamos pues, como se producira la transformacin
previamente comunicada:
Pieza
transformar()
Conector ocupado;
if(not visitada)
{
visitada=true;
if(transformada) P2W=transformacin*P2W;
transformada=false;
transformacin=identidad();
for each ocupado in conectoresOcupados do
{
ocupado.transformarConector();
}
}
130
EPS
Conector
transformarConector()
Conector actual;
transformar()
madre.transformar();
Los conectores ocupados de la pieza actuarn comunicando a cada uno de los conectados a ellos, que
deben, a su vez, propagar la transformacin 1 .Cada uno de los conectados comunicar a la pieza a la
que pertenece, que debe llevar a cabo el proceso de transformacin
UdG
131
Captulo 5. Diseo
La pieza A recibe el mensaje de transformacin, modifica su estado a visitada para evitar posteriores
llamadas al mismo mtodo y se le aplicar la translacin previamente comunicada. A continuacin vuelve
a modificar el flag que nos indica de la aplicacin o no de la transformacin a falso a la vez que la matriz
de transformacin a aplicar pasa a ser la matriz identidad. A continucacin propaga la transformacin a
sus dos conectores ocupados: el A3 y el A4. El A3 le comunica a su conectado, el B2, que debe propagar
la transformacin. ste ltimo informa a la pieza B, que es a la que pertenece, que comprube si debe
transformarse. La pieza B lleva a cabo los mismos pasos que los descritos para la pieza A, para acabar
propagando la transformacin mediante sus conectores ocupados. El conector B2 recibe el mensaje y se
lo comunica al A3, su nico conectado. ste a su vez informa a la pieza A. Tal pieza no lleva a cabo
ningn tipo de proceso, puesto que ya ha sido visitada con anterioridad.
La pieza A contina propagando la tranformacin mediante el otro conector ocupado que le falta por
propagar: el A4. El conector A4 comunica al conector C1 que debe informar a la pieza a la que pertenece,
la C, que le informe del proceso de transformacin. sta lleba a cabo todos los pasos descritos,
anteriormente, para la pieza A y comunica a sus conectores ocupados que deben propagar la
transformacin. El conector C1 recibe el mensaje y lo propaga a su conectado: el conector A4. ste
informa a la pieza A, pero esta no lleba a cabo ningn tipo de opracin, ya que fue visitada con
anterioridad.
Hay que destacar que una vez finalizado este proceso se deben volver a poner los flags que nos informan
del estado de la pieza (visitada o no visitada) a su valor por defecto, es decir, a no visitada.
132
EPS
5.7
Otros
1
desconectar()
desconectarConector(Conector con)
Conector conActual;
conectados.Esborrar(con);
if(libre())
{
madre.introducirConectorLibre(this);
}
if(not ocupado())
{
madre.borrarConectorOcupado(this);
}
madre.borrarConectorOcupado(this);
madre.introducirConectorLibre(this);
Para desconectar un cierto conector CD ocupado de una determinada pieza hay que:
1
Actualizar las listas de conectores libres y ocupados de la pieza a la que pertenece CD , es decir,
PD . Esta actualizacin consistir en eliminar de la lista de conectores ocupados a CD e introducir
como conector libre a dicho conector (para ms informacin acerca de los posibles estados de un
conector ver el Captulo 2. Piezas y conectores Lego).
UdG
133
Captulo 5. Diseo
PD
CD
PC
CC
Pieza 3005
Pieza 3622
Figura 5.47. Esquema de una desconexin de un conector de tipo Stud Inlet. Vista lateral.
desconectar()
Conector conActual;
for each conActual in conectoresOcupados do
{
conActual.desconectar();
}
134
EPS
Pieza 3005
Pieza 3004
Pieza 3004
5.8
Parser
El parser es aqul mdulo encargado de la lectura del contenido de los ficheros LCI (ver Anexo 6. Piezas
LCI y Anexo 2. Formato, sintaxis y semntica de los ficheros LCI). Tal rutina se encarga de crear lo que
se ha llamado un diccionario (ver Anexo 9. Clase diccionario) con la informacin asociada a cada
conector dentro del fichero LCI correspondiente. El diccionario no es ms que una estructura de datos
funcional en el que la clave es uno de los tags que puede tener todo conector (ver Anexo 2. Formato,
sintaxis y semntica de los ficheros LCI) y el contenido es el conjunto de caracteres formado por la
informacin asociada a dicho tag (ver Figura 5.49).
UdG
135
Captulo 5. Diseo
<connector>
<name>stud</name>
<matrix>1 0 0 0 0 1 0 0 0 0 1
</connector>
<connector>
<name>studInlet</name>
<matrix>1 0 0 0 0 1 0 0 0 0 1
</connector>
<connector>
<name>cylindricalHole</name>
<matrix>-1 0 0 0 0 0 1 0 0 -1
<parameters>
<lenght>10</lenght>
<id>0</id>
<brother>1</brother>
</parameters>
</connector>
<connector>
<name>cylindricalHole</name>
<matrix>1 0 0 0 0 0 -1 0 0 -1
<parameters>
<lenght>10</lenght>
<id>1</id>
<brother>0</brother>
</parameters>
</connector>
0 0 0 0 1</matrix>
0 0 24 0 1</matrix>
0 0 0 10 10 1</matrix>
0 0 0 10 -10 1</matrix>
Diccionario
<name>
stud
<matrix>
1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
Diccionario
<name>
studInlet
<matrix>
1 0 0 0 0 1 0 0 0 0 1 0 0 24 0 1
Diccionario
<name>
cylindricalHole
<matrix>
1 0 0 0 0 1 0 0 0 0 1 0 0 24 0 1
<lenght>
10
<id>
<brother>
Diccionario
<name>
cylindricalHole
<matrix>
1 0 0 0 0 0 -1 0 0 -1 0 0 0 10 -10 1
<lenght>
10
<id>
<brother>
Figura 5.49. Fichero 6541.lci y esquema de los diccionarios creados para cada conector.
136
EPS
Una vez creado el diccionario con la informacin del conector actual, ser el momento de realizar la
instancia del conector con dicha informacin. Ser el propio conector que decidir que informacin
utiliza, dependiendo del tipo que sea.
Conector
virtual init(Diccionario d)
La clase abstracta Conector posee un mtodo virtual que se encarga de inicializar la parte comn a todo
conector con la informacin del diccionario. Esta parte comn es la que corresponde al tag <name>, que
nos informa de la tipologa del conector, y al tag <matrix>, que nos permite conocer la matriz de
transformacin 3D del conector.
Con esto tenemos que los conecotres de tipo puntual no debern implementar el mtodo de inicializacin
de todo conector, ya que esta tipologa de conectores solo necesitan del tipo y de la matriz de
transformacin 3D para inicializarse. Adems conseguimos que si en el diccionario hubiera ms
informacin de la que corresponde al tipo de conector a inicializar (por ejemplo introducirle parmetros a
un conector de tipo puntual), l mismo la ignorara.
Por lo que concierne a los conectores de tipo segmento, intentarn buscar la informacin referente a los
tags <name>, <matrix>, y dentro de <parameters> la informacin del tag <lenght> y en el caso de
que tenga hermano el conector, el contenido de los tags <id> y <brother>.
Segmento
init(Diccionario d)
Tag t1("<lenght>"),t2("<id>"),t3("<brother>");
Conector::init();
longitud=leerNumeroParametro(d,t1);
if(d.Existe(t2))
{
idLCI=leerNumeroParametro(d,t2);
idHermanoLCI=leerNumeroParametro(d,t3);
existeHermano=true;
}
else existeHermano=false;
UdG
137
Captulo 5. Diseo
Para ello solo debern volver a implementar el mtodo de inicializacin de la informacin del conector
realizando una llamada al mismo mtodo, pero de la clase Conector, para inicializar la parte comn a todo
conector independientemente de la tipologa a la que pertenezcan. Una vez hecho esto, deber inicializar
la parte de informacin exclusiva a todo conector de tipo segmento. sta es: la longitud y los
identificadores tanto del propio conector a inicializar como el de su hermano, en caso de tener.
As pues tenemos que el proceso de parseo de los ficheros LCI, los cuales contienen toda la informacin
referente a los conectores de una determinada pieza, es el que se muestra a continuacin:
138
EPS
'
*'
UdG
140
IMPLEMENTACIN
Dentro de este captulo se pretende profundizar en los aspectos de diseo ms relevantes, con la
implementacin llevada a cabo para ello. Cabe destacar que no se ha pretendido llegar al cdigo final
implementado, ya que para tales efectos tenemos el manual tcnico del proyecto. As pues, este captulo
pretende ser una ampliacin de ciertos aspectos del captulo de diseo que en se no son idispensables
para su comprensin.
6.1
Assembling
Conector conectorCercano(Recta r)
Conector conector,cercano;
double distmin,aux;
conLibres.Primero();
if(not conLibres.Fin())
{
conector=conLibres.Actual();
cercano=conector;
distmin=cercano.distanciaMinima2(r);
conLibres.Siguiente();
while(not conLibres.Fin())
{
conector=conLibres.Actual();
aux=conector.distanciaMinima2(linea);
if(aux<distmin)
{
distmin=aux;
cercano=conector;
}
conLibres.Siguiente();
}
}
return cercano;
UdG
141
Captulo 6. Implementacin
Como se puede comprobar solo hace falta calcular las distancia entre la recta r y la posicin de los
conectores libres de la pieza.El conector seleccionado para participar en el proceso de assembling ser
aqul que posea la distancia al cuadrado menor entre l y la recta r. Este clculo lo realiza el propio
conector mediante el mtodo distanciaMinima2(Recta r). Recordar que la utilizacin de la
distancia al cuadrado (ver Anexo 7. Distancia Punto Recta) se debe a motivos de practicidad.
Para conocer la informacin base acerca de la seleccin de conectores para ensamblar ver el captulo de
diseo de esta memoria.
Conector
En las clases Stud, Stud Inlet, Axle, Axle Hole y Cylindrical Hole se implementar dicho mtodo de
verificacin de compatibilidad entre conectores de diferentes formas, dependiendo de cada tipo de
conector.
Stud
Como ya habamos visto en el captulo de diseo, los conectores de tipo Stud son compatibles, para
ensamblar, con los conectores de tipo Stud Inlet y con los de tipo Cylindrical Hole.
142
EPS
Stud Inlet
Por otro lado, los conectores de tipo Stud Inlet nicamente pueden conectarse con conectores de tipo
Stud.
Axle
Para el caso de los de tipo Axle, tos pueden ensamblar tanto con los conectores de tipo Axle Hole como
con los de tipo Cylindrical Hole.
Axle Hole
Un conector perteneciente a la tipologa de conector Axle Hole podr ensamblar nicamente con los
conectores de tipo Axle.
UdG
143
Captulo 6. Implementacin
Cylindrical Hole
En el caso de los Cylindrical Hole, slo podrn ensamblar con conectores pertenecientes a las categoras
Stud o Axle.
144
EPS
Conector
normalEstatico.normalizar();
normalDinamico.normalizar();
productoVectorial=normalDinamco X normalEstatico;
productoVectorial.normalizar();
normaProductoVectorial=productoVectorial.norma();
productoEscalar=normalDinamico*normalEstatico;
angulo=angulo(normaProductoVectorial,productoEscalar);
resultado=formulaRodrigues(productoVectorial,angulo);
return resultado;
Los pasos a seguir por el mtodo son (ver Captulo 5. Diseo apartado 5.3.6 Realizacin del assembling):
1
Obtener las normales del conector esttico y dinmico en coordenadas de mundo. Normalizar
ambas.
Obtener el producto vectorial entre la normal del conector esttico y dinmico. Con ello
obtenemos un vector perpendicular a las dos.
Calcular la norma del producto vectorial y el producto escalar de las normales de los dos
conectores. Con estos dos elementos podremos calcular el ngulo entre ambas.
Con el vector producto vectorial, el ngulo entre las normales de los conectores y la frmula de
Rodrigues (ver Anexo 5. Rotaciones y frmula de Rodrigues), podremos pasar la rotacin de su
forma vectorial a su forma matricial.
UdG
145
Captulo 6. Implementacin
Con todos estos pasos tendremos la matriz que se le deber aplicar a la pieza dinmica y a las conectadas
a ella para que las normales de los conectores esttico y dinmico coincidan (ver Figura 6.1)
w
ND
NS
PS
ND
CD
CS
Pieza 3005
Figura 6.45.
Pieza 3004
Pieza 3005
Figura 6.1. Esquema de coincidencia de normales del conector esttico y el conector dinmico. Vista lateral.
Conector
Simplemente hay que obtener las posiciones del conector esttico y dinmico en coordenadas de mundo y
restar la posicin inicial de la final, que en este coso corresponden a la posicin del conector dinmico y a
la del conector esttico respectivamente.
146
EPS
UdG
147
Captulo 6. Implementacin
Y
Y
ND
w
NS
X
Figura 6.2. Pieza 32064 con un
conector de tipo AxleHole.
X
Figura 6.3. Pieza 3704 con un conector
de tipo Axle.
PS
Pieza 32064
Pieza 3704
PD
Figura 6.4. Piezas dinmica PD y esttica PS antes de aplicarles el paso de C de assembling.
PASO D. ACOMODAR LOS CONECTORES.
Tal y como se ha explicado en el captulo de diseo (ver Captulo 5.Diseo) de la memoria existen casos
en los que hay que acomodar los dos conectores a ensamblar. Para ello en la clase Segmento existe un
mtodo que nos permite acomodar dos conectores. La primera tarea del mismo es comprobar cual de los
dos conectores que pretenden ensamblar posee una longitud libre menor, a partir de su extremo. Una vez
seleccionada tal longitud libre procedemos a preguntar al conector a que tipologia pertenece. Esto solo
influye en el caso de que el conector esttico sea un conector de tipo Axle, ya que estos poseen el eje de
assembling (eje Z en coordenadas de conector), hacia fuera del cuerpo del conector (ver Captulo 5.
Diseo apartado 5.1.3 Sistema de referencia de los conectores) y nosotros pretendemos acomodar la pieza
del conector dinmico hacia el interior del conector esttico, que en este caso es un conector de tipo Axle.
148
EPS
Para acabar de determinar la traslacin para acomodar los conectores hay que convertirla a coordenadas
de mundo (ver Captulo 5. Diseo apartado 5.1.2 Sistemas de referencia del conector, de la pieza y del
mundo) para obtener el vector a aplicar a la pieza dinmica y a las conectadas a ella, tanto directa como
indirectamente, para que el conector dinmico y esttico encajen.
Segmento
149
Captulo 6. Implementacin
Conector
Como se puede observar, en el mtodo que lleva a cabo la implementacin de esta condicin, no se ha
utilizado el operador de igualdad clsico, sin que se ha llevado a cabo mediante la utilizacin de un
mtodo que permite un cierto error
para considerar que dos vectores son el mismo (ver apartado 6.5
Robustez).
bool iguales(Vector v1,Vector v2)
Vector diferencia;
float distancia;
diferencia=v1-v2;
distancia=diferencia.modulo();
return (distancia<= );
Para ello, bastar calcular el mdulo del vector diferencia, en este caso el vector diferencia entre ambas
normales, para comprobar si es menor o igual que el margen de error que permitimos para considerarlas
iguales.
El motivo de utilizar este mtodo de igualdad en vez de la utilizacin del operador de igualdad
tradicional, =,se debe a motivos de robustez en la utilizacin de nmeros en coma flotante (ver apartado
6.5 Robustez).
150
EPS
Para ello bastar con calcular el mdulo del vector resultante de restar la posicin, en coordenadas de
mundo (ver Captulo 5. Diseo apartado 5.1.2 Sistemas de referencia del conector, de la pieza y del
mundo), de un conector a la del otro. Si dicho mdulo es ms pequeo o igual que el error permitido
entonces podremos decir que ambos conectores se encuentran en la misma posicin. En caso contrario las
posiciones de los conectores no coincidirn. Todas estas operaciones son llevadas a cabo por el mtodo
bool iguales(Vector v1,Vector v2) expuesto en la condicin anterior.
CONDICIN C. LONGITUD LIBRE CYLINDRICAL HOLE >= LONGITUD STUD.
Esta condicin se exige cuando se intenta buscar una conexin secundaria entre un conector de tipo Stud
y otro de tipo Cylindrical Hole (ver Captulo 2. Piezas y conectores Lego) y se basa en comprobar si la
longitud libre de este ltimo es, como mnimo, igual a la del Stud. Tal comprobacin es trivial, ya que la
longitud libre de un conector de tipo Stud es constante y, por lo tanto, todo depende de la longitud libre
del Cylindrical Hole. Pero cmo se determina la longitud libre no slo de un conector de tipo Cylindrical
Hole, sino de todo conector de tipo segmento? Veamos la manera en que se ha calculado tal longitud libre
para los conectores de tipo segmento.
UdG
151
Captulo 6. Implementacin
Segmento
float obtenerLongitudLibre()
Conector actual;
Vector pos,posActual;
float distMin,aux;
if(conectados.Vacia()) return longitud;
else if(libre())
{
pos=obtenerPosicionC2W();
conectados.Primero();
actual=conectados.Actual();
posActual=actual.obtenerC2W();
distMin=distanciaPuntos(pos,posActual);
conectados.Siguiente();
while(not conectados.Fin())
{
actual=conectados.Actual();
posActual=actual.obtenerPosicionC2W();
aux=distanciaPuntos(pos,posActual);
if(aux<distMin) distMin=aux;
conectados.Siguiente();
}
return distMin;
}
else return 0;
Si el conector de tipo segmento no se encuentra conectado a ningn conector, la longitud libre del mismo
ser su propia longitud. Si tiene algn conector conectado a l, primero comprobaremos si se encuentra
libre, es decir, si su extremo no se encuentra ocupado. Si el extremo del conector se encuentra ocupado
entonces la longitud libre ser nula, en caso contrario se deber calcular la distancia mnima entre las
distancias del extremo del conector y cada uno de los conectores conectados a l (ver Figura 6.5).
longitud C1
distancia libre C1
longitud C2
distancia libre C2
152
EPS
CONDICIN D. COAXIALIDAD.
Dos conectores son coaxiales si el eje de assembling, el eje Z en coordenadas de conector (ver Captulo 5.
Diseo apartado 5.1.2 Sistemas de referencia del conector, de la pieza y del mundo), de ambos coincide.
Para su comprobacin creamos una recta r con los puntos iniciales y finales de uno de los dos conectores
sobre los que se pretende comprobar su coaxialidad, para acabar calculando la distancia entre el punto
inicial del otro conector y la propia recta r. Si la distancia entre la recta y el punto es nula entonces
diremos que ambos son coaxiales, en caso contrario no.
Al igual que en las condiciones anteriores, se permite un cierto error para decidir la coaxialidad entre
conectores, o lo que es lo mismo, un cierto error para considerar la distancia entre la recta r y el punto
inicial del conector que no forma dicha recta nula o no nula (ver apartado 6.5 Robustez).
Conector
UdG
153
Captulo 6. Implementacin
Segmento
Tal y como se puede observar, debemos comprobar que el conector con no se encuentra en el mismo
lugar que alguno de los conectores conectados al conector del que se realiza la llamada a este mtodo.
Para ello debemos comprobar si alguno de los conectados coinciden con el conector con. Si es as no har
falta continuar buscando, ya que con encontrar una superposicin es suficiente.
Una vez finalizado el mtodo, por coincidencia con algn conectado o por no coincidencia con ninguno,
se proceder a devolver el valor correspondiente. ste es: cierto en caso de que no se produzcan
superposiciones entre el conector y con (condicin cumplida) y falso en caso contrario (condicin no
cumplida).
154
EPS
Como se puede observar, solo es necesario comprobar el ngulo entre ambos conectores, mtodo que nos
devolver el mnimo ngulo entre el eje X de un conector con los X, -X, Y y Y del otro. Si el ngulo es
uno de los que provoca el assembling en forma de cruz, entonces podremos dar como vlida esta
condicin. En caso contrario no (ver Figura 6.6).
UdG
155
Captulo 6. Implementacin
Segmento
Para comprobar el mnimo ngulo simplemente hay que calcular cul es el menor ngulo entre el eje X
del conector pasado como parmetro y los ejes X, -X, Y y Y del conector al que se le llama este mtodo.
Para ello basta con calcular el ngulo entre cada una de la cuatro combinaciones de los ejes y devolver el
mnimo de ellos.
6.2
En este apartado se va a ampliar cierta informacin que se ha explicado en el captulo anterior de diseo
respecto a la comunicacin de transformaciones a realizar sobre piezas ensambladas. En particular, se va
a ampliar nicamente las explicaciones de la comunicacin de la traslacin y del deslizamiento realizadas
en el captulo anterior (ver Captulo 5. Diseo).
156
EPS
Obtener la matriz W2C, que nos permite transformar de coordenadas de mundo a coordenadas
de conector. Tal matriz es la inversa de la C2W, que es la que nos permite trasnformar las
coordenadas de conector a las de mundo.
Aplicar la matriz W2C al vector traslacin t, para obtener dicha traslacin en coordenadas de
conector.
bool moverEjeZ(Vector t)
Matrix C2W,W2C;
Vector traslacion,Z+,Z-;
Z+=(0,0,1);
Z-=(0,0,-1);
C2W=obtenerC2W();
W2C=C2W.inversa();
traslacion=t;
traslacion=W2C*traslacion;
traslacion.normalizar();
Como se puede apreciar, el mtodo que se encarga de verificar si la traslacin se realiza en el eje Z del
conector, se encuentra en la clase Cylindrical Hole, ya que es la nica que lo necesita.
UdG
157
Captulo 6. Implementacin
Conector conectorCercanoDeslizar(Recta r)
Conector actual,cercano;
float aux,distMin;
ListaConectores deslizan;
if(conectoresOcupados.Vacia()) return NULL;
else
{
conectoresOcupados.Primero();
while(not conectoresOcupados.Fin())
{
actual=conectoresOcupados.Actual();
if(actual.puedeDeslizar()) deslizan.Introducir(actual);
conectoresOcupados.Siguiente();
}
if(deslizan.Vacia()) return NULL;
else
{
actual=deslizan.Actual();
cercano=actual;
distMin=cercano.distanciaMinima2(r);
deslizan.Siguiente();
while(not deslizan.Fin())
{
actual=deslizan.Actual();
aux=actual.distanciaMinima2(r);
if(aux<distMin)
{
distMin=aux;
cercano=actual;
}
deslizan.Siguiente();
}
return cercano;
}
}
158
EPS
Veamos con un poco ms de rigor las acciones llevadas por el mtodo de la pieza que detecta
el conector ms cercano a la recta r para deslizar. Primero se crea un a lista de los conectores
que pueden deslizar. Un conector podr deslizar si cumple las popiedrades descritas
anteriormente y en el captulo de diseo. Tales propiedades se plasman en la implementacin
de la siguiente forma:
Conector
En la clase Conector se ha creado un mtodo virtual puro [10]. Tal y como antes se ha
explicado los conectores de tipo puntual no pueden deslizarse, as la implementacin que se
lleva a cabo de ste mtodo por parte de la clase Puntual es simple: debe devolver siempre
falso.
Puntual
bool puedeDeslizar()
return false;
Por contra para los conectores de tipo segmento la implementacin del mtodo sera la que se
muestra a continuacin:
Segmento
bool puedeDeslizar()
Conector actual;
bool desliza=false;
conectados.Primero();
while(not conectados.Fin() and not desliza)
{
actual=conectados.Actual();
if(actual.obtenerNombre()==(axle,axleHole,cylindricalHole))
{
desliza=true;
}
else conectados.Siguiente();
}
return desliza;
UdG
159
Captulo 6. Implementacin
Captura del deslizamiento. Para capturar el deslizamiento realizado por el usuario a travs
del ratn o teclado del ordenador, debemos realizar los clculo necesarios para que la traslacin
realizada se pueda aplicar en el eje de deslizamiento (eje Z del conector). Tal y como se ha
explicado en el captulo de diseo la traslacin a llevar a cabo ser la siguiente:
T =d(T d)
donde
0
d = C2W * 0
1
. . .
Conector conectorDeslizar;
Matrix C2W;
Vector traslacionDeslizar,direccion;
// Obtenemos el conector a deslizar
// r es la recta creada por el propio LeoCAD
// piezaSeleccionada la pieza a deslizar por el usuario
conectorDeslizar=piezaSeleccionada.conectorCercanoDeslizar(r);
if(conectorDeslizar NULL) //Tenemos conector para deslizar
{
C2W=conectorDeslizar.obtenerC2W();
direccion=(0,0,1);
direccion=C2W*direccion;
}
. . .
160
EPS
Como se puede observar primero obtenemos el conector a deslizar de la pieza que pretende a
su vez deslizar el usuario. Una vez hecho, si tenemos conector en disposicin de deslizarse
realizaremos tres pasos:
1
Obtener el vector que nos informa de la direccin de deslizamiento (eje Z del conector)
en coordenadas de mundo (ver Captulo 5. Diseo apartado 5.1.2 Sistemas de
referencia del conector, de la pieza y del mundo).
Obtener el producto escalar entre el vector traslacin realizado por el usuario y el vector
direccin.
Finalmente habr que obtener el valor de producto del producto escalar anterior y el
vector direccin. Con todo esto tendremos la traslacin a aplicar a la pieza a la que
pertenece el conector a deslizar, para que se deslize.
6.3
Deteccin de colisiones
Para detectar colisiones en la traslacin o deslizamiento donde intervengan conectores de tipo Cylindrical
Holes (recordar que, tal y como se ha dicho en el captulo anterior, son ellos los que deben decidir que
hacer, es decir, si chocan o no con otros conectores) hay que:
1
P3
P1
A1
A2
AH1
AH2
CH1
CH2
dcolision
Figura 6.7. Esquema de posible colisin en la traslacin de conectores Cylindrical Holes.
UdG
161
Captulo 6. Implementacin
Dividir dicha lista de conectores Lcolisiones en dos: Una donde tendremos a los conectores que se
encuentran conectados a la pieza que pertenece el Cylindrical Hole, tanto de una forma directa
como indirecta, y otra donde tendremos al resto de conectores. A la primera lista la llamaremos
lista de conectores dinmicos Ldinmicos y a la segunda lista la llamaremos lista de conectores
estticos Lestticos. En el caso de la Figura 6.7 Ldinmicos=[ CH1, CH2 ] y Lestticos=[ AH1, AH2 ] y en
el caso de la Figura 6.8 Ldinmicos=[ CH1 , CH2, CH3, CH4 ] y Lestticos=[ AH1, AH2 ].
P4
AH1
P3
P1
P5
A1
CH3
AH2
P2
A2
CH4
CH1 CH2
dcolision
P2 a trasladar
Figura 6.8. Esquema de colisin en la traslacin de un Cylindrical Hole que tiene conectado
indirectamente, a la pieza a la que pertenecen, otros Cylindricals Holes.
3
Ahora solo har falta calcular la distancia mnima de todas las distancias de cada par de
conectores dmin(Ldinmicos, Lestticos) (ver Figura 6.9).
P4
P5
A1
AH1
P3
CH3
AH2
d1
d2
d3
d4
d5
d6
d7
P2
A2
CH4
CH1 CH2
d8
Figura 6.9. Esquema del clculo de la distancia dcolision de traslacin.
Una vez realizados estos tres pasos, el Cylindrical Hole podr determinar si la distancia de colisin dcolision
es o no nula y con que conector colisiona en caso de hacerlo.
162
EPS
Tambin habra que aclarar un ltimo aspecto. Tal y como se ha comentado en el Captulo 2. Piezas y
conectores Lego de la memoria, hay conectores de tipo segmento con y sin hermanos. La deteccin de
colisiones tambin tiene en cuenta este ltimo caso ya que se incluye en la lista de posibles conectores a
colisionar Lcolisiones, el extremo de los conectores de tipo segmento sin hermanos, con lo cual, la deteccin
de colisiones podr solucionar problemas como el de la Figura 6.10, donde el Cylindrical Hole2
colisionaria con el extremo del conector de tipo Axle, que en este caso no tiene hermano. As pues, en el
momento en que la dcolision==0, el extremo del Axle colisionara con el CH2 y entonces el propio CH2
comenzara a propagar la traslacin o deslizamiento hacia el conector de colisin, en este caso el Axle
mediante su extremo. Mientras la dcolision>0, la pieza que posee a los Cylindrical Holes, permanecera
quieta sin propagar la traslacin deslizndose, pero recalculando las conexiones.
P1 a trasladar
P2
A
P1
CH2
dcolision
Figura 6.10. Esquema de colisin de Cylindrical Holes con el extremo de un conector sin hermano.
Vemos pues el cdigo utilizado para llevar a cabo esta deteccin de colisiones.
Tal y como se mostraba en el captulo de diseo de la memoria el mtodo que se encargaba del clculo de
la distancia de colision era el mtodo float distanciaColision(int direccion). Vemos pues,
como opera para llevar en prctica la teora explicada. Observar que la numeracin al lado del cdigo se
corresponde con las explicaciones anteriores.
UdG
163
Captulo 6. Implementacin
Segmento
colisiones.Siguiente();
}
dinamicos.Introducir(this);
dinamicos.Primero();
while(not dinamicos.Fin())
{
dinamico=dinamicos.Actual();
estaticos.Primero();
while(not estaticos.Fin())
{
estatico=estaticos.Actual();
distancias.Introducir(distanciaMinima(dinamico,estatico));
estaticos.Siguiente();
}
dinamicos.Siguiente();
}
if(distancias.Nelementos==0) return -1; //Seal de que no hay colisin.
else
{
distancias.Primero();
distMin=distancias.Actual();
distancias.Siguiente();
while(not distancias.Fin())
{
aux=distancias.Actual();
if(aux<distMin) distMin=aux;
distancias.Siguiente();
}
return distMin;
}
164
EPS
6.4
Parser
Tal y como se haba explicado en el captulo anterior (ver Captulo 5. Diseo apartado 5.8 Parser) el
parser es el mdulo que se encarga de la lectura de los ficheros LCI (ver Anexo 2. Formato, sintaxis y
semntica de los ficheros LCI). El proceso que sigue tal mdulo es el que se muestra en el siguiente
grfico ya presentado anteriormente.
UdG
165
Captulo 6. Implementacin
Pieza
166
EPS
. . .
if(tag==</id>)
{
//Si tiene el tag <id> tambin yiene el tag <brother>
linea=obtenerLineaConInformacion();
tag=detectarTag(linea);
if(tag==<brother>)
{
linea=obtenerLineaConInformacion();
idBrother=leerNumero();
c.introducirContenido(idBrother);
d.Introducir(t5,c);
linea=obtenerLineaConInformacion();
tag=detectarTag(linea);
if(tag==</brother>)
{
linea=obtenerLineaConInformacion();
tag=detectarTag(linea);
if(tag==</parameters>)
{
linea=obtenerLineaConInformacion();
tag=detectarTag(linea);
if(tag </connector>)
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1;
}
}
else
{
f.cerrar():
return -1; //Fallo sintctico
}
}
else if(tag </connector>)
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else if(tag==</connector>)
{
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}
. . .
UdG
167
Captulo 6. Implementacin
. . .
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
}
else
{
f.cerrar();
return -1; //Fallo sintctico
}
//Creamos la instancia del tipo de conectort que indica el fichero
//con la informacin introducida en el diccionario
crearConector(d); //Creamos la instancia del conector que indica el tipo
}
return 1; //Seal de que el parseo se llev a cabo sin herrores
}
Cabe destacar que una vez realizado el parseo de un determinado fichero LCI se deber proceder a la
bsqueda de hermanos dentro de una misma pieza, es decir, cada conector con hermano buscar a otro
conector, dentra de la misma pieza a la que pertenece, que posea el id que el primero tiene para su
hermano. Con esto tendremos que todos los conectores con relacin de hermandad con otro, se conocern
mtuamente en todo momento, lo cual es muy til para diversos aspectos de la aplicacin como la
propagacin del assembling y el deslizamiento (ver Captulo 5.Diseo).
168
EPS
6.5
Robustez
La robustez informtica podramos definirla como la caracterstica que hace que una cierta aplicacin sea
fuerte o robusta a posibles errores de precisin numrica. En nuestro caso no solo se ha intentado que el
programa desarrollado sea robusto en cuanto a posibles bugs en la implementacin, si no que se ha
intentado que la aplicacin sea tambin robusta respecto al tratamiento que las computadoras llevan a
cabo con los nmeros en coma flotante. ste tratamiento puede provocar que hasta una simple
comparacin entre dos nmeros en coma flotante, que tericamente debieran ser iguales, no lo sean
debido a la precisin con la que las computadoras procesan dicha tipologa de nmeros.
Durante todo este captulo se ha hecho incapi en la robustez en la implementacin de ciertos mtodos,
as pues veamos las medidas llevadas a cabo para evitar problemas de robustez al tratar con nmeros en
coma flotante.
La principal medida se ha basado en la sustitucin del operador de igualdad por un mtodo que
permita un cierto error
para determinar si dos elementos son iguales. Decimos elementos porque estae
tipo de mtodo se ha implementado tanto para vectores como para simples nmeros.
Para determinar si dos vectores son el mismo (por ejemplo para determinar si dos conectores se
encuentran en la misma posicin (x,y,z)) se ha llevado a cabo el clculo del mdulo del vector diferencia
entre ambos vectores para comprobar si dicho mdulo es menor o igual que el error que permitimos. Si es
as entonces consideraremos a ambos vectores iguales, en caso contrario no ya que la distancia entre
ambos vectores sera tan grande que no se debera a un error computacional.
bool iguales(Vector v1,Vector v2)
Vector diferencia;
float modulo;
diferencia=v1-v2;
modulo=diferencia.modulo();
return (iguales(modulo,0));
Para el caso de nmeros se ha realizado algo muy similar. Simplemente se ha calculado la distancia entre
los dos valores numricos a comprobar su igualdad. Una vez calculada, se comprueba si tal distancia es
igual o menor que el margen de error . Si es as diremos que ambos valores numricos son el mismo, en
caso contrario no.
bool iguales(float valor1,float valor2)
float diferencia;
diferencia=valor1-valor2;
if(diferencia<0) diferencia=-diferencia;
return (diferencia<= );
UdG
169
Captulo 6. Implementacin
Veamos a continuacin un ejemplo sencillo a la vez que explcito, donde se puede comprobar la
necesidad de rebestir a la aplicacin de un nivel ms de robustez.
EJEMPLO
Supongmos que conectamos al Stud1 y el Stud Inlet1 de la Figura 6.12. Como consecuencia de esta
conexin principal necesitamos propagar el assembling entre el Stud2 y el Stud Inlet2 (ver Captulo 5.
Diseo apartado 5.3.7 Propagacin del assembling).
Stud
Inlet1
Conexin principal
Stud1
Stud
Inlet2
Conexin secundaria
Stud2
Stud
Inlet1
Stud
Inlet2
Stud1
Stud2
Pieza 3004
Pieza 3004
Tal y como se ha comentado en anteriores apartados, para que se produzcan conexiones secundarias entre
un conector de tipo Stud y otro de tipo Stud Inlet deben cumplirse dos condiciones (ver Captulo 5.
Diseo apartado 5.3.7 Propagacin del assembling):
1
Igualdad de posiciones.
Igualdad de normales.
Ambos conectores, el Stud2 y el Stud Inlet2, deberan encontrarse en la misma posicin. Al obtener el
valor de la misma del Stud obtenemos el vector POSStud=(0,2.000904567, 0.500098704) y para el Stud
Inlet POSStudInlet =(0, 2.000935789, 0.500089954).
Si utilizamos el operador de igualdad obtendramos que los dos conectores no se encuentran en la misma
posicin, cuando realmente si que lo estn. Para solucionar tal problema bastar con utilizar el mtodo de
igualdad antes descrito.
170
EPS
6.6
Interfaz de usuario
En este apartado del captulo de implementacin se va a explicar la interfice que el usuario tiene a su
disposicin para poder llevar a cabo el proceso de assembling (ver Captulo 5. Diseo apartado 5.3
Assembling), as como otras caractersticas aadidas para facilitar la interaccin del mismo con la
aplicacin.
Para facilitar las tareas relacionadas con la opcin de assembling aadida al LeoCAD [1] se ha
implementado una barra de herramientas exclusiva para tales opciones (ver Figura 6.13). Durante todo
este apartado relacionado con la interfaz de usuario, se har referencia a ella de forma constante. Por este
motivo se recomienda al lector referenciarse a la Figura 6.13 en todo momento.
Deslizamiento de piezas
de la barra de
UdG
171
Captulo 6. Implementacin
Figura 6.14. Mensaje de error producido al instanciar una pieza inexistente en el directorio
LCI teniendo la opcin de assembling activada.
172
EPS
Para modificar el conector seleccionado solo har falta escoger otro conector, que podr ser tanto de la
misma como de otra pieza diferente y para anular la seleccin de los conectores, el usuario nicamente
deber clicar sobre una parte de la pantalla que se encuentre vaca, es decir, sin piezas a seleccionar.
Cabe comentar que todo conector seleccionado ser destacado mediante un smbolo con el fin de informar
al usuario cul es el conector seleccionado. El smbolo asociado a cada tipo de conector se muestra en la
Tabla 6.1.
Smbolo
Tipo de conector
Crculo
Cuadrado
Stud Inlet
Cruz
La primera forma es realizando un doble clic sobre uno de los dos conectores seleccionados
previamente. Hay que destacar que el conector sobre el que se realiza el doble cliqueo asumir el
papel de conector esttico y el otro conector el papel de conector dinmico (ver Captulo 5.
Diseo apartado 5.1.1 Definiciones tiles).
del
que viene provista la barra de herramientas de assembling aadida al LeoCAD [1] (ver Figura
6.13).
Una vez confirmado el assembling, si ste no puede llevarse a cabo porque los conectores no sean
compatibles (ver Captulo 5. Diseo apartado 5.3.4 Verificacin de compatibilidad entre conectores) o
porque exista un lazo o cadena entre ambos (ver Captulo 5. Diseo apartado 5.3.5 Evitar lazos y
cadenas), se informar al usuario con el siguiente mensaje:
173
Captulo 6. Implementacin
aparecer en el cursor del ratn el mismo smbolo y solo har falta clicar, con el botn izquierdo del
ratn, sobre el conector deseado. El conector seleccionado para desconectar ser destacado con su
correspondiente smbolo en color rojo (ver Figura 6.17).
Figura 6.18. Mensaje producido al intentar desconectar un conector libre, en la pieza del
cual no existen ms conectores ocupados.
174
EPS
de assembling (ver Figura 6.13) y seleccionar, mediante el botn izquierdo del ratn, la pieza a
desconectar. Inmediatamente esta pieza ser destacada para informar al usuario de que el proceso de
desconexin ha sido satisfactorio.
Si la pieza a desconectar no tiene ningn conector ocupado para desconectar, se infromar al usuario con
el correspondiente mensaje (ver Figura 6.19).
Figura 6.19. Mensaje producido al intentar desconectar una pieza sin conectores ocupados.
disponible en la
Ahora solo har falta deslizar la pieza. Tal deslizamiento se puede realizar de dos formas:
A
175
Captulo 6. Implementacin
opciones de assembling (ver Figura 6.13). Una vez presionado dicho botn aparecer un ventana como la
que a continuacin se muestra:
176
EPS
"
)'
)
"
)'
UdG
178
RESULTADOS Y CONCLUSIONES
7.1
Resultados obtenidos
Desde el inicio del proyecto los objetivos del mismo eran claros y concisos: intentar implantar en una
herramienta de CAD la posibilidad de ensamblar objetos los unos con los otros, sin obligar al usuario a
definir restricciones geomtricas sobre el modelo en construccin, sino seleccionando las partes de los
mismos, que por su naturaleza permiten llevar a cabo el proceso de assembling. Para ello se ha intentado
aprovechar la propia informacin que poseen los objetos para poder determinar que partes de ellos son los
encargados de realizar la conexin, y de que forma.
Partiendo de un CAD existente, el LeoCAD [2], el cual utiliza el sistema de ladrillos de Lego
proporcionado por el paquete LDraw (ver Captulo 3. LDraw) como objetos para modelar, se ha creado
una nueva versin del mismo donde se pueden ensamblar las piezas, mediante el concepto ms
importante del proyecto: sus conectores (ver Captulo 2. Piezas y conectores Lego). stos son los que
permiten ensamblar unas piezas con otras de formas especficas. Partiendo del concepto de conector y de
la identificacin de un subconjunto de ellos, para demostrar la posibilidad de llevar a cabo la conexin de
dos piezas sin la necesidad de definir restricciones geomtricas sobre las mismas, se ha llevado a cabo el
proceso de assembling.
Una vez finalizado el proyecto podemos demostrar como resultados ms importantes del mismo los
siguientes:
1
Identificacin de los pasos a seguir para ensamblar por cada par de conectores compatibles para
ello. Algunos de los pasos son comunes en los cuatro posibles assemblings diferenciados (Stud
Stud Inlet, Stud Cylindrical Hole, Axle Axle Hole y Axle Cylindrical Hole) y otros no.
Dos piezas ensambladas no pueden desconectarse si no se indica de forma explcita, es decir, una
vez conectadas permanecen ensambladas hasta que se proceda a su desconexin.
La rotacin y traslacin de una pieza ensamblada provoca la rotacin y traslacin de todas las
piezas conectadas a la misma, tanto de forma directa como indirecta.
UdG
179
Los conectores de tipo Cylindrical Hole (ver Captulo 2. Piezas y conectores Lego) ensamblados
a conectores de tipo Axle pueden trasladarse libremente sobre ellos si tal traslacin se lleva a
cabo sobre el eje principal de ambos (ver Figura 7.1).
Figura 7.1. Ejemplo de traslacin libre de conectores de tipo Cylindrical Hole sobre los
de tipo Axle y viceversa.
7
El deslizamiento es un proceso que permite a un conector de tipo segmento deslizarse sobre otro
del mismo tipo, para as situarse en la posicin deseada una vez realizado el assembling.
Recordar que el assembling de conectores segmento se puede realizar nicamente a travs de los
extremos, por lo que esta opcin es muy til para conectores de tipo Axle Hole , ya que debido a
las propiedades del assembling entre ellos y sus compatibles, los Axles, el deslizamiento es la
nica forma que poseen para situarse en otra parte del conector con el que ensamblan que no sea
su extremo (ver Figura 7.2).
180
EPS
La rotacin de piezas donde se vean implicados conectores de tipo Cylindrical Hole ensamblados
a conectores de tipo Axle o viceversa posee una propiedad especial: dichos conectores pueden
rotar de forma libre el uno sobre el otro, siempre y cuando la rotacin se lleve a cabo en el eje
principal de los mismos (ver Figura 7.3).
1
Figura 7.3. Secuencia de rotacin que muestra como el Axle puede rotar libremente sobre el
Cylindrical Hole y viceversa.
9
distancia
colisin
distancia
colisin
distancia
colisin
distancia
colisin
UdG
181
10 La colision entre dos conectores de tipo Cylindrical Hole tambin se producir pero con la
peculiaridad de que cuando uno colisione con el otro no movern a todo el resto del conjunto de
piezas conectadas hasta que uno de los dos choque con algn otro conector que no sea de tipo
Cylindrical Hole (ver Figura 7.5).
En el ejemplo de la Figura 7.5 la pieza verde, la
cual posee conectores de tipo Cylindrical Hole, al
trasladarse en la direccin especificada, empujara
a la pieza amarilla, ya que sta tambin posee
conectores de tipo Cylindrical Hole, hasta que sta
ltima colisionara con la pieza azul, que est
conectada a la pieza roja con Axles mediante Alxe
Figura 7.5. Ejemplos de colisin entre
conectores de tipo Cylindrical Hole.
11 Una vez realizado un modelo utilizando la opcin de assembling podemos guardar tal modelo
sin necesidad de aadir informacin extra en el fichero a guardar. Al cargar dicho fichero,
bastar con buscar conexiones secundarias entre todas las piezas de la escena para volver a tener
el modelo ensamblado.
12
Posibilidad de crear modelos complejos de forma mucho ms sencilla debido a la mejora que
supone el concepto de assembling y todo lo que se deriva de ello.
13 Se han creado una tipologia de ficheros denominados LCI (Lego Connectors Information) (ver
Anexo 2. Formato, sintaxis y semntica de los ficheros LCI) de donde se puede obtener toda la
informacin de los conectores asociada a una cierta pieza. Estos fichero han sido creados
utilizando el estndar XML [14].
14 Actualmente est disponible un web site con toda la informacin referente al proyecto del CAD
Mecnico para piezas Lego. Tal informacin consiste en el manual de usuario includo en este
proyecto, todos los elementos necesarios para la utilizacin del CAD (ejecutables, piezas
LCI), as como un completo ejemplo de creacin de un autombil. Cabe destacar que dicha
web y en consecuencia el CAD, se encuentran en uso por parte de toda la comunidad Lego.
182
EPS
7.2
Con la implementacin del proceso de assembling y todo lo que sello supone se ha conseguido:
1
Mejorar la ergonoma del CAD original. Ahora es mucho ms cmodo crear un modelo
medianamente complejo, debido a que no hace falta comprobar continuamente si la situacin de
las piezas es la deseada, ya que con el assembling entre ellas, podemos asegurar que las piezas
quedan situadas tal y como ocurrira empricamente en el montaje de un modelo Lego real (ver
Figura 7.6).
Simplificar el manejo del nuevo CAD como consecuencia de la similitud entre la interfaz
utilizada y la real para ensamblar piezas Lego. Con esto lo que conseguimos es que el proceso de
creacin de un modelo sea mucho ms intuitivo.
45min 37seg
15min 59seg
Figura 7.7. Tiempos de creacin de un modelo con y sin la opcin de assembling activada.
UdG
183
Como se puede comprobar tales resultados son muy significativos, ya que la reduccin del
tiempo necesario para crear el modelo de la Figura 7.7 con la opcin de assembling activada
supone el 33%, aproximadamente, en el tiempo de creacin en relacin a la construccin del
mismo modelo, pero sin la utilizacin de la opcin de assembling.
5
Grandes posibilidades de amplicacin del proyecto con ms conectores como los engranajes
(gears) y por lo tanto la introduccin de nuevas y ms complejas interacciones.
184
EPS
( 7 8)
-
185
" " ()
' )
EPS
UdG
186
8
8.1
Partiendo de la base realizada con el CAD Mecnico para piezas Lego podramos destacar cuatro grandes
proyectos que se podrian llevar a cabo, alguno de ellos complementaran el presente proyecto mientras
que otros simplemente se aprovecharan de las ventajas del mismo.
Lenguaje de Scripting
Este proyecto sera, de los cuatro expuestos, el que mejorara y generalizara la implementacin actual del
assembling. Para ello sera conveniente mantener nicamente los dos primeros niveles de la jerarqua de
clases del conector (ver Captulo 5. Diseo apartado 5.2.2 Jerarqua de clases del conector) aadiendo,
en caso de que hiciera falta, alguna tipologa ms de conectores. Una vez hecho esto se creara un
lenguaje de scripting donde se especificaran los datos necesarios para cualquier tipo de assembling, como
los conectores compatibles para ensamblar y los pasos de assembling que no se encontraran en la
implementacin base... Con todo esto conseguiramos generalizar la aplicacin y evitar la modificacin
del cdigo cada vez que se quisiera introducir un nuevo conector no identificado anteriormente.
El camino a seguir ya se encuentra delineado en este trabajo: mediante la identificacin de los elementos
comunes y los elementos diferentes para cada caso de conexin, desconexin, conexiones secundarias,
rotaciones y translaciones, puede obtenerse un esquema general. Por ejemplo, hemos visto en el captulo
de diseo que para realizar el assembling entre dos conectores se deben seguir un cierto nmero pasos
claramente diferenciados (Paso A, Paso B, Paso C, etc.) seguidos por dos pasos estndar entre todas las
conexiones. Por lo tanto, podra definirse un mecanismo genrico donde se especifiquen pares ordenados
del tipo
(Conectores, Lista de pasos)
donde Conectores es, a su vez, el par de conectores a ensamblar: (Stud, StudInlet) (estos pares NO son
ordenados, es decir que el par (StudInlet, Stud) es el mismo que el anterior). De la misma manera, Lista
de Pasos sera una simple cadena especificando los pasos a seguir para realizar la conexin. En este caso,
bastara con una simple cadena del tipo ABC (si los pasos DE son los obligatorios para todas las
conexiones, stos pueden obviarse). De esta forma, podra almacenarse en una base de datos este tipo de
estructura que facilitara enormemente la codificacin de nuevos conectores, ya que slo debera
recompilarse la aplicacin en el caso de la creacin de un nuevo paso de conexin (por ejemplo, K).
Un razonamiento similar debe utilizarse para poder generalizar los comportamientos en los casos del
deslizamiento, translacin y rotacin.
UdG
187
LCI Editor
Tal y como se ha comentado en la memoria, toda pieza con la que se desee ensamblar debe tener asociado
un fichero LCI (Lego Connectors Information) (ver Anexo 2. Formato, Sintaxis y semntica de los
ficheros LCI), en el que encontramos la informacin referente a los conectores de la propia pieza. Los 141
ficheros LCI que corresponden a las 141 piezas disponibles para poder utilizar con la opcin de
assembling han sido creados manualmente.
El objetivo de este proyecto sera el de intentar automatizar la creacin de los ficheros LCI a partir de la
informacin obtenida de los ficheros originales DAT del paquete LDraw. Este proceso se llevara a cabo
en 3 fases:
1
Deteccin de conectores. En esta fase se generaran todos los ficheros LCI asociados a cada una
de las piezas del paquete LDraw [1] (ver Captulo 3. LDraw), es decir, un fichero LCI por cada
fichero DAT que represente a una pieza Lego. Si una pieza ya tuviese un fichero LCI asociado,
slo se ampliara la lista de conectores presentes.
Visualizacin de la pieza y sus conectores. Una vez generados los ficheros LCI el editor
debera permitir la visualizacin de la pieza que representa a cada uno de ellos y as poder
observar los conectores detectados por la aplicacin.
Creacin de conectores no detectados por el editor. Toda pieza del paquete LDraw puede ser
creada utilizando nicamente geometra o mediante las subpartes que el propio paquete
proporciona. Si la pieza posee subpartes, la bsqueda de conectores se realizar con xito, ya que
es muy fcil identificar los conectores a partir de las subpartes que los modelan, pero en caso
contrario ser el usuario que deber informar al editor de la localizacin de los conectores no
detectados dentro de una determinada pieza. Todo este proceso debera hacerse de forma grfica.
188
EPS
DAT para su posterior utilizacin como parte del paquete LDraw, as como el correspondiente fichero
LCI para, a posteriori, poder ensamblar la pieza con otras.
LeoMCAD Studio (Mechanical LeoCAD Studio)
Una vez se ha conseguido que podamos ensamblar las piezas nicamente identificando las partes de ellas
que nos lo permiten sera muy til tener la opcin de llevar a cabo animaciones utilizando el CAD
Mecnico para piezas Lego. La idea se basara en crear frames de animacin para cada transformacin
significativa que se le aplique a alguna de las piezas que formen el modelo a construir. Para cada una de
estas transformaciones se creara un fichero de datos. Una vez tuviramos el conjunto de ficheros de datos
que formaran nuestra animacin podramos exportarlos tanto a POV-Ray como a VRML para poder
visualizar la animacin con gran calidad de imagen.
8.2
Agradecimientos
Como cierre al proyecto querra dedicar unas lneas a un conjunto de personas que me han ayudado, de
una forma u otra, antes y durante la realizacin del mismo:
A ti papa, donde quiera que ests, porque me demostraste que hay que luchar hasta el final.
Espero que ests orgullosos de tu hijo.
A mis amigos, por aguantarme y precisamente por eso, por ser mis amigos.
A ti Silvia por ser ms que una amiga, una segunda hermana para mi.
Y a mi tutor, Gustavo Patow, no tan solo por soportar las continuas y largas sesiones de consulta,
sino tambin por implicarse tanto en el proyecto y por ser ms que un tutor, un compaero.
UdG
189
"
()
-
UdG
"(
7
191
UdG
192
.................................................................................................................................
Figura 2.1
.................................................................................................................................
18
Figura 2.2
.................................................................................................................................
19
Figura 2.3
.................................................................................................................................
20
Figura 2.4
.................................................................................................................................
21
Figura 2.5
.................................................................................................................................
22
Figura 3.1
.................................................................................................................................
27
Figura 3.2
.................................................................................................................................
28
Figura 3.3
.................................................................................................................................
34
Figura 3.4
.................................................................................................................................
34
Figura 3.5
.................................................................................................................................
35
Figura 3.6
.................................................................................................................................
37
Figura 3.7
.................................................................................................................................
37
Figura 3.8
.................................................................................................................................
38
Figura 3.9
.................................................................................................................................
39
Figura 4.1
.................................................................................................................................
42
Figura 4.2
.................................................................................................................................
43
Figura 4.3
.................................................................................................................................
44
Figura 4.4
.................................................................................................................................
45
Figura 4.5
.................................................................................................................................
46
Figura 4.6
.................................................................................................................................
47
Figura 4.7
.................................................................................................................................
47
Figura 4.8
.................................................................................................................................
48
Figura 4.9
.................................................................................................................................
48
Figura 4.10
.................................................................................................................................
49
Figura 4.11
.................................................................................................................................
50
Figura 4.12
.................................................................................................................................
50
Figura 5.1
.................................................................................................................................
55
Figura 5.2
.................................................................................................................................
55
Figura 5.3
.................................................................................................................................
56
Figura 5.4
.................................................................................................................................
58
Figura 5.5
.................................................................................................................................
58
Figura 5.6
.................................................................................................................................
67
Figura 5.7
.................................................................................................................................
70
Figura 5.8
.................................................................................................................................
70
Figura 5.9
.................................................................................................................................
70
Figura 5.10
.................................................................................................................................
70
UdG
193
Figura 5.11
.................................................................................................................................
72
Figura 5.12
.................................................................................................................................
76
Figura 5.13
.................................................................................................................................
77
Figura 5.14
.................................................................................................................................
77
Figura 5.15
.................................................................................................................................
78
Figura 5.16
.................................................................................................................................
78
Figura 5.17
.................................................................................................................................
79
Figura 5.18
.................................................................................................................................
79
Figura 5.19
.................................................................................................................................
79
Figura 5.20
.................................................................................................................................
79
Figura 5.21
.................................................................................................................................
80
Figura 5.22
.................................................................................................................................
80
Figura 5.23
.................................................................................................................................
81
Figura 5.24
.................................................................................................................................
82
Figura 5.25
.................................................................................................................................
82
Figura 5.26
.................................................................................................................................
84
Figura 5.27
.................................................................................................................................
84
Figura 5.28
.................................................................................................................................
85
Figura 5.29
.................................................................................................................................
85
Figura 5.30
.................................................................................................................................
85
Figura 5.31
.................................................................................................................................
87
Figura 5.32
.................................................................................................................................
89
Figura 5.33
.................................................................................................................................
89
Figura 5.34
.................................................................................................................................
90
Figura 5.35
.................................................................................................................................
90
Figura 5.36
.................................................................................................................................
90
Figura 5.37
.................................................................................................................................
92
Figura 5.38
.................................................................................................................................
102
Figura 5.39
.................................................................................................................................
103
Figura 5.40
.................................................................................................................................
105
Figura 5.41
.................................................................................................................................
112
Figura 5.42
.................................................................................................................................
114
Figura 5.43
.................................................................................................................................
115
Figura 5.44
.................................................................................................................................
118
Figura 5.45
.................................................................................................................................
119
Figura 5.46
.................................................................................................................................
122
Figura 5.47
.................................................................................................................................
127
Figura 5.48
.................................................................................................................................
128
194
EPS
Figura 5.49
.................................................................................................................................
129
Figura 5.50
.................................................................................................................................
131
Figura 6.1
.................................................................................................................................
139
Figura 6.2
.................................................................................................................................
141
Figura 6.3
.................................................................................................................................
141
Figura 6.4
.................................................................................................................................
141
Figura 6.5
.................................................................................................................................
145
Figura 6.6
.................................................................................................................................
148
Figura 6.7
.................................................................................................................................
154
Figura 6.8
.................................................................................................................................
155
Figura 6.9
.................................................................................................................................
155
Figura 6.10
.................................................................................................................................
156
Figura 6.11
.................................................................................................................................
158
Figura 6.12
.................................................................................................................................
163
Figura 6.13
.................................................................................................................................
164
Figura 6.14
.................................................................................................................................
165
Figura 6.15
.................................................................................................................................
165
Figura 6.16
.................................................................................................................................
166
Figura 6.17
.................................................................................................................................
167
Figura 6.18
.................................................................................................................................
167
Figura 6.19
.................................................................................................................................
168
Figura 6.20
.................................................................................................................................
169
Figura 6.21
.................................................................................................................................
169
Figura 7.1
.................................................................................................................................
173
Figura 7.2
.................................................................................................................................
173
Figura 7.3
.................................................................................................................................
174
Figura 7.4
.................................................................................................................................
174
Figura 7.5
.................................................................................................................................
175
Figura 7.6
.................................................................................................................................
176
Figura 7.7
.................................................................................................................................
176
Tabla 3.1
.................................................................................................................................
28
Tabla 3.2
.................................................................................................................................
36
Tabla 3.3
.................................................................................................................................
38
Tabla 5.1
.................................................................................................................................
69
Tabla 6.1
.................................................................................................................................
166
UdG
195
196
EPS
UdG
) (
197
UdG
198
BIBLIOGRAFA
La bibliografa ha estado creada siguiendo el estndard MLA (Modern Language Association of
America).
[1]
[2]
[3]
[4]
Attila, Lng y Attila Kiss. LDraw Connection Database Version 1.04. En lnea. Internet. 2002.
Accesible a http://www.ldraw.org/reference/specs/lcd/
[5]
[6]
[7]
[8]
Sainz, Miguel A. et al. algebra. Girona : Miguel ngel Sainz, Joan Llus Serarols, Anna Maria
Prez y Palah, A.G, 1994
[9]
Garca, Javier et al. Aprenda C++ como si estuviera en primero. En lnea. Internet. Abril 1998.
Accesible a http://www.abcdatos.com/tutoriales/tutorial/l2525.html
[10]
Liberty, Jesse y B. Horvath, David. Aprendiendo C++ para Linux en 21 das. Primera edicin.
NaucaldPaud de Jurez : Prentice Hall, 2000
[11]
Gamma, Erich et al. Design Patterns. Elements of Reusable Object-Oriented Software. 1995
[12]
Woo, Mason et al. OpenGL programming guide. Segunda edicin. Addison Wesley, Enero 1997
[13]
Van Heesch, Dimitri. doxygen Manual for version 1.2.12. En lnea. Internet. 1997. Accesible a
http://www.doxygen .org
UdG
199
Bibliografa
[14]
Bray, Tim et al. Extensible Markup Language (XML) 1.0 (Second Edition). En lnea. Internet.
Octubre 2000. Accesible a http://www.w3.org/TR/2000/REC-xml-20001006
[15]
[16]
Bobic, Nick. Advance Collision Detection Techniques. En lnea. Internet. Mayo 1999. Accesible
a http://www.gamedev.net/reference/articles/article974.asp
[17]
Fowler, Martin. Refactoring; Improving the Design of Existing Code. USA : Addison-Wesley,
Octubre 2002
200
EPS
Bibliografa
' ;)
201
EPS
UdG
202
Ldraw. ste es el directorio raiz del paquete LDraw y en l se encuentran el resto de directorios.
Tambin podemos encontrar otros elementos como el visualizador que nos provee el propio
paquete (ldraw.exe), el editor de piezas Lego para MS-DOS, el Ledit, y un programa que nos
permite ordenar las piezas tanto por su nmero de referencia como por su nombre.
Bitmap. En el directorio Bitmap se guardan los bitmaps que el visualizador del paquete LDraw
crea como consecuencia de la ejecucin de los metacomandos PASO y SAVE (ver Captulo 2.
Piezas y conectores Lego).
Parts. En ste directorio se ubican todas las piezas Lego includas en el paquete LDraw.
Models. Directorio disponible para almacenar los modelos creados mediante las piezas que
ofrece el propio paquete LDraw.
UdG
203
Anexos
Todo fichero con extensin LCI posee un nombre que corresponde con el nmero de serie de la pieza a la
que est asociado tal fichero. As pues, el nombre de todo fichero LCI tendr el siguiente formato:
numero_pieza.lci
donde
numero_pieza es el nmero de serie real de la pieza a la que est asociado el fichero LCI.
En cuanto al contenido de los ficheros LCI cabe destacar que estan formados por texto ASCII, que cada
lnea del fichero es totalmente independiente del resto del mismo y que sigue la sintaxis basada en el
estndar XML.
La sintaxis de los ficheros LCI es la que se especifica a continuacin:
<connector>
<name>nombre_conector</name>
<matrix>a b c d e f g h i j k l m n o p</matrix>
<parameters>
<lenght>longitud</lenght>
<id>identificadorLCI_conector</id>
<brother>identificadorLCI-hermano</brother>
</parameters>
</connector>
donde
nombre_conector es el nombre del conector segn su clasificacin por tipologa (ver Captulo
2. Piezas y conectores Lego). Los valores posibles, en la implementacin actual, son: stud,
studInlet, axle, axleHole y cylindricalHole.
coordenadas homogneas (ver Figura A2.1), que nos indica la posicin y rotacin del conector
respecto a la pieza (ver Captulo 6. Implementacin) a la que pertenece. Las coordenadas de esta
matriz se encuentran en coordenadas LDraw [1] (ver Anexo 4. Sistemas de coordenadas Ldraw y
LeoCAD).
204
EPS
C2P
=
Posicin
Rotacin
Coordenadas
homogneas
actual.
</connector>
<matrix>
</matrix>
<parameters>
</parameters> tag que nos indica el fin de los parmetros del conector.
<lenght>
</lenght>
<id>
</id>
<brother>
tag que nos informa del inicio del identificadorLCI del hermano.
</brother>
tag que nos informa del fin del identificadorLCI del hermano.
En cuanto al contenido de los ficheros LCI habra que destacar tres aspectos realmente importantes:
1
El tag <parameters> solo ser necesario en el caso de los conectores que pertenezcan a los de
tipo segmento (ver Captulo 2. Piezas y conectores Lego), es decir, que los nicos conectores
que necesitarn de parmetros extras sern el Axle, Axle Hole y el Cylindrical Hole. As pues,
todo conector de tipo puntual que posea parmetros, los ignorar.
Para los conectores de tipo segmento, que tengan hermanos (ver Captulo 2. Piezas y conectores
Lego), se tendr que incluir como parmetros su identificador y el del hermano, dentro del
UdG
205
Anexos
fichero LCI. Lgicamente, los conectores de tipo segmento que no posean hermano, no
necesitarn de tales parmetros extras.
Esta informacin es necesaria por dos motivos:
A
Todo conector de tipo segmento sabr si tiene hermano o no, y en el caso de tenerlo,
cul es.
Para el proceso de assembling y propagacin del mismo (ver Captulo 5. Diseo) que
involucre a conectores de tipo segmento.
Por ltimo, hay que comentar el motivo que ha llevado a la decisin de utilizar la sintaxis y
formato utilizados en los ficheros LCI en vez de otros. Tal motivo se basa principalmente en la
semntica, es decir, en el significado de los tags. Con esto quiero decir que una vez parseado el
fichero LCI, cada conector leer la informacin que realmente necesite, segn el tipo de conector
que sea. Por ejemplo, el Stud nicamente parsear el tag <name> y <matrix>, y por lo tanto
ignorar el resto de inforamcin que el usuario pueda haber includo de forma equivocada. Por el
contrario, un Axle necesitar leer los tags <name>, <matrix> y <parameters> (ver Captulo
5. Diseo).
Supongamos la pieza de la Figura A2.2. Esta pieza es un Technic Brick 1 x 2 with Axle Hole y se
encuentra definida en el fichero 32064.dat, por lo que tendr asociada un fichero 32064.lci.
Stud
Stud
Axle Hole
Axle Hole
Stud Inlet
Stud Inlet
Figura A2.2. Pieza 32064 con los ficheros asociados 32064.dat y 32064.lci.
Tal fichero LCI contiene la siguiente informacin:
206
EPS
<connector>
<name>stud</name>
<matrix>1 0 0 0 0 1 0 0 0 0 1 0 10 0 0 1</matrix>
</connector>
<connector>
<name>stud</name>
<matrix>1 0 0 0 0 1 0 0 0 0 1 0 -10 0 0 1</matrix>
</connector>
<connector>
<name>studInlet</name>
<matrix>1 0 0 0 0 1 0 0 0 0 1 0 10 24 0 1</matrix>
</connector>
<connector>
<name>studInlet</name>
<matrix>1 0 0 0 0 1 0 0 0 0 1 0 -10 24 0 1</matrix>
</connector>
<connector>
<name>axleHole</name>
<matrix>-1 0 0 0 0 0 1 0 0 -1 0 0 0 10 10 1</matrix>
<parameters>
<lenght>10</lenght>
<id>0</id>
<brother>1</brother>
</parameters>
</connector>
<connector>
<name>axleHole</name>
<matrix>1 0 0 0 0 0 -1 0 0 -1 0 0 0 10 -10 1</matrix>
<parameters>
<lenght>10</lenght>
<id>1</id>
<brother>0</brother>
</parameters>
</connector>
Los datos de este fichero nos estn informando de tres aspectos muy importantes:
UdG
207
Anexos
Z+
1
0
0
0
0
1
0
0
X+
0 10
0 0
1 0
0 1
Vista frontal
Y+
Z+
1
0
0
0
0
1
0
0
0 -10
0 0
1 0
0 1
1
0
0
0
0
1
0
0
0 10
0 24
1 0
0 1
X+
Y+
Vista frontal
Vista frontal
+
X+
Y+
1
0
0
0
0
1
0
0
0 -10
0 24
1 0
0 1
Vista frontal
Z+
X+
Y+
Z+
208
-1
0
0
0
1
0
0
0
0 0 0
0 -1 10
1 0 10
0 0 1
0 0 0
0 -1 10
-1 0 -10
0 0 1
Y+
Vista lateral
Z+
X+
Vista lateral
Y+
Los dos Axle Hole son hermanos y tienen una longitud de 10 unidades cada uno.
EPS
Qu es un DTD?
El propsito de un DTD (Document Type Definition) [14] es el de definir los bloques permitidos de un
documento XML. Esta definicin puede ser incluida dentro de cada fichero XML de forma explcita o
mediante una referencia dentro del fichero XML a otro fichero que contenga el DTD.
Qu es un XML Schema?
El XML Schema [14] es una alternativa al DTD que intenta describir la estructura de un documento
XML. El propsito de un XML Schema es, al igual que el de un DTD, el de definir los bloques que son
permitidos dentro de un determinado documento XML.
Pero que mejoras aportan respecto a los DTD? Las principales mejoras, a grandres rasgos, son las cinco
que se citan a continuacin:
1
UdG
209
Anexos
210
EPS
El paquete LDraw [1], a parte de tener unos ficheros con una sintaxis un tanto peculiar, tiene un sistema
de coordenadas tambin bastante especial y poco comn (ver Figura A4.1). Es importante su
conocimiento puesto que todas las componentes numricas de los ficheros DAT donde se alberga la
informacin de las piezas y conectores, se encuentran expresados respecto a l.
X+
Z+
Y+
Figura A4.1. Sistema de coordenadas LDraw.
El sistema de coordenadas utilizado por el LeoCAD [2] es totalmente diferente al que se utiliza en todos
los ficheros del paquete LDraw, tal y como se puede ver en la Figura A4.2.
Z+
X+
Y+
UdG
211
Anexos
Matrices de rotacin
R=
matriz R a un vector
v=
vx
vy
vz
Rv =
I es la matriz identidad 3 x 3.
212
EPS
Vectores de rotacin
Otra forma de representar una rotacin 3D es especificar un eje de rotacin con un vector r de longitud
unitaria, y un ngulo de rotacin en radianes. Normalmente, estos dos valores se especifican
conjuntamente como un solo vector = r. El ngulo de rotacin es la longitud de y el eje de rotacin
se determina normalizando r = / ||1. Pese a que esta forma de representar rotaciones 3D es ms
intuitiva que la anterior, para aplicar esta rotacin a un vector necesitamos convertir el vector r a la
representacin matricial.
z
r
y
3
La frmula de Rodrigues
(1)
r =
0 -rz ry
rz
0 -rx
-ry rx 0
r v = r x v =
ryvz rzv y
rzvx rxvz
rxv y ryvx
Utilizamos | . | para denotar tanto el determinante de una matriz, como la norma de un vector.
UdG
213
Anexos
Toda matriz A puede ser descompuesta como la suma de la parte simtrica, la matriz ( A + At ) / 2, y la
parte antisimtrica, la matriz ( A At ) / 2.
214
EPS
UdG
215
Anexos
216
EPS
UdG
217
Anexos
218
EPS
con t entre [ 0, 1 ]
La distancia entre un punto que pertenezca a la lnea r y otro x0 = ( x0, y0, z0 ) es el mdulo del vector
v(x0x1, con lo que la distancia al cuadrado es la suma de las componentes de dicho vector al cuadrado.
Por lo tanto tenemos:
d(d2)
dt
= 0 para acabar
UdG
219
Anexos
donde
220
EPS
ATRIBUTOS
actual. Elemento de la lista sobre el que nos encontramos durante una iteracin.
MTODOS
Elemento
Actual(). Mtodo que nos devuelve el elemento actual sobre el que nos
UdG
221
Anexos
bool Fin(). Mtodo que devuelve cierto en caso de que nos encontremos al final de la lista.
bool Vacia(). Mtodo que devuelve cierto en caso de que la lista se encuentre vaca.
bool Llena(). Devuelve cierto en caso de que la lista se encuentre llena. Al ser una lista
implementada de forma dinmica, devolver cierto cuando no haya suficiente memoria para
introducir un nuevo elemento en la lista.
bool Existe(Elemento e). Mtodo que devuelve cierto en caso de que exista el elemento e
dentro de la lista.
222
EPS
ATRIBUTOS
iterativos.
MTODOS
asociado a ella e.
UdG
223
Anexos
bool Existe(Calve c). Devuelve cierto en caso de que exista un elemento en el diccionario
con la clave c.
224
bool Vacia(). Mtodo que nos devuelve cierto si el diccionario se encuentra vaco.
bool Llena(). Mtodo que nos devuelve cierto si el diccionario se encuentra lleno.
EPS