Diseño y Programación Orientados a Objetos
1er. Sem 2010
Tarea 2: Simulación Gráfica de Masas, Resortes y Cuerdas 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:
* Generar documentación con Javadoc.
* 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.

Descripción General
  Como en la tarea 1, en esta tarea se modela la interacción de resortes y bloques; pero esta vez se hace en forma gráfica y se agrega el objeto cuerda. Las cuerdas se pueden modelar como resortes con constante de elasticidad "muy grande" cuando intentamos estirar la cuerda y con constante de elasticidad nula si intentamos acortar la cuerda. La representación gráfica de una cuerda será la de una trazo recto simple.
  Su grupo no partirá desde cero. Aquí usted encontrará los archivos que permiten generar configuraciones de un número arbitrario de resortes y bloques. Cada bloque admite más de un resorte.
Una vez construida la configuración. Ésta se puede detener en cualquier momento, como se aprecia en la Figura 1. La interfaz permite cambiar la posición de bloques y resortes. En general se puede modificar lo actual e incorporar más elementos a la simulación. La simulación puede ser reanudada cuantas veces se desee.
Simuación en ejecución
Figura 1: Simulación en un momento de detención

Trabajo a desarrollar
Usted verá que la aplicación permite incorporar bloques y resortes; sin embargo, su estado inicial está predefinido. Usted deberá crear alguna interfaz gráfica para especificar los atributos de cada resorte y cada bloque. Esta especificación debe hacerse al momento de crear un resorte, bloque o cuerda.
Su principal aporte en esta tarea será la creación una nueva categoría de objetos: las cuerdas. Se espera que usted cree la clase MyString, para modelar la parte física de las cuerdas, esto es sin representación gráfica. Además se espera que usted cree la clase GString, que incorpora  la representación gráfica de sus cuerdas. Como los resortes, las cuerdas sólo se pueden "amarrar" a bloques.
Para incorporar cuerdas, usted deberá crear tal opción en el menú "Insert".
Usted deberá documentar, usando notación "JavaDoc" las clases por usted creadas.
Además su grupo es instado a encontrar errores de ejecución o mejorar el modelo dinámico de lo ya entregado. Por estas mejoras su grupo puede optar hasta 10 puntos extras (máx. 110).

Resultados Esperados de su Grupo
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.
En su archivo de documentación incorpore además un diagrama de secuencia. Éste debe mostrar la secuencia de invocaciones generadas al soltar el botón del mouse luego que usted ha arrastrado el segundo extremo de la cuerda a un bloque.

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.
La tarea llega hasta aquí; sin embargo, usted también puede ganar ese extra crédito (10 puntos, no acumulables con las mejores ya señaladas) si usted agrega la opción de poner gravedad en el ambiente. Siga considerando todo en dos dimensiones; sólo que en lugar de tener todo sobre una mesa, todo estará vertical. Para que pueda afirmar las cosas, seguramente deberá crear un tipo de bloque fijo, es decir no afecto a la gravedad.
Considere una mirada a MyPhisicsLab, para que vea qué tan lejos está de lo que otros han hecho.

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 manejan el modelo de datos o los objetos que almacenan los datos significativos del problema. En este caso la clase BlockSpringConfiguration maneja parte del modelo. Por otro lado tenemos el la interfaz gráfica. Éstas 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.

OBS: En los códigos dados inicialmente, se aproximó v= vo+a*delta_t; como la aceleración varía, esta aproximación para v(t) generó un error acumulado que se reflejó en un incremento  sostenido de la energía del sistema.  Esto llevó a buscar una mejor aproximación para v(t). Ésta se explica aquí, y es la implementación disponible en aquí a partir del 12 de junio 2010.