Diseño y Programación Orientados a Objetos
1er. Sem 2014
Tarea 2: Simulación Gráfica de Bolas, Puntos fijos, y Resortes 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 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.
* Conocer el patrón de diseño "Modelo-Vista-Controlador"
* 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 (puntos fijos); pero esta vez se hace en forma gráfica y se agrega el objeto elástico (Créditos extras). Los elásticos se pueden modelar como resortes con constante de elasticidad no nula cuando está estirado más allá de su largo en reposo, y con constante de elasticidad nula si la distancia entre sus extremos es inferior a su largo en reposo. La representación gráfica de un elástico será la de una trazo recto (línea recta).
Como en la tarea 1, esta vez su grupo deberá desarrollar cuatro etapas o ciclos en un proceso de desarrollo iterativo e incremental. En esta metodología cada ciclo (etapa) debe generar una versión ejecutable de la solución.

Etapa 1:  En esta etapa su grupo es libre de usar el siguiente código de partida y completarlo hasta que su aplicación muestre su interfaz gráfica como la de la Figura 1, la cual incluye una configuración de solo bolas.

Choque elástico de bolas
Figura 1: Interfaz para Etapa 1, choque elástico de bolas.

Etapa 2
: Ésta incorpora un menú a la Etapa 1 con las opciones mostradas. Adicionalmente a lo hecho en Etapa 1, usted puede usar el siguiente código para inspirarse en lo que falta. En este ciclo sólo la opción insert-scenario del menú "Conffiguration" responde creando el escenario mostrado. Todas las opciones del menú MyWorld responden iniciando o pausando la simulación y cambiando parámetros del simulador (tiempo de refresco y delta tiempo. La simulación puede ser reanudada cuantas veces se desee.

GUI Etapa 2
Figura 2: Etapa 1 con interfaz gráfica para insertar un escenario predefinido y con las opciones del menu MyWorld funcionando.

Etapa 3: En este ciclo de desarrollo se incorporará las clases resorte (Spring) y punto de apoyo fijo (FixedHook). Archivos adicionales están aquí. La opción para insertar bolas, resortes, o puntos fijos se mantienen sin acción. Sólo la opción "My scenario" genera el escenario mostrado que luego puede ser simulado con las opciones de MyWorld de la Etapa 2. El fuerte de este ciclo es otorgar una vista gráfica a los puntos fijos (FixedHook) y resortes (Spring). 

Interacción de resortes y bolas.
Figura 3: Se extiende Etapa 2 para permitir incorporación del escenario mostrado, es decir agrega Spring y FixedHook con su vistas.

Etapa 4: Teniendo todos los elementos gráficos de la Etapa 3, además de incorporar un escenario como el mostrado en Figura 4, usted debe reaccionar ante las opciones Insert -> Ball, Fixed Hook, y Spring.  Archivos adicionales están aquí. La inserción ubica el elemento físico en alguna parte de la recta y luego usted podrá desplazarlo presionando y arrastrando el mouse. La edición de las configuraciones sólo se debe permitir mientras la simulación esté detenida.


Sistema completo
Figura 4: Extensión de la Etapa 3 para permitir edición de las configuraciones usando el mouse.


Trabajo a desarrollar
No obstante se sugiere desarrollar cada etapa en el orden indicado, su grupo debe entregar el código de la última (Etapa 4) y así simplificar su entrega (Esto en consideración a lo solicitado por el grupo de Andrés y Marco). Si no logra llegar hasta aquí, entregue el cóodigo hasta la etapa mayor alcanzada. En este caso recuerde que cuenta el la ayuda del profesor y ayudante para desarrollar todas las etapas.
En su código de la Etapa 4, al mover el mouse sobre objetos sobrepuestos, seguramente sólo se seleccionará uno de ellos. Modifique el código para que presionando la tecla n (por next) se rote seleccionando cada uno de los objetos que contienen al posición del mouse. Si se trata de sólo uno, el ciclo sólo incluye a ese único.

Resultados Esperados de su Grupo
Usted deberá documentar, usando notación "JavaDoc" la clase Ball, BallView y MyWorld.
En su archivo archivo makefile (explicación) para compilar y ejecutar su tarea en aragorn, 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 ganarse 5 puntos extras su solución debe permitir insertar bloques (Block) con roce cinético (por simplicidad de la física no considere roce estático, la gravedad debería ser un atributo de MyWorld). Si su grupo desea optar a otros 5 puntos extras, debe incorporar elásticos (Rubber o Elastic, como usted quiera llamarlo) en 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 ante cualquier dudas.

Sobre la arquitectura Modelo Vista Controlador
Para organizar interfaces gráficas una solución de software general y recomendada (éstas son conocidas como patrones de diseño) 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 el modelo, también las clases Ball, Spring, FixedHook para esas categorias de objetos. Por otro lado tenemos las vistas, estas clases indican cómo esos datos se muestras visualmente. Estas clases representan visualmente los objetos del problema. En nuestro caso MyWorld, Ball, Spring y FixedHook poseen sus vistas en las clases MyWorldView, BallView, SpringView, y FixedHookView. No es el caso de esta tarea, pero por ejemplo un objeto termómetro podría 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. En esta tarea, la clase MyWorld actúa también como controlador (pues implementa el listener del paso del tiempo que luego modifica su estado). Otras clases controladoras son el listener que responde a las opciones de selección del menú y el listener que responde a los eventos del mouse, el cual cambia de posición los objetos contenidos en la interfaz gráfica.  Puede leer más sobre Model-View-Controller.
Patrón de Diseño: MOdelo-vista-controlador

Fig. : Una forma de interacción típica de las componentes del patrón de diseño modelo-vista-controlador.

Sobre ejes coordenados
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 conveniente que un pixel corresponda a un metro. Si bien la programación se simplificaría así, en esta tarea se ha incluido el mecanismo para transformar coordenadas del mundo físico a los pixeles de una ventana gráfica. Cabe mencionar que 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, estas transformaciones están incluidas en el código base para esta tarea. Si desea saber más o entender mejor este tema, ya sabe por dónde buscar.