Diseño y Programación Orientados a Objetos
1er. Sem 2015
Tarea 3:
Bolas, Resortes, Osciladores y Amortiguadores como Objetos de Software en C++

Lea detenidamente la tarea. Si algo no lo entiende, consulte en clases. Si es preciso, se incorporarán aclaraciones al final.
Objetivos
* Reconocer clases y relaciones entre ellas en códigos fuente C++.
* Aplicar el diseño e implementación de clases en C++.
* Aplicar sobre carga de operadores.
* Aplicar la entrada y salida de datos en C++
* Aplicar 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 de objetos reales al igual que la tarea 1, excpeto que esta vez su grupo lo hará en C++ y trabajando en un espacio de dos dimensiones.


Figura A: Una Configuración Posible (Su grupo define posiciones verticales no indicadas)

Para llegar al resultado final usted aplicará una metodología "Iterativa e Incremental" para el desarrollo de software. Su grupo irá desarrollando etapas que irán abordando los requerimientos de la tarea de a poco. En cada etapa usted obtendrá una solución que funciona para un subconjunto de lo que se desea al final. Usted deberá entregar soluciones para cada una de las etapas aún cuando la última integre las primeras.

Primera Etapa
Como primer paso, su grupo debe completar el código adjunto y completar lo que sea necesario para correr PhysicsLab.cpp proporcioando para esta etapa.

Figura 1:  Bola con movimiento rectilineo uniforme.
Para evidenciar que su programa funciona bien, en la documentación su grupo debe presentar una gráfica x v/s t para la posición de la bola en el tiempo para los primeros 5 segundo.
Segunda Etapa
Como segundo paso, complete el código con la clase resorte (Spring) de manera que el nuevo PhysicsLab.cpp refleje la configuración de la Figura 2.

Figura 2: Dos bolas acopladas por un resorte. Se muestra estado inicial.
Para evidenciar el funcionamiento de esta etapa, en la documentación presente la figura 2 y una gráfica x v/s t para la posición de la bola izquierda.
Tercera Etapa
Complete el código de la etapa previa agregando la clase oscilador y prepare los archivos para que PhysicsLab.cpp refleje la configuración de la Figura 3.

Figura 3: Un oscilador y una bola unidos por un resorte. Se muestra estado inicial.
Para evidenciar el funcionamiento de esta etapa, en la documentación presente la figura 3 y una gráfica x v/s t para la posición de la bola.
Cuarta Etapa
Complete el códigoo agregando la clase amortigudor (dashpot). Entregue el código completo para simular la configuración de la Figura A y entregue gráficas para x v/s t ,  y v/s t  y x v/s y para la posición de la bola conectada a ambos resortes para los primeros n segundos (su grupo elige n).

Resultados Esperados de su Grupo Para cada etapa genere un directorio con la solución hasta esa etapa. 
Cada etapa puede ser ejecutada de dos formas:
Desde consola con: $ PhysicsLab  <delta tiempo>  <tiempo total a simular> <periodo de muestreo>
o vía su makefile con: $ make run
En este último caso, es decir ejecución sin parámetros, su programa debe pedir los parámetros por terminal usando:
Ingrese delta: <Aquí el usuario ingresa delta tiempo>
Ingrese tiempo a simular: <ingresa tiempo total de simulación>
Ingrese tiempo entre escrituras en la salida del estado del sistema: <tiempo de muestreo>
La salida a pantalla debe tener formato que permita su manejo con una planilla electrónica. Para esto use TABs u otro separador adecuado. Una salida posible es:
Time    FixedHook_0:x,y  FixedHook_1:x,y   Spring_0: a_end x,y    b_end x,y     Spring_1: a_end x,y    b_end x,y   Ball_0:x,y    Ball_1:x,y   
0.0                            0.5, 0                    1.5, 0                      0.5, 0                1, 0.5                1, 0.5                1.5, 0            1, 0.5        1, 0  
0.10000000000000184    0.5, 0                1.5, 0                    0.5, 0                 .....
/* 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:
- makefile  (uno por etapa)
- readme  (solo uno por toda la tarea)
- Archivo de Documentación (uno por toda la tarea): En éste incluya la figura de la configuración de las etapas 1, 2, y , y el gráfico (X,t) que muestre la posición X de cada bola participando en la configuración en función del tiempo para 0<t<20[s] (o un rango adecuado). Para la etapa 4 incluya gráficos x v/s t ,  y v/s t  y x v/s y para la posición de la bola conectada a ambos resortes.

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
* Para enviar los datos a un archivo de salida, re-direccione la salida a pantalla usando:
$ PhysicsLab 0.0001 10 0.033  > miSalida.csv
* Dé una mirada al desarrollo parcial de la este sistema. Si encuentra errores o algo que pueda ser mejorado, avise al profesor.
* Dé una mirada a archivos make files usados en las  mejores soluciones de años previos.
* 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 mucho más general.
* No dude en consultar al profesor o ayudante sobre dudas de esta tarea.