Diseño y Programación Orientados a Objetos
1er. Sem 2011
Tarea 2: Simulación Gráfica de Bolas, Puntos fijos, Resortes y Elásticos 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:
* Crear 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
  Como en la tarea 1, en esta tarea se modela la interacción de resortes, bolas y ganchos fijos en presencia de roce y gravedad; pero esta vez se hace en forma gráfica y se agrega el objeto elástico. Los elásticos se pueden modelar como resortes con constante de elasticidad no nula cuando lo intentamos estirar, y con constante de elasticidad nula si lo intentamos acortar. La representación gráfica de un elástico será la de una trazo recto (línea recta).
Su grupo no partirá desde cero. Aquí usted encontrará los archivos que permiten generar configuraciones de un número arbitrario de resortes, bolas y ganchos fijos. Cada bola o gancho admite más de un resorte. Usted también puede ver el Diagrama de Clases para el código entregado. Se eliminó la clase Vector2D para facilitar su lectura.
Una vez construida la configuración con opción "Configuration", ésta se puede iniciar y detener en cualquier momento, como se aprecia en la Figura 1. Mientras la simulación está detenida, la interfaz permite cambiar la posición de los objetos y reconectar los resortes según se desee. Se pueden agregar más elementos luego de detener la simulación. La simulación puede ser reanudada cuantas veces se desee.
 Ball and spring simulation GUI
Figura 1: Simulación a punto de cambiar seleccionar tiempo de refresco

Trabajo a desarrollar
Usted verá que la aplicación entregada permite incorporar bolas, ganchos fijos y resortes. Se desea que su grupo haga las siguientes mejoras y extensiones:
1.- Mientras la simulación está corriendo es posible ingresar más objetos; sin embargo, no es posible reubicarlos. Modifique el código para que sólo sea posible agregar objetos mientras la simulación esté detenida.
2.- En menú "Configuration" 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.
3.- Agregar el ítem "Resume" en menú MyWorld.  Resume tomará la funcionalidad actual de "Start", esto es se retomará la simulación con las condiciones de velocidad de las bolas previa a "Stop"."Start" ahora retomará la simulación fijando primero velocidad cero a todas las bolas del sistema.
4.- En sub-menú "Insert" bajo "Configuration" agregar "Rubber" (o "Elastic", como usted desee llamarlo). Este objeto actúa similar a un resorte, se puede enganchar en sus extremos. Su apariencia es la de una línea. Cuando está estirado, ejerce una fuerza que sigue la ley de Hook. Cuando su extensión es menor a su estado de reposo, ejerce fuerza cero.
Por simplicidad, los atributos de todos los objetos serán mantenidos según el código proporcionado. El largo en reposo y constante elástica de los elásticos será el mismo que el de los resortes.

Resultados Esperados de su Grupo
Usted deberá documentar, usando notación "JavaDoc" todas las clases adicionales a las ya entregadas (es decir aquellas por usted creadas).
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
(OJO 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. Éste lo puede generar con jgrasp u otro programa.
Créditos extras: usted puede aspirar a un puntaje adicional de 10 puntos. Para los primeros 5 puntos extras, al interior de cada bola, muestre su peso (un número) y en el medio de resortes y elásticos su constante elástica. Para optar a los 5 puntos adicionales, incluya una manera para editar la masa de las bolas y las contantes elásticas de resortes y elásticos. 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 la clase 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. 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
En esta tarea estamos usando coordenadas que facilitan el despliegue de los objetos y la interpretación de los eventos del mouse. Ciertamente no es muy conveniente que un pixel corresponda a un metro, pero así las cosas se simplifican en esta tarea. 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, se puede usar la clase AffineTransform (transformada afín). Como hay más ramos en los que usted debe rendir bien, no incursione por ahora en estos temas, pero ya sabe por donde buscar. He aquí el código de partida para esta tarea en el cual ya se hacen estas correcciones.