Diseño y Programación Orientados a Objetos
1er. Sem 2016
Tarea 3: Bolas Libres y Enlazadas en Espacio Cerrado 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.
Esta tarea tiene por objetivos:
* Reconocer clases y relaciones entre ellas en lenguaje C++.
* Diseñar e implementar clases en C++.
* Aplicar sobrecarga de operadores.
* Ejercitar ña entrada y salida de datos en C++.
* Aplicar la creación de archivos con formato .csv y su importación a planillas electrónicas.

Descripción General

  En esta tarea se modela la interacción de objetos reales bolas, resortes y paredes al igual que en la tarea 1, excepto que esta vez su grupo lo hará en C++.

Desarrollo en Etapas

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 gradualmente. En cada etapa usted obtendrá una solución que funciona para un subconjunto de los requerimientos finales. Su grupo deberá entregar una solución para cada una de las etapas aún cuando la última integre las primeras. Esto tiene por finalidad, educar en la metodología iterativa e incremental.

Primera Etapa

Esta etapa busca simular choques entre dos bolas en  R2 en espacio libre (sin contenedor). Su grupo debe completar el código adjunto y modificar PhysicsLab.cpp proporcionado (llámelo PhysicsLab1.cpp) para reflejar la configuración de la Figura 1. Estudie con detención las diferencias entre esta versión de la solución y aquella en Java.
Two free balls colliding
Figura 1: Dos bolas cochando en espacio libre

Segunda Etapa

Esta etapa amplía el requerimiento previo considerando choques entre bolas y con las paredes del contenedor en  R2. Su grupo debe crear la clase Contenedor y modificar PhysicsLab2.cpp para reflejar la configuración de la Figura 2. Puede revisar estas sugerencias.
Collinding balls
Figura 2: Dos bolas que se enfrentan directamente y chocan en ángulo en un recinto cerrado

Tercera Etapa

Como tercer paso usted completará el código previo para simular la interacción entre dos bolas enlazadas con un resorte como se muestra en Figura 3. Incluya el archivo PhysicsLab3.cpp que simule esta canfiguración.

Two balls linked with a spring
Figura 3: Dos bolas ligadas por un resorte en un recinto cerrado

Cuarta Etapa

Modifique la clase Ball para permitir enlaces de una bola con dos o más bolas como se muestra en figura 4. Entregue archivo PhysicsLab4.cpp para simular esta configuración.
Configuración posible de bolas enlazadas y libres chocando en espacio cerrado
Figura 4: Configuración posible con bolas enlazadas y libres chocando en espacio cerrado en R2

Resultados Esperados de su Grupo

Para cada etapa genere un directorio con la solución hasta esa etapa.
Cada etapa puede ser ejecutada en aragorn.elo.utfsm.cl de dos formas:
  $ 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 (esto no se incluye en los códigos de ayuda):
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 del programa será a pantalla. Para efectos de esta tarea, el estado de salida sólo incluye las posiciones de cada objeto.
El programa corre hasta generar toda la salida indicada. En pantalla debería generar algo del tipo (caso figura 2):
Time,    Ball_0: x,y ,    Ball_1: x,y ,   Container_0: a0,b0,a1,b1
0.0,    1.0, 1.0 ,    3.0 , 3.0,  0.0  ,    0.0 ,   5.0,     4.0
/* aquí omito el resto de las líneas */

Usted deberá entregar los siguientes archivos:
- readme
- makefile     /* para compilar */
- Un Archivo de Documentación: para cada etapa, éste archivo incluye la figura con la configuración y un gráfico con curvas para la posición de las bolas como función del tiempo (x,t). Grafique t hasta que haya pasado la colisión en etapa 1, la colisión con bola y pared en etapa 2, dos colisiones en etapa 3 cualquieran sean éstas, y 3 colisiones en etapa 4. Indique las dificultades encontradas y cómo las resolvió. Si usted desea analizar otro caso, puede incluirlo.

- Se pide incluir los siguientes constructores como válidos para las clases señaladas:
  CVector(double x, double y);
  Ball(double mass, double radio, CVector position, CVector speed);
  Container(CVector upLeftPosition, CVector downRightPosition) ;
  Spring(double restLength, double stiffness);
  Para String incluya método:    void attachEnd (Ball * pb);  de manera que se pueda fijar un string al centro de una bola. La primera invoación conecta un extremo, la segunda el otro extremo.
   La idea de definir estos constructores es que el ayudante pueda construir su configuración propia (PhysicsLab.cpp) y usar las clases de su tarea para generar otros resultados.
Obviamente su programa no generará la figura de la configuración ni el gráfico. Puede usar el dibujo aquí incluido. El gráfico lo debe generar con una planilla de cálculo a partir de los datos de salida de su programa.

Extra créditos

   Su grupo puede aspirar a 8 puntos adicionales (la nota igualmente se satura en 100%) si incluye en la simulación gravedad y roce. La gravedad la supondremos constante y el roce será una fuerza disipativa (roce de fluido) que supondremos proporcional a la magnitud de la velocidad y el radio de cada bola.  En archivo Readme indique si abordó este requerimiento. La constante de proporcionalidad del roce y la gravedad en este caso son pasados como parámetros opcionales al ejecutar la simulación.

Ayudas
* Estudie este material sobre declaración incompleta de clases (local).
* Revise las instrucciones para la realización de tareas.
* Dé una mirada a los códigos de avance proporcionados. Si encuentra errores o algo mejorable, avise al profesor.
* Para enviar los datos a un archivo de salida, redireccione la salida a pantalla usando:
$ PhysicsLab  0.01 5 0.1  > miSalida.csv
  Luego trate este archivo como si fuera planilla electrónica. Usted podrá usar las "comas" y "tabs" como separadores de columnas.
* No dude en consultar al profesor o ayudante sobre dudas de esta tarea.