Diseño y Programación Orientados a Objetos
1er. Sem 2014
Tarea 4: Bolas, Resortes y Puntos de Apoyo 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++.
* 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 bolas y resortes 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 los objetos reales. En física usted estudió la interacción de masas y resortes. En esta tarea las bolas serán modeladas como masas esféricas sin momento angular. Decimos que este es un modelo y no la realidad porque existe roce y éste hace rodar las bolas; sin embargo, esta suposición simplifica el planteamiento y permite obtener resultados con precisión satisfactoria. 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. Como se espera en la realidad, las bolas pueden chocar una con otras. Las colisiones entre bolas deben ser incluidas y se deben suponer elásticas, es decir, se conserva la energía y el momento lineal. A diferencia de la tarea 1 de este semestre, estos objetos están inmersos en un espacio de dos dimensiones R2. 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 bolas (balls), resortes (springs) y algunos "ganchos" fijos (fixed hooks) donde es posible fijar el extremo de un resorte. Luego objetos de software se pueden vincular de la manera que se desee para representar a los sistemas que deseamos simular. Notar que aquí aparece otro actor: un simulador.
  Un simulador no es más que el modelo del paso del tiempo, el simulador informará el paso del tiempo a cada objeto del sistema físico. 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 bolas sujetas a fuerzas externas, revise este material y éste para los choques.
  En esta tarea se pide construir configuraciones de ganchos, resortes y bolas (nunca dos masas o resortes unidos) en R2 (dos dimensiones). Un ejemplo de tales configuraciones se muestra en la Figura 1. Usted puede imaginar que todo está sobre una mesa y ésta es observada desde arriba.   Para ello usted contará con código parcial de la solución  al problema en R2. 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 mostradas por pantalla (terminal). Luego en una planilla electrónica usted debe importar sus datos para generar gráficos del movimiento de los objetos como el de la Figura 2.

Figura 1: Una Configuración Posible

Figura 2: Posición X de las bolas en el tiempo para la configuración de Figura 1.

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. Para cada etapa cree un subdirectorio con la solución hasta ese nivel.

Primera Etapa
Como primer paso, su grupo debe completar el código adjunto y cree un PhysicsLab para generar la gráfica correspondiente a el choque simple de la Figura A.

Figura A: 2 Bolas de igual masa, una en movimiento no acelerado y otra en reposo. Se muestra estado inicial.

Nota: Si lo desea, resuelva primero una bola moviéndose sin aceleración. Una vez que comprueba que funciona el simulador, la entrada de datos, salida de datos, cómo hacer gráfica, etc.., agrega el choque. Para la entrega de esta etapa se pide la configuración final de la tarea.

Segunda Etapa
Como segundo paso, complete el código agregando la clase resorte (Spring) y cree un PhysicsLab que genere los resultados para la configuración de la Figura B.

Figura B: 2 bolas en configuración simétrica. Se muestra estado inicial.

Tercera Etapa
Complete el código (usted deberá cambiar la configuración dada en este código) agregando la clase resorte (FixedHook) y cree un PhysicsLab que genere los resultados para la configuración de la Figura C.

Figura C: un gancho fijo y una bola. Se muestra estado inicial.

Cuarta Etapa
Entregue el código completo para simular la configuración de la Figura 1 y entregue la gráfica similar a la Figura 2. Por la configuración creada, las bolas solo deberían moverse en el plano Y. Esa es la coordenada que usted graficará. Con su avance hasta etapa 3, esta etapa sólo debería requerir un cambio en el método main.

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 muestre el gráfico (Y,t) apara ambas bolas.
Además su grupo debe inventar una configuración nueva (etapa n+1) y presentar sus resultados.

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.