Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
UML estructural estaba basado esencialmente en los diagramas de clases. En el modelo dinmico hay ms variedad de diagramas, aunque no todos deben ser empleados en el proyecto. Los aspectos dinmicos o evolucin temporal de la aplicacin se pueden modelar con los siguientes diagramas:
113
Los mensajes emplearn una sintaxis igual que los servicios de las clases. De hecho, la mayora de los mensajes son los servicios de las clases:
Nombre-devolucion := nombre-mensaje (parmetro:tipo Parametro):tipo-devolucion
Ejemplo
laListaCaracteristica := procesarFichImag(nomFichImag:string):ListaCaracterstica
5.1.2 Diagramas de secuencia Un diagrama de secuencia muestra un conjunto de mensajes dispuestos en una secuencia temporal. Se encuentra estructurado en dos dimensiones. El tiempo se representa verticalmente y corre hacia abajo, y no est representado necesariamente a escala. En direccin horizontal, hay franjas verticales sucesivas que corresponde a los diferentes objetos que participan en la interaccin.
114
La lnea de vida de un objeto simboliza la existencia de ste en un cierto periodo de tiempo. Se representa mediante una lnea discontinua vertical que va desde su creacin hasta la destruccin. Las actividades representan los tiempos de procesamiento de los objetos y se representan mediante rectngulos verticales alargados insertados en las lneas de vida. Los mensajes se indican con flechas que comienzan en una activacin (al principio de sta o en una posicin intermedia) y acaban en otra. Tambin, se pueden indicar los mensajes de retorno al final de una activacin, en forma de flecha discontinua y punta abierta. Lo normal es que se excluyan por quienes utilizan UML. El uso de un diagrama de secuencia es mostrar la secuencia de comportamiento de un caso de uso. Cuando se implementa el comportamiento del caso de uso, cada mensaje en un diagrama de secuencia corresponde a: 1. Una operacin en una clase. 2. A un evento externo. 3. A una transicin de una mquina de estados. Ejemplo 5.1 Para el caso de uso RespuestaFrecuencia realizar el diagrama de secuencia del paquete del dominio. Partiendo del DSS y de los contratos de operacin, visto en el captulo 3, y empleando algunos patrones, podra configurarse el siguiente diagrama de secuencia:
: Ingeniero electrnico
:Sistema
introducirCircuito()
determinarFDTFiltro()
introducirParametrosRespFrec()
determinarRespFrec()
dibujarDiagramaBode()
115
Patrn Fachada : Ingeniero electrnico Vista : CoordinadorRespFr Patrn creador ponerCircuito() create()
introducirCircuito()
introducirParametrosRespFr()
ponerParamResFr()
create()
: RespuestaFrecuencia
getModuloRespFr( ) getModuloRespFr()
visualizarBode()
Ejemplo 5.2 Obtener el diagrama de secuencia del juego del frontn a partir de los documentos de requisitos (problema 2.4) y del AOO (problema 3.2). Empleando el DSS, los documentos referenciados y la aplicacin de patrones, se tiene la siguiente solucin lgica:
116
: Sistema
establecerEscenario() inicializarSaque() Calcular la posicin y velocidad de la pelota en funcin del tiempo y de las paredes
actualizarPelota(tiempo)
chocaConLineaRoja()
: Sistema
: JuegoFronton
: FrontonVisual
: CoordinadorDominio
JuegoFronton( )
establecerEscenario( ) establecerParedes( ) inicializarSaque( ) OnTimer( ) getRaqueta() actualizarRaqueta() actualizarPelota( ) pintarEscenario( ) moverRaqueta() OnKeyboardDown()
Para indicar la creacin de un objeto se emplea el mensaje create(), colocndose el objeto a la altura del mensaje de creacin. Mientras, el mensaje estereotipado con
117
<<destroy>>, con una gran X y la lnea de vida cortada, indica la destruccin explcita del objeto1. UML ofrece una rica notacin para la representacin de distintos tipos de mensajes: Mensajes condicionales: el mensaje est condicionado a que se verifique una condicin, representa una bifurcacin condicionada. UML emplea la sintaxis para las condiciones de:
[ condicin ]
Mensajes condicionales mutuamente exclusivos: Bifurcacin del tipo ifelse de carcter excluyente. La notacin es un tipo de lnea de mensaje con forma de ngulo que nace desde el mismo punto y se dirige a diferentes actividades. Iteracin para un nico mensaje: representacin de bucle de iteracin. La notacin es emplear un ndice que recorre desde una posicin inicial hasta otra final:
[ indice = posicin ]
Iteracin sobre una coleccin (multiobjetos): La coleccin de objetos se representa con una sobre lnea en la parte superior del objeto. Mensaje a <<self>> o <<this>>: mensaje sobre si mismo. Se representa mediante una flecha que se inicia en la actividad y termina sobre ella. En la figura adjunta se ha rescatado el diagrama de secuencia ofrecido en los documentos de la OMG en la versin 1.3 de UML. En l se pretende mostrar los distintos conceptos definidos.
118
5.1.3 Diagramas de colaboracin Una colaboracin modela los objetos y los enlaces significativos dentro de una interaccin. Un enlace es un camino de conexin entre dos objetos; indica que es posible alguna forma de navegacin y visibilidad entre objetos. De manera ms formal, un enlace es una instancia de una asociacin. A lo largo de un enlace pueden fluir mltiples mensajes en ambas direcciones. Cada mensaje entre objetos se representa con una expresin de mensaje, una pequea flecha que indica la direccin del mensaje y un nmero de secuencia para mostrar el orden. El orden de los mensajes se representa mediante nmeros de secuencia. El esquema de numeracin es: 1. No se enumera el primer mensaje 2. Se realiza un anidamiento de los mensajes segn el orden de salida.
Dpto. Electrnica, Automtica e Informtica Industrial 119
Ejemplo 5.2 Para el caso de uso Respuesta en frecuencia realizar el diagrama de colaboracin2.
: FiltroLineal 3: create()
4: create()
10: visualizarBode()
Vista
Tanto los diagramas de secuencias como de colaboracin muestran interacciones entre los objetos pero acentan aspectos diferentes. Un diagrama de secuencias muestra secuencias en el tiempo, pero las relaciones entre roles son implcitas. Un diagrama de colaboracin presenta las relaciones de roles, pero las secuencias estn menos claras, porque vienen dadas por los nmeros de secuencia. Cada diagrama debe ser utilizado cuando su aspecto principal sea el foco de atencin. Para la creacin de instancias, UML emplea el convenio de utilizar el mensaje denominado create(), o bien emplear otro nombre de mensaje pero acompandolo del estereotipo <<create>>. Adicionalmente, podra aadirse la propiedad UML {new} para resaltar la creacin. Igualmente, UML tiene notacin especfica para los diferentes tipos de mensajes, ya vistos anteriormente en el diagrama de secuencia.
Rational Rose convierte automticamente los diagramas de secuencia a diagramas de colaboracin y viceversa.
120
121
describe el ciclo de vida de un objeto a un nivel de detalle arbitrario, simple o complejo dependiendo de las necesidades. El diagrama de estado servir para: Comprobar que los eventos ocurren en orden correcto. Habilitar/deshabilitar elementos grficos segn el desarrollo del diagrama de estados. En un dominio con muchos eventos del sistema, la concisin y minuciosidad del diagrama de estado ayuda al diseador a asegurarse a que no se ha omitido ninguno. Ejemplo 5.3 Realizar el diagrama de estado del objeto sistema de la aplicacin de Clasificacin de los espermatozoides.
122
Inicio
Aplicacin activa, slo est activo el navegador de directorios Se pulso Parar Clasificacin
elegir directorio donde estn las imgenes No hay ficheros de imgenes a procesar El directorio elegido debe contener las imgenes a procesar La Se puls el botn de procesar las imgenes siguiente imgenes hasta el final
Se acabo el procesamiento de todas las imgenes y se activo el botn de generar resultado Generar informe: histograma, resultados, datos del cliente, laboratorio,.... Se puede imprimir el cuadro de dialogo
Fin
5.2.1 Notacin adicional Una transicin puede provocar que se dispare una accin. En una implementacin SW, esto supone la invocacin de un mtodo de la clase. Las acciones se representan mediante la barra invertida, /. Una transicin podra tener una condicin de guarda o condicin booleana-. Slo ocurre la transicin si se cumple la condicin.
[ condicin ]
Un estado puede contener subestados. Los subestados heredan la transicin del estado al que pertenece. Esta utilidad permite tener varias vistas con diferentes niveles de resolucin o complejidad del modelo.
123
introduce parmetros respuesta frecuencia[ filtro se ha creado ] Usuario introduce un nuevo esquema Respuesta frecuencia do/ Crear instancia de Respuesta en frecuencia do/ Calcular el Bode en el espectro indicado do/ Visualizar Bode exit/ Eliminar objetos de filtro y respuesta en frecuencia
En general, en las aplicaciones informticas de gestin, las clases dependientes del estado son una minora. En cambio, en los proyectos de control de procesos o en
124
aplicaciones de telecomunicaciones son frecuentes que muchos objetos sean dependientes de sus estados. Tipos de eventos: Evento externo: Tambin conocido como evento hacia el sistema, lo origina algo fuera del sistema. Evento interno: Causado por algo dentro del sistema. Evento del tiempo: Causado por la ocurrencia de una fecha y hora especficas. Un evento temporal lo dirige un reloj de tiempo real. Es preferible utilizar los diagramas de estado para ilustrar los eventos externos y de tiempo, y las reacciones a ellos; mientras los eventos internos son representados en los diagramas de interaccin. Cuando se desear tener una idea ms amplia de los efectos del comportamiento dinmico de un sistema, se emplean las vistas de interaccin. Por contra, las mquinas de estados son tiles para entender los mecanismos de control, tales como interfaces de usuario o controladores de dispositivos.
125
126
5.4.1 Los diagramas de componentes La vista de implementacin muestra el empaquetado fsico de las partes reutilizables del sistema en unidades sustituibles, llamadas componentes. Una vista de implementacin muestra los elementos fsicos del sistema mediante componentes, as como sus interfases y dependencias entre componentes. Los componentes son piezas reutilizables de alto nivel a partir de las cuales se pueden construir los sistemas. El diagrama de componentes describe la descomposicin fsica del sistema SW en componentes, a efectos de construccin y funcionamiento. La descomposicin del diagrama de componentes se realiza en trminos de componentes y de relaciones entre los mismos. Los componentes identifican objetos fsicos que hay en tiempos de ejecucin, de compilacin o de desarrollo y tienen identidad propia con una interfaz bien definida. Los componentes incluyen cdigo en cualquiera de sus formatos, DLL, Active X, bases de datos, ... Cada componente incorpora la implementacin de ciertas clases del diseo del sistema. En un diagrama de componentes se muestran las diferentes relaciones de dependencia que se pueden establecer entre componentes. Los componentes bien diseados no dependen de otros componentes sino de las interfases que ofrecen los componentes. En ese caso, un componente en un sistema puede ser sustituido por otro componente que ofrezca las interfases apropiadas. Un componente se representa mediante tres rectngulos. Ejemplo 5.5
Figura 5. 5. Diagrama de componentes: ejemplo tomado de la documentacin de UML v1.3
DominioRes pFrecuencia
127
5.4.2 Los diagramas de despliegue La vista de despliegue muestra la disposicin fsica de los recursos de ejecucin computacionales, tales como computadores y sus interconexiones. El diagrama de despliegue permite mostrar la arquitectura en tiempo de ejecucin del sistema respecto al HW y SW. Es ms limitado que el diagrama de componentes ya que slo se presenta en tiempo de ejecucin. Sin embargo, resulta ms amplio en el sentido de que puede contener ms clases de elementos. Los nodos representan los objetos fsicos existentes en tiempo de ejecucin, sirven para modelar recursos que tienen memoria y capacidad de proceso, y pueden ser computadores, dispositivos o personas. Los componentes participan en los procesos mediante los nodos. La vista de despliegue puede mostrar cuellos de botella para el rendimiento si las instancias de los componentes con dependencia se ponen en distintos nodos. Los nodos se presentan mediante paraleleppedos. Las asociaciones entre nodos representan lneas de comunicacin.
128
5.5 Cuestiones
1. Diferencias entre el diagrama de secuencia con el de colaboracin. 2. Obtener el diagrama de secuencias y de colaboracin para la aplicacin Juego de dados: se lanzan dos dados, si la suma de sus caras es siete gana; en caso contrario, pierde. 3. Utilidades de los diagramas de estado. 4. Cundo se emplear un diagrama de estado y cundo de interaccin. 5. La punzonadora semiautomtica de la figura se compone de un cilindro neumtico donde se ha ubicado solidariamente al vstago de ste, un punzn y una muesca capaz de desplazar los finales de carrera. El usuario tiene un pulsador de MARCHA. Al actuar sobre el pulsador la punzonadora pasa de la situacin de reposo al de desplazamiento mximo. Los finales de carrera 1 y 2, FC1 y FC2, marcan las posiciones anteriores respectivamente. Cuando el punzn alcanza la situacin de FC2 retornar a la de reposo, marcada por el FC1, siempre y cuando, el pulsador de MARCHA no est todava activo. Obtener el diagrama de estado. Solucin:
Posicin inicial punzonar[ Marcha && FC1 ] punzonar[ Marcha && FC1 ]
Parar maquina
129
6. Un rea de Soplante automatizacin est constituida por un plato giratorio y por tres zonas: Taladro alimentacin / evacuacin de piezas, Alimentacin / taladro y soplado (ver Evacuacin figura adjunta). En cada una de estas zonas se hacen tareas de forma simultneas respecto a las otras. El rea reservada al usuario permite introducir y retirar piezas. Si hay una pieza mecanizada, la retira e introduce otra nueva para que sea procesada. Una luz verde le indicar al usuario que puede quitar la pieza e introducir otra. Cuando haya acabado de hacer esta tarea pulsar el pedal de avance y siempre y cuando hubieran acabada las otras actividades, se producir un tercio de giro en la mesa. La pieza en la zona de taladro sufre el siguiente proceso: hay una taladradora elctrica que detecta la pieza, baja y gira la broca a derechas, alcanza el tope de taladro, sube y la broca gira a izquierdas. Cuando llega a posicin inicial se para. Una vez taladrada la pieza se pasar a quitar las rebabas mediante un soplante que expulsa aire a presin durante 10 segundos. Esta accin se combina con el giro de la pieza. Por ltimo, una luz azul sealizar el fin del ciclo. Habr un pulsador de inicio y otro de parada. No considerar la no alimentacin de piezas en cada ciclo. Determinar el diagrama de actividades. 7. Sugiera un diagrama de componentes y otro de despliegue para una aplicacin de subasta por Internet, para una galera de arte.
5.6 Problemas
Ejercicio 1 Realizar una aplicacin que ordene de forma creciente los nmeros dados por el usuario. El escenario del caso de uso OrdenarNumeros tendr un curso de xito como: 1. Ordenar los nmeros de forma creciente 1.a. Solicitar al usuario el vector de nmeros a ordenar 1.b. Ordenar de forma creciente el vector 1.c. Visualizar los resultados Se propone la siguiente arquitectura:
130
Visualizador
Diseo de la aplicacin
: GUIOrdenarNumeros
solicitarNumeros(std::vector<double>&)
OrdenadorNumeros(std::vector<double>&)
: OrdenadorNumeros
visualizarResultados( )
visualizarResultados(std::vector<double>&)
OrdenadorNumeros OrdenadorNumeros()
1 vector<double>
131
#if !defined(_ORDENADORNUMEROS__INCLUDED_) #define _ORDENADORNUMEROS_INCLUDED_ #include <algorithm> #include <vector> class OrdenadorNumeros { public: OrdenadorNumeros(std::vector<double> &) {std::sort(elVectorNumeros.begin(),elVectorNumeros.end());} }; #endif
#if !defined(_GUIORDENARNUMEROS__INCLUDED_) #define _GUIORDENARNUMEROS__INCLUDED_ #include <vector> class GUIOrdenarNumeros { public: void visualizarResultados(std::vector<double> &); void solicitarNumeros(std::vector<double> &); }; #endif #include "..\..\CABECERAS\VISUALIZADOR\GUIOrdenarNumeros.h" #include <algorithm> #include <iostream> void GUIOrdenarNumeros::solicitarNumeros(std::vector<double> &elVectorNumeros) { bool introducirDatos = true; double valor; std::cout<<"Esta aplicacion ordena los valores de forma creciente"<<std::endl; std::cout<<"Introducir la lista de numeros y poner cero para salir"<<std::endl; while(introducirDatos == true){ std::cin>>valor; if(valor != 0) elVectorNumeros.push_back(valor); else introducirDatos = false; } } void visualizarDatos(double); void GUIOrdenarNumeros::visualizarResultados(std::vector<double> &elVectorNumeros) { std::cout<<"Lista ordenada"<<std::endl; std::for_each(elVectorNumeros.begin(),elVectorNumeros.end(),visualizarDatos); } void visualizarDatos(double valor) { std::cout<<valor<<std::endl; }
132
#if !defined(_ORDENARNUMEROS_H__INCLUDED_) #define _ORDENARNUMEROS_H__INCLUDED_ #include <vector> #include "../Dominio/OrdenadorNumeros.h" #include "../Visualizador/GUIOrdenarNumeros.h" class OrdenarNumeros { GUIOrdenarNumeros elVisualizador; std::vector<double> elVectorNumeros; public: void introducirDatos(); void visualizarResultados(); }; #endif
#include "..\..\CABECERAS\ORDENARNUMEROS\OrdenarNumeros.h" void OrdenarNumeros::introducirDatos() { this->elVisualizador.solicitarNumeros(this->elVectorNumeros); OrdenadorNumeros elOrdenador(this->elVectorNumeros); } void OrdenarNumeros::visualizarResultados() { this->elVisualizador.visualizarResultados(this->elVectorNumeros); } int main() { OrdenarNumeros elOrdenar; elOrdenar.introducirDatos(); elOrdenar.visualizarResultados(); return 0; }
133
Problema 2 Disear el programa de una maquina expendedora de bebidas, de manera que recibe el producto seleccionado y las monedas que entran en el cajero desde un autmata programable. La aplicacin debe de retornar la lista de monedas mnimas a entregar al usuario. Primero se realizar la jerarqua a dos niveles de las principales caractersticas:
1. El sistema debe de mostrar los productos que ofrece y sus precios 1.1 El usuario puede elegir uno de los productos ofertados 2. El sistema debe de reconocer las monedas que se le entrega 2.1 Debe de evaluar el crdito del cliente. 3. El sistema entregar el producto cuando el cliente tenga suficiente crdito. 3.1 El sistema devolver las vueltas cuando hubiera exceso de crdito.
Seguidamente se proceder a rellenar los documentos de Visin y Alcance, glosario y el caso de uso EBP: SolicitarProducto. En el AOO se realizar el modelo del dominio y el DSS:
HWCajero
(f rom MaqExpendedora)
Moneda
(f rom MaqExpendedora)
MaquinaExpendedora
(f rom MaqExpendedora)
1 Devoluciones
(f rom MaqExpendedora)
Sistema que recibe las monedas, permite la seleccin del producto y entrega las vueltas. Se implementa con un autmata programable
: Cliente
: Sistema
visualizarProductos_precios()
solicitarProducto() recibirMonedas()
entregarProducto()
entregarVueltas()
134
Durante DOO se plantear la solucin lgico a travs de la vista de gestin, diagrama de clases de diseo, DCD, y los diagramas de interaccin:
Patrones: Alta cohesin y Bajo acoplamiento
Cajero
Comunes Maquina
Dominio
entregarProducto( )
calcularDevoluciones(std::vector<Moneda>&) entregarVueltas(std::vector<Moneda>&)
HWCajero Dinero recibirMoneda() solicitarProducto() entregarVueltas() entregarProducto() Dinero() Dinero() getCantidad() getTipoDinero() operator+=() operator-=() operator>=() operator-()
<<local>>
<<typedef>> tipoDinero
MaquinaExpendedora solicitarProducto()
<<typedef>> tipoMoneda
135
136
#include <vector> #include "../Comunes/Moneda.h" class HWCajero { public: Moneda recibirMoneda(); Dinero solicitarProducto(); void entregarVueltas(std::vector<Moneda> &); void entregarProducto(); }; //////////////////////////////////// Moneda HWCajero::recibirMoneda() { float cantidad; std::cin >> std::setprecision(2)>> cantidad; return(Moneda((unsigned)(cantidad*FACTOR_DINERO))); } Dinero HWCajero::solicitarProducto() { std::cout<<"Elegir tipo producto:"<<std::endl; std::cout<<"====================="<<std::endl; std::cout<<"1: Cafe 40 centimos"<<std::endl; std::cout<<"2: Te 35 centimos"<<std::endl; std::cout<<"3: Limon 50 centimos"<<std::endl; unsigned opcion;unsigned valor; std::cin>>opcion; switch(opcion) { case 1: valor = 40;break; case 2: valor = 35;break; default: valor = 50; } std::cout<<"Introducir monedas:"<<std::endl; std::cout<<"==================="<<std::endl; return(Dinero(valor)); } void HWCajero::entregarVueltas(std::vector<Moneda> &laListaMonedas) { std::cout<<"Lista de monedas a devolver"<<std::endl; for(unsigned i=0;i<laListaMonedas.size();i++) std::cout<<((float)laListaMonedas[i].getCantidad())/FACTOR_DINERO <<std::setprecision(2) <<std::endl; } void HWCajero::entregarProducto() { std::cout<<"Recoja el producto seleccionado"<<std::endl; }
#include "../Comunes/Moneda.h" class Ingresos { Dinero elDineroIngresado; public: Ingresos(); virtual ~Ingresos(); void anyadirMoneda(Dinero nuevaMoneda) { elDineroIngresado += nuevaMoneda;} bool haySuficienteDinero(Dinero elPrecioPedido) { return (elDineroIngresado>= elPrecioPedido ? true : false); } Dinero getDinero(){return elDineroIngresado;} };
137
#include <vector> #include "../Comunes/Moneda.h" class Devoluciones { Dinero elDineroAdevolver; public: Devoluciones(); Devoluciones(Dinero elIngreso,Dinero elPedido) {elDineroAdevolver = elIngreso-elPedido;} virtual ~Devoluciones() void calcularDevoluciones(std::vector<Moneda> &); }; ///////////////////////////////// void Devoluciones::calcularDevoluciones(std::vector<Moneda> &laListaMonedas) { if(this->elDineroAdevolver.getTipoDinero() == EURO){ while(this->elDineroAdevolver.getCantidad()>= 200){ laListaMonedas.push_back(Moneda(200)); this->elDineroAdevolver-=200; } while(this->elDineroAdevolver.getCantidad()>= 100){ laListaMonedas.push_back(Moneda(100)); this->elDineroAdevolver-=100; } //Repeticin con el resto de monedas
//........ } }
#include "../Cajero/HWCajero.h" #include "../Dominio/Ingresos.h" #include "../Dominio/Devoluciones.h" class MaquinaExpendedora { public: MaquinaExpendedora(); virtual ~MaquinaExpendedora(); void solicitarProducto(); }; ////////////////////////////////// void MaquinaExpendedora::solicitarProducto() { HWCajero miCajero; Dinero elPrecioProducto = miCajero.solicitarProducto(); Ingresos miDinero; while(miDinero.haySuficienteDinero(elPrecioProducto) == false) miDinero.anyadirMoneda(miCajero.recibirMoneda()); Devoluciones elDineroEntregar(miDinero.getDinero(),elPrecioProducto); std::vector<Moneda> laListaMonedas; elDineroEntregar.calcularDevoluciones(laListaMonedas); miCajero.entregarVueltas(laListaMonedas); miCajero.entregarProducto(); } ////////////////////////////// #include <iostream> int main() { MaquinaExpendedora laMaquinaExpendedora; bool continuar = true;char opcion; while(continuar){ laMaquinaExpendedora.solicitarProducto(); std::cout<<"Nuevo producto (s/n): "; std::cin>>opcion; continuar = (opcion == 'n') || (opcion == 'N') ? false :true; } return 0; }
138
Problema 3 Realizar una aplicacin basadas en OpenGL que permita dibujar un poblado. Las reglas de urbanizacin, en esta primera versin son muy simples, se crear el nmero de casas ordenadas en una matriz de filas y columnas. En la figura se muestra un ejemplo de un poblado de 4 filas y cinco columnas. Primero se plantea la vista de gestin para la organizacin de la ingeniera del software:
Poblado
Dominio
Comunes
OpenGL
La solucin se dar con el diagrama de clases de diseo, DCD, y con los diagramas de interaccin:
Techo Techo() <<virtual>> ~Techo() dibuja() setBase() setAltura() setPosicion() 1 Casa Casa() <<virtual>> ~Casa() setPosicion() dibuja() 1 Bloque Bloque() <<virtual>> ~Bloque() setPosicion() setBase() getAltura() dibuja()
vector<Casa>
139
Principal
Urbanizacion(unsigned, unsigned)
: Urbanizacion push_back()
: vector<Casa>
: Bloque
: Techo
setBase() setAltura( )
setBase(float) setAltura(float)
dibuja( )
operator [ ]
dibuja( )
dibuja( )
dibuja( )
: Urbanizacion 3: Casa(float, float,float) 8: setPosicion(float, float, float) 4: setBase() 13: dibuja( ) 5: setAltura( ) 9: setPosicion(float, float, float) 14: dibuja( ) : Bloque
: Casa
140
#include "..\..\INCLUDES\DOMINIO\Casa.h" Casa::Casa(float ancho, float altoBase, float altoTejado) { this->laBase.setBase(ancho); this->elTecho.setBase(ancho); this->laBase.setAltura(altoBase); this->elTecho.setAltura(altoTejado); } void Casa::setPosicion(float ax,float ay,float az) { this->laBase.setPosicion(ax,ay,az); this->elTecho.setPosicion(ax,ay+(this->laBase.getAltura()),az); } void Casa::dibuja() { this->elTecho.dibuja(); this->laBase.dibuja(); }
#include "..\..\INCLUDES\DOMINIO\Urbanizacion.h" #include "..\..\INCLUDES\comunes\glut.h" #define #define #define #define ANCHO_BLOQUE ALTO_BLOQUE ANCHO_TECHO SEPARACION_CASA 1.0f 0.5f 1.0f 3.0f
Urbanizacion::Urbanizacion(unsigned filas, unsigned columnas) { filasCasa = filas; columnasCasa = columnas; for(unsigned i = 0; i<filas; i++) for(unsigned j = 0; j<columnas; j++) { this->laListaCasas.push_back(Casa(ANCHO_BLOQUE,ALTO_BLOQUE,ANCHO_TECHO)); this->laListaCasas[(i*columnas)+j].setPosicion(SEPARACION_CASA*j, 0,SEPARACION_CASA*i); } } void Urbanizacion::dibuja() { float x_ojo=10;float y_ojo=7.5; float z_ojo=40; gluLookAt(x_ojo, y_ojo, z_ojo, // posicion del ojo 0.0, y_ojo, 0.0, // hacia que punto mira (0,0,0) 0.0, 1.0, 0.0); // definimos hacia arriba (eje Y) for (unsigned i=0;i<filasCasa*columnasCasa; i++) this->laListaCasas[i].dibuja(); }
141
Derecho de Autor 2009 Carlos Platero Dueas. Permiso para copiar, distribuir y/o modificar este documento bajo los trminos de la Licencia de Documentacin Libre GNU, Versin 1.1 o cualquier otra versin posterior publicada por la Free Software Foundation; sin secciones invariantes, sin texto de la Cubierta Frontal, as como el texto de la Cubierta Posterior. Una copia de la licencia es incluida en la seccin titulada "Licencia de Documentacin Libre GNU".
La Licencia de documentacin libre GNU (GNU Free Documentation License) es una licencia con copyleft para contenidos abiertos. Todos los contenidos de estos apuntes estn cubiertos por esta licencia. La version 1.1 se encuentra en http://www.gnu.org/copyleft/fdl.html. La traduccin (no oficial) al castellano de la versin 1.1 se encuentra en http://www.es.gnu.org/Licencias/fdles.html
142