Diseño y Programación Orientados a Objetos
1er. Sem 2011
Tarea 4: Bolas, Resortes y Ganchos Fijos como Objetos de Software en C++

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:
* Reconocer clases y relaciones entre ellas en códigos fuente C++.
* Ejercitar el diseño e implementación de clases en C++.
* Ejercitar la entrada y salida de datos en C++
* Ejercitar la creación de archivos con extensión .csv y su importación a planillas electrónicas.

Descripción General
  En esta tarea se modela la interacción objetos reales resortes, bolas 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 bolas, 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 le pide construir configuraciones de bolas, resortes (nunca dos bolas o resortes juntos) y ganchos fijos de cualquier tipo en R2. Un ejemplo de tales configuraciones se muestra en la Figura 1.   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 compilable en aragorn usando:
  $ make
Su tarea será ejecutada en aragorn usando:
 $ make run [FILE=nombre del archivo de salida]
El uso de [..] significa uso opcional. Si se omite, el programa asume que la salida debe ser enviada a la pantalla.
Una vez iniciado, el programa pide por teclado algo del tipo:
Ingrese delta: <Aquí el usuario ingresa delta tiempo>
Ingrese tiempo a simular: <ingresa tiempo total de simulación>
Ingrese tiempo entre escrituras del estado del sistema en la salida: <tiempo de muestreo>

Luego el programa corre hasta generar toda la salida indicada. En archivo o en pantalla debería generar algo del tipo:
Time,Hook #0: (x,y),,Spring #0: (x0,y0),(x1,y1),,Ball #0: (x,y),,Spring #1: (x0,y0),(x1,y1),,Ball #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, la salida sólo incluye las posiciones de cada objeto.
Usted deberá entregar los siguientes archivos:
- readme
- makefile
- Archivo de Documentación: éste incluye la Figura 2 y un gráfico (y,t) que muestre la posición y de la bola colgante como función del tiempo para 0<t<"tres periodos". Este archivo además debe incluir el esquema de la Figura 1 y un gráfico (X,Y) de la trayectoria del bola 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í.

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
* 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).
* Dé una mirada a archivos make files usados en este tutorial y ejemplos vistos en clases.
* No dude en consultar al profesor o ayudante sobre dudas de esta tarea.