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.
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.
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.
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.
Figura 4: Configuración posible con bolas enlazadas y libres chocando en espacio cerrado en R
2
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.