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. 

3 Ball Scenario
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).