Diseño y Programación Orientados a Objetos
1er. Sem 2010
Tarea 1: Masas y Resortes 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 y bloques. A partir de estos modelos se construyen clases de software para crear objetos de software que representarán los objetos del modelo. En física usted estudió la interacción de masas y resortes. En esta tarea las masas serán modeladas como masas puntuales. Decimos que este es un modelo y no la realidad porque como 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. El sistema lo supondremos ausente de toda otra fuerza (roce, gravitacional, etc).
  Una vez que las clases básicas estén definidas, usted creará instancias de bloques y resortes; luego los conectará para formar los sistemas que deseamos 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).
  Esta tarea les pide construir configuraciones de masas y resortes (nunca dos masas o resortes juntos) de cualquier tipo en R2. Un ejemplo de tales configuraciones se muestra en la Figura 1.   Esta tarea posee los mismos objetivos terminales que la Tarea 1. Además de trabajar en C++, permita que cada bloque tenga más de dos resortes conectados a él. Use la clase vector<...> para enganchar un número arbitrario de resortes a cada bloque. 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 Pedida
Para simular la dinámica de un bloque use la mejora introducida en la tarea2, para Bloque y para Simulator.
Las clases Spring, Block, PhysicsElement y Simulator que usted genere debe ser compatibles con el programa de prueba Experiment.cpp.

Resultados Esperados de su Grupo
Su tarea será compilada e 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,Block #0: (x,y),,Spring #0: (x0,y0),(x1,y1),,Block #1: (x,y),,Spring #1: (x0,y0),(x1,y1),,Block #2: (x,y),,
0.0,0.0,0.0,,0.0,0.0,1.0,0.5,,1.0,0.5,,1.0,0.5,1.0,1.0,,1.0,1.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
- readme
- Archivo de Documentación: éste incluye la Figura 2 y un gráfico (X,t) que muestre la posición X del bloque derecho como función del tiempo para 0<t<20. Este archivo además debe incluir la Figura 1 y un gráfico (X,Y) de la trayectoria del bloque rojo desde 0<t<40, use los datos iniciales del ejemplo de salida más arriba, masa verde y azul "infinitas" y en reposo, masa roja de 1 y constantes elástica iguales a 1 y largos en reposo de 1. Indique las dificultades encontradas y cómo las resolvió. Si usted desea analizar otro caso, puede hacerlo e incluirlo aquí.

Como ejemplo, el gráfico para el experimento de la Figura 2 debería ser como el de la Figura 3.
Experimento simple en R
Figura 2: Masa izquierda "infinita" en reposo en el origen, masa derecha 1 en posición 1 y rapidez inicial cero, resorte de largo en reposo de 0.6 y constante elástica 1.

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 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.