Diseño y Programación Orientados a Objetos
1er. Sem 2011
Tarea 1: Masas, Resortes y Ganchos Fijos 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 )
* Reconocer objetos de software como modelos de objetos reales.
* Reconocer clases y relaciones entre ellas en códigos fuentes Java.
* Ejercitar el diseño e implementación de una clase simple (Vector2D).
* Ejercitar la extensión de clases dadas para satisfacer nuevos requerimientos.
* Ejercitar la entrada y salida de datos.
* Conocer el formato .csv y su importación a planillas electrónicas.
* Ejercitar la preparación y entrega de resultados de software (creación de readme, documentación y agrupación de una colección de archivos en uno "tar").
* Aprender una estrategia para programar simulaciones de fenómenos continuos.

Descripción General
  En esta tarea se modela la interacción objetos reales resortes, bloques y ganchos fijos sujetos a las leyes de la "naturaleza". A partir de estos modelos se construyen clases de software para crear objetos de software que representarán a los objetos reales. En física usted estudió la interacción de masas y resortes. Para calcular su dinámica, en esta tarea las masas serán modeladas como masas puntuales. Decimos que este es un modelo y no la realidad porque sabemos ninguna masa es puntual; sin embargo, esta suposición simplificará nuestro planteamiento y nos permitirá obtener resultados con precisión satisfactoria para nuestros fines. Los resortes serán modelados sin masa y cumplirán la ley de Hooke sin límite de elasticidad, es decir, Hooke vale en todas las extensiones del resorte. Los ganchos sirven para fijar extremos de resortes en puntos del espacio. 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.
  Una vez que las clases básicas estén definidas, usted creará instancias de bloques, resortes y ganchos; luego los conectará para formar un experimento a simular. Notar que aquí aparece otro actor: un simulador. El simulador no es más que el modelo del paso del tiempo, el cual será informado a cada objeto. El tiempo avanzará en pasos discretos en lugar de un continuo y así iremos avanzando en nuestra simulación de a pasos "pequeños" (deltas de tiempo). Para calcular la dinámica de masas sujetas a fuerzas externas, revise este material.
  Esta tarea les pide construir configuraciones de masas, resortes (nunca dos masas o resortes juntos) y ganchos fijos de cualquier tipo en R2. Un ejemplo de tales configuraciones se muestra en la Figura 1.   Para ello usted contará con una solución bastante avanzada del problema en R. Una vez que la configuración esté armada se inicia la simulación por un tiempo definido por consola. Los resultados, es decir las posiciones de los cuerpos en el tiempo, serán escritas en pantalla. Luego usted debe importar sus datos en una planilla electrónica para generar gráficos del movimiento de sus objetos.
Experimento posible
Figura 1: Imagen de una configuración posible

Resultados Esperados de su Grupo
Su tarea debe ser ejecutable en aragorn.elo.utfsm.cl usando:
  $ java PhysicsLab <periodo de muestreo> <delta tiempo>  <tiempo total a simular>
La salida del programa será a pantalla.

Luego el programa corre hasta generar toda la salida indicada. En pantalla debería generar algo del tipo:
time,Hook #0: (x,y),,Spring #0: (x0,y0),(x1,y1),,Block #0: (x,y),,Spring #1: (x0,y0),(x1,y1),,Block #1: (x,y)
0.0,0.0,3.0,,0.0,3.0,1.0,2.0,,1.0,2.0,,1.0,2.0,-0.3,0.2,,-0.3,0.2
/* aquí omito el resto de las líneas */
Para efectos de esta tarea, el estado de salida sólo incluye las posiciones de cada objeto.
Usted deberá entregar los siguientes archivos:
- readme
- Archivo de Documentación: éste incluye la Figura 2 y un gráfico (y,t) que muestre la posición y de la masa colgante como función del tiempo para 0<t<"tres periodos". Para este experimento use los datos del experimento proporcionado en los fuentes. Este archivo además debe incluir el esquema de la Figura 1 y un gráfico (X,Y) de la trayectoria del bloque más alejado del gancho desde 0<t<"tiempo a definir por usted", use los datos iniciales del ejemplo de salida más arriba, ambas masa de 1 [kg] y en reposo;  constantes elásticas iguales a 10 [N/m] y largos en reposo de 1.0 [m]; g=9.8 [m/s2]; fricción del aire de 0.5 [Ns/m]. Indique las dificultades encontradas y cómo las resolvió. Si usted desea analizar otro caso, puede hacerlo e incluirlo aquí.
- Archivo Vector2D.java donde usted describe su clase para representar vectores en R2.
- Archivo Spring.java donde cada resorte opera en un plano de dos dimensiones.
   Esta clase debe admitir los mismos constructores del caso en R.
- Archivo Block.java para bloques en el plano.
   Esta clase debe admitir el siguiente constructor de Bloques:
   public Block(float mass, Vector2D position, Vector2D speed);
-Archivo FixedHook.java para ubicar ganchos en el plano. Esta clase debe admitir el constructor:
   public FixedHook(Vector2D position);
   La idea de acordar algunas cosas, así el ayudante puede construir su propio experimento y usar su implementación para generar otros resultados.
- Los archivo PhysicsLab.java,  PhysicsElement.java,  MyWorld.java, y AttachableElement.java casi no deberían diferir del proporcionado más abajo.
- Archivo ExperimentConfiguration.java éste contendrá su configuración para el experimento de la Figura 1.
Experimento simple en R
Figura 2: Gancho a 3 [m] de altura, masa de 1 [kg] y rapidez inicial cero, resorte de largo en reposo de 1.5 y constante elástica 10; g=9.8 [m/s2], sin fricción.
El gráfico para el experimento de la Figura 2 debería ser similar al de la Figura 3.
Gráfico x v/s t típico
Figura 3: Gráfico para el experimento de la Figura 2.
Obviamente su programa no generará el dibujo ni el gráfico. Puede usar el dibujo aquí incluido y el gráfico lo puede generar con una planilla de cálculo a partir de los datos de salida de su programa.

Ayudas
* Dé una mirada a la solución del problema en R. Si encuentra errores o algo que pueda ser mejorado, avise al profesor.
* Para enviar los datos a un archivo de salida, redireccione la salida a pantalla usando:
$ java PhysicsLab 0.1 0.001 5  > miSalida.csv
  Luego trate este archivo como si fuera planilla electrónica. Usted podrá usar las "comas" como separador de columnas.
* Algo parecido a lo que usted hará (mejor) está en myphysicslab. La forma de abordar la simulación en esta tarea es distinta y a mi juicio más general.
* No dude en consultar al profesor o ayudante sobre dudas de esta tarea.
* La fuerza de fricción con el aire depende el aire y forma del cuerpo. En esta tarea la modelaremos como proporcional a la velocidad del cuerpo (es una aproximación válida cuando no hay turbulencias -caso velocidades bajas). La constante de proporcionalidad la podemos modelar de dos formas: como constante para todas las masas, o como el producto de la viscosidad del aire por un factor que depende de la geometría de cada cuerpo. Si usamos el primer enfoque, la Constante de Roce Viscoso (viscous friction constant) , será un atributo más de MyWorld (similar a g). Si usamos el segundo enfoque, podemos asociar la viscosidad del aire a MyWorld y una constante "crossSection" (sección eficaz)  a cada masa. La Constante de Roce Viscoso en este último caso será el producto de ambas (06.04.11).

Nociones de simulación de fenómenos continuos
La idea básica usada en esta tarea es discretizar el tiempo; para cada instante discreto, congelamos  el tiempo y pedimos a cada objeto del experimento calcular cuál será su estado futuro (delta t más tarde) a partir del estado actual y las condiciones en que está sometido. Es importante congelar el tiempo y hacer este cálculo en cada objeto. Luego pedimos a todos actualizar su estado basado en lo calculado y avanzamos el tiempo en ese delta. Esta simple idea trabaja bien aquí y en muchas situaciones, pero no en todas; por ejemplo si deseáramos  permitir que dos resortes estén juntos uno después del otro. En estos casos, como aproximación podemos usar una masa pequeña entre ambos. Si quisiéramos pegar dos bloques juntos, podemos poner un resorte muy pequeño entre ambos con constante elástica "infinita". Lo mismo si deseamos modelar barras rígidas.
Una vez hecha la tares, usted debería notar que es posible incorporar roce o gravedad.  Cuerdas pueden ser modeladas como resortes con constante elástica "infinita" cuando se extiende respecto al reposo y cero cuando se acorta respecto a su largo de reposo.
Se puede jugar bastante, pero en algunos casos es posible encontrar problemas de acondicionamiento numérico; por ejemplo si usa masas cero, aparecerá una división por cero. Por otro lado este ramo no es el único donde deben rendir bien este semestre.