Diseño Asistido por Computadora

Diseño Asistido por Computadora Proyecto: El cubo de Rubik Polo García, José Luis 4º Ingeniería Informática Índice de contenidos 1. Descripción del

0 downloads 211 Views 34KB Size

Story Transcript

Diseño Asistido por Computadora Proyecto: El cubo de Rubik

Polo García, José Luis 4º Ingeniería Informática

Índice de contenidos 1. Descripción del problema ........................................................................ 3 2. Estructuras de datos .................................................................................. 3 3. Funciones empleadas ................................................................................ 4 4. Manual de usuario ........................................................................................ 5

Diseño Asistido por Computadora · 2

1. Descripción del problema El objet ivo de la práct ica es realizar un programa en openGL que simule el comport amient o de un cubo de Rubik. Las f unciones que se deben implement ar son: - Cambiar la posición de los component es del cubo girando planos de 9 cubos en t orno al eje X, Y o Z. Todo ello mediant e el uso del rat ón. - Desordenar la est ruct ura del cubo de f orma que se aprecie los giros que se realizan en el proceso. - Almacenar o cargar part idas ant eriores del juego. - Present ar un menú para el cambio de parámet ros: número de movimient os aleat orios al desordenar, nombres de f ichero para el guardado rápido, aument ar/disminuir zoom, abandonar el programa, et c... - Ot ra f unciones de cámara: permit ir cambiar la posición de la cámara en t odos los sent idos, increment ar o disminuir el zoom de la imagen, et c...

2. Estructuras de datos Dos est ruct uras de dat os se usan principalment e. La primera de ellas es un array de 3 dimensiones llamado cuboRubik que guarda 3x3x3 ent eros. Los ent eros en realidad son los ident if icadores de los cubos que ocupan la posición correspondient e. Así, por ejemplo, en cuboRubik[i][j][k] se guarda el ident if icador del cubo que ocupa la posición i, j, k con respect o a los ejes x, y, z respect ivament e. Gracias a est a est ruct ura podremos comprobar f ácilment e si se ha llegado a una solución, así como realizar los giros de los cubos a la vez (se giran "planos" de 9 cubos cada vez que se indica el giro de un cubo). Por ot ro lado t enemos la est ruct ura model, que es un vect or que guarda las f iguras que se usan en el modelo. En est e problema se encuent ran 27 f iguras (cada uno de los cubos individuales), que se est ruct uran de f orma convenient e. model es un vect or de est ruct uras f igura, en la que se guarda t oda la inf ormación necesaria para cada cubo. Los campos que componen dicha est ruct ura son: typedef struct { float x, y, z; float giroX, giroY, giroZ; float AntX, AntY, AntZ; int colores[6]; } figura;

En primer lugar t enemos las variables x, y, z. Guardan la posición f ísica en el espacio de cada cubo. Por ot ro lado t ambién será necesario guardar los giros que hay que aplicar a cada element o. Est o es así porque cuando realizamos un giro (ya sea de f orma manual o por el procedimient o de desornamient o aleat orio) no sólo cambia la posición de los cubos sino t ambién la orient ación que t ienen y es necesario guardala para luego aplicar la t ransf ormación correspondient e. Las variables Ant X, Ant Y y Ant Z guardan la posición ant erior que ocupaba el cubo, pero la posición f ísica. Es necesario almacenarla porque luego el comport amient o del programa es el siguient e: Cuando realizamos un giro con el rat ón por ejemplo según movamos más o menos el cubo gira y cambia su posición y orient ación adecuadament e. Cuando solt amos el rat ón la posición de los cubos seleccionados t iene que ser ajust ada a una posición posible, est o es, si hemos realizado un giro de 83º con respect o a la posición original, habrá que ajust ar a 90º. No es posible que los cubos se queden en posiciones int ermedias porque luego, al girar con respect o a ot ro eje, la est ruct ura se def ormaría. Del mismo modo en un giro que f inalice con un increment o de 163ª será ajust ado a 180 y así para t odo los casos según corresponda (ver f unción ajust arMov). Por últ imo t enemos un vect or de ent eros que se llama colores que guarda los colores que t ienen las caras del cubo de la siguient e f orma. La cara 0 es la superior y la 5 la inf erior siendo de la 1 a la 4 las caras Asistido por Computadora 3 lat erales. Los colores son valores ent erosDiseño def inidos como const ant es· cuyos valores posibles son BLANCO, AZUL, NARANJA, ROJO, AMARILLO, VERDE y NEGRO. La f unción ponColor es la encargada de asignar est os valores lógicos de colores a valores acept ables para openGL.

Por últ imo t enemos un vect or de ent eros que se llama colores que guarda los colores que t ienen las caras del cubo de la siguient e f orma. La cara 0 es la superior y la 5 la inf erior siendo de la 1 a la 4 las caras lat erales. Los colores son valores ent eros def inidos como const ant es cuyos valores posibles son BLANCO, AZUL, NARANJA, ROJO, AMARILLO, VERDE y NEGRO. La f unción ponColor es la encargada de asignar est os valores lógicos de colores a valores acept ables para openGL.

3. Funciones empleadas Las f unciones más import ant es que se usan en el programa se describen a cont inuación: void genDatos();

Se encarga de asignar los valores iniciales a las est ruct uras usadas. La posición inicial del cubo será la de un cubo resuelt o por mot ivos didáct icos (para comprobar si se llega a una solución f ácilment e). void inicia ();

Inicia los parámet ros openGL para el modelo y habilit a cont rol de prof undidad, color de borrado, et c... void dibuja();

Función que se encarga de dibujar el modelo. Es un bucle que recorre la est ruct ura model y llama a las primit ivas de dibujo adecuadas para pint ar el modelo. void ejes (int grosor);

Se encarga de pint ar unos ejes de dist int os colores que part en del origen (0,0,0). El parámet ro es el grosor de la línea que se usa para dibujarlos. void ponColor (int color);

Se le pasa un color lógico ent re los valores posibles (NEGRO, AZUL, NARANJA, VERDE...) y la f unción se encarga de llamar a glColor3f con los parámet ros adecuados. void cubo (float tam, int c[6]);

Primit iva para pint ar un cubo. Se le pasa el t amaño del cubo que se quiere y los colores que t ienen que llevar sus caras en f orma de vect or de ent eros. teclaEspecial, tecla, raton, movRaton

Son las f unciones con las que manejar los event os de t eclas especiales, t eclas normales, rat ón y movimient o act ivo de rat ón (con bot ón pulsado) respect ivament e. Se asignan a las f unciones glut en el programa principal adecuadament e. int pick (int x, int y);

Función para la selección de objet os en el modelo. Recibe la posición act ual del rat ón y devuelve el ident if icador del cubo que f ue seleccionado. void lugar (int id, int *a, int *b, int *c);

Recibe como ent rada el ident if icador de un cubo y almacena en (a, b, c) la posición lógica que ocupa dent ro del cubo de Rubik. void gestMovCubo (int d, int s, int id);

Recibe como argument os el ident if icador de un cubo (id), la dirección y el sent ido en que se produce el giro y gest iona el movimient o de los cubos adecuados. Es la f unción que cont rola el movimient o de los cubos de acuerdo a los movimient os del rat ón: recalcula la posición del plano de cubos que se mueve según si el rat ón se mueve de arriba a abajo, de izquierda a derecha o con respect o al eje z (con el bot ón derecho). void giraCubo (int id, char eje, float grad); Diseño Asistido por Computadora · 4

Recalcula la posición del cubo que se pasa como argument o de acuerdo al eje de giro que se quiere y la cant idad de grados necesaria. void ajustaMov (int id);

Tras solt ar el rat ón se llama a est a f unción que se encarga de ajust ar los giros a posiciones "est ables" adecuadas, est o es, los cubos siempre t ienen que acabar f ormando un cubo t ras los giros. Los valores de giros posibles t ienen que ser 90, 180, 270 o 0 grados ya que los cubos no se pueden quedar a medio giro. void ajusteLogico (int d, int s, int fc, int numInc);

Est a es la f unción responsable de modif icar los ident if icadores que guarda la est ruct ura cuboRubik t ras producirse un giro. Es necesario conocer la dirección y el sent ido en que se produjo (d, s). La variables f c es la dimensión que no cambió en el giro y por t ant o det ermina el eje en que se produzco, dicha variable result a de gran ut ilidad en la f unción. El número de increment os (numInc) es el número de giros posibles que se produjo, est o es, si vale 1 quiere decir que se giraron 90º, si vale 2, 180º y así sucesivament e. int siguientePos(int v[4][2], int i, int j, int f, int n);

Función int erna que calcula la siguient e posición que debe ocupar un cubo de acuerdo a la posición act ual que ocupa (i, j) y el número de giros que se produjo. La variable f vale -1 o 1 según el sent ido en quiere cambiar la posición. int solucion();

Función booleana que devuelve TRUE si el cubo ha sido resuelt o y FALSE en caso cont rario. Es un bucle que recorre las caras de los cubos para ver si coinciden. void cuboResuelto();

Escribirá un mensaje para avisar de que se llegó a la solución. salvarFichero, cambiarFicheroSalida, cargarFichero

Cont rolan los aspect os relat ivos a guardar una part ida o recuperarla. La f unción cambiarFicheroSalida se encarga de alt erar el nombre de la part ida act ual con el f in no sobreescribir el f ichero act ual. void desordenaCubo();

Se encarga de generar aleat oriament e movimient os y de ejecut arlos visualment e. void movAleat(int idCubo, int nRot, int sent, int eje);

Alt era el modelo gráf ico para visualizar cómo se producen las rot aciones en el cubo.

4. Manual de usuario El programa se ejecut a sin argument os: $> rubik

Se abre una vent ana donde vemos el cubo de rubik, que inicialment e est á ordenado. Con el bot ón cent ral del rat ón podemos act ivar un menú que nos muest ra las opciones posibles. Si no se dispone de 3 bot ones para el rat ón se pueden pulsar simult áneament e el izquierdo y el derecho. (En rat ones pulsar la rueda) Para mover los cubos usamos el rat ón de la siguient e f orma: Pulsamos en el cubo que queremos mover y desplazamos el rat ón en algún sent ido. Si pulsamos el bot ón izquierdo y movemos de abajo a arriba los cubos adecuados giran con respect o al eje Z. Si usamos el bot ón izquierdo pero movemos horizont alment e los cubos giran con respect o al eje Y. Si usamos el bot ón derecho y movemos vert icalment e ent onces conseguiremos un giro con respect o al eje Z. Diseño Asistido por Computadora · 5

Por ot ra part e con los cursores podemos cambiar la posición del cubo girándolo sobre su cent ro. Las opciones que se present an en el menú son las siguient es: - Más zoom : increment a el t amaño del cubo - Menos zoom : decrement e el t amaño del cubo - Desordenar: realiza una serie de movimient os aleat orios en cualquier sent ido y con respect o a cualquier eje (sin repet ir dos ejes consecut ivos). Por def ect o y de inicio se realizan 10 it eraciones aleat orias, parámet ro que se puede modif icar con la siguient e opción del menú. - Cambiar desorden: Pedirá por consola el nuevo valor para las it eraciones aleat orias. - Cambiar f ichero de salida: En principio el archivo sobre el que jugamos se llama "noname.cub", para cambiar est o llamamos a est a opción que nos pide por la consola t ambién el nuevo nombre del f ichero que se usará para guardar la inf ormación cuando se pida. - Almacena el f ichero de nombre act ual que aparece en el t ít ulo de la vent ana. Se puede cambiar el f ichero con la opción ant erior. - Abrir f ichero: Carga un f ichero ant eriorment e almacenado con el que se puede cont inuar jugando. - Ejes: Act iva o desact iva la visión de los ejes. - Salir: Abandona el programa Todas est as f unciones se pueden llamar t ambién usando el t eclado, por si el bot ón cent ral no exist iese ni ninguna de las alt ernat ivas t ampoco y para llamar a las f unciones de f orma más rápida. Los at ajos de t eclado exist ent es son: -

Escape: salir. Ent er: desordenar cubo. Espacio: salvar el f ichero act ual. C : cambiar f ichero de salida. A : cargar f icharo ant eriorment e salvado. W: increment ar zoom. S: decrement ar zoom. D: cambiar número de it eraciones aleat orias para desordenar. E: act ivar / desact ivar visión de los ejes.

Diseño Asistido por Computadora · 6

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.