Diseño
y Programación Orientados a Objetos
1er. Sem 2012
Tarea 2: Simulación Gráfica de Bolas Móviles y Paredes como Objetos de
Software
Recomendación: Lea detenidamente la tarea. Si algo no lo
entiende, consulte en clases. Si es preciso, se incorporarán
aclaraciones al final.
Esta tarea tiene por objetivos:
* Ejercitar la configuración de un ambiente de trabajo para desarrollo
de aplicaciones en lenguaje Java (se ha sugerido trabajar con Jgrasp, Eclipse o NetBeans )
* Creación de Interfaces gráficas en Java
* Manejar eventos de software.
* Ejercitar la creación y extensión de clases dadas para satisfacer
nuevos requerimientos.
* Modelar un objeto físico como un objeto de software.
* Ejercitar una estrategia para programar simulaciones de fenómenos
continuos.
* Generar documentación con Javadoc.
Descripción General
En esta tarea su grupo extenderá la solución de la Tarea 1 para incorporar una interfaz gráfica a
su código. Además tendremos paredes sólidas rectas de tamaño
finito. Estos objetos están inmersos en un
campo de gravedad constante y con una fuerza disipativa (roce de
fluido)
que supondremos proporcional a la magnitud de la velocidad y el radio
de cada bola.
Para calcular la dinámica de bolas sujetas a fuerzas externas, revise este
material y éste
para los choques.
Se pide que su aplicación ofrezca opciones de un menú para
insertar elementos (bolas y paredes) borrar elementos. Otra opción le
permitirá controlar la dinámica del mundo virtual que aloja toda la
simulación. Se podrá detener y reiniciar la simulación, cambiar
parámetros del ambiente (viscosidad, gravedad) y cambiar parámetros del
simulador (paso temporal y periodo de refresco de pantalla). Todo se da
en una superficie horizontal sin gravedad o vertical al poner gravedad.
Figura 1: Imagen de un escenario posible en R2
Trabajo a desarrollar
Usted
verá que la aplicación entregada permite incorporar bolas, paredes y un
escenario predefinido. Se desea que su grupo haga las siguientes
mejoras y
extensiones:
1.- En menú "Element" agregar opción "Delete". Cuando ésta es
seleccionada, el curso cambia a forma + (o similar) y se eliminará el
próximo objeto en que presionemos y soltemos el botón izquierdo del
mouse.
2.- Extensión: Edición de paredes y bolas. Al seleccionar una pared
ahora usted no solo podrá trasladarla, sino también cambiar su
longitud. Ambas cosas debe hacer gráficamente. Para el caso de las
bolas, agregar un constructor que permita definir el color de las
bolas; además usted podrá cambiar el color , peso y radio de alguna
bola seleccionada presionando el botón derecho del mouse en una bola
seleccionada.
3.-
Agregar el submenú "Energy Plot" en menú MyWorld. Energy Plot
mostrará la opción On y Off. Con On ensanchará la ventana principal de
la aplicación para mostrar un nuevo JPanel el cual mostrará un gráfico
con tres curvas, Energía Potencial total del sistema, Energía Cinética
total y la energía mecánica total (Potencial + Cinética). La opción Off
elimina el gráfico y recupera el tamaño de la aplicación. Cada vez que
seleccionamos On, el gráfico comienza nuevamente.
4.- Cambie el escenario predefinido. Por ejemplo, si pone bolas de igual
dos densidades distintas, yo esperaría que en presencia de gravedad,
las más pesadas tiendan a quedarse abajo. Si usted pone una caja con un
hoyo con varias pelotas en lo alto, luego pone otra vacía en la parte
baja (sin hoyo), y entre ambos paredes con forma de escalera, en
presencia de gravedad y viscosidad, deberían verse caer las bolas de
una caja a la otra.
Documentación
Su grupo deberá documentar, usando notación "JavaDoc", la clase Vector
2D y la clase MyWorld.
Prepara un archivo
makefile (explicación)
para compilar y ejecutar su tarea en aragorn. Además incluya rótulos
"clean" para borrar todos los .class generados y "doc" para generar la
documentación en directorio "documentation".
Entregue todo lo indicado en Normas
de Entrega de Tareas. Su documentación automática con javadoc debe
ser generable con:
$ make doc
No incluya las páginas html generadas por javadoc, éstas serán
generadas por este comando cuando el ayudante las revise.
En su archivo de documentación (pdf o html)
incorpore el diagrama de clases
de la aplicación. Para el caso del código entregado, éste es el diagrama. Éste lo puede generar con jgrasp u otro programa.
Créditos extras: Su grupo
puede recibir hasta 10 puntos adicionales si las paredes de programa
pueden ser de orientación arbitraria. La nota máxima sigue siendo 100,
pero su posible trabajo adicional le permitirá compensar algún lado
bajo de su solución. Ojo esto es
opcional, usted debe rendir bien en los otros ramos también.
Ayudas
Dé una mirada a la solución parcial
al problema. Si encuentra errores o algo que pueda ser mejorado,
indíquelo claramente.
No dude en consultar al profesor o ayudante sobre dudas de esta tarea.
Sobre la arquitectura Modelo Vista
Controlador
Para
organizar interfaces gráficas una arquitectura de software
recomendada es la "modelo-vista-controlador". El modelo es el conjunto
de clases que caracterizan a los objetos y almacenan
los datos significativos del problema. En este caso las clases Ball,
Wall y
MyWorld maneja parte del modelo. Por otro lado tenemos las vistas, cómo
esos datos se muestras visualmente. Estas clases representan
visualmente los
objetos del problema, por ejemplo GBall y GWall. No es el caso nuestro,
pero por ejemplo el objeto
termómetro puede tener varias formas de mostrarse, como columna de
mercurio, como número digital, como un color, etc. Finalmente tenemos
el controlador. Las clases controladoras son aquellas que modifican los
datos, por ejemplo a través de las acciones del usuario en la interfaz.
Generalmente las clases controladoras son los "listeners" o manejadores
de los eventos que usted estima de interés. Puede leer más sobre Model-View-Controller.
Sobre ejes coordenados y gravedad
El código facilitado en esta tarea hace un manejo de coordenadas más
cercano a la realidad. Lo directo en interfaces gráficas es manejar
pixeles como unidad de medida espacial. Ciertamente
no es muy conveniente que un pixel corresponda a un metro, pero así las
cosas se simplifican si su grupo lo desea. Por otro lado, la coordenada
(0,0)
de los JPanels está en el extremos superior izquierdo y no en el
inferior izquierdo como podría ser en ejes coordenados más habituales
en geometría y física. Para colmo el eje crece hacia
abajo, cuando lo habitual es que crezca hacia arriba. Para
corregir los ejes y cambiar la escala entre pixeles y distancia en
metros, el código proporcionado usa la clase AffineTransform (transformada afín).