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