Diseño
y Programación Orientados a Objetos
1er. Sem 2010
Tarea 1: Masas y Resortes como Objetos de Software
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:
* Ejercitar la configuración de un ambiente de trabajo para desarrollo
de aplicaciones en lenguaje Java (se ha sugerido trabajar con Jgrasp, NetBeans o Eclipse)
* Reconocer objetos de software como modelos de objetos reales.
* Reconocer clases y relaciones entre ellas en códigos fuente Java.
* Ejercitar el diseño e implementación de una clase simple (Vector2D).
* Ejercitar la extensión de clases dadas para satisfacer nuevos requerimientos.
* Ejercitar la entrada y salida de datos.
* Conocer el formato .csv y su importación a planillas electrónicas.
* Ejercitar la preparación y entrega de resultados de software
(creación de makefiles, readme, documentación y generación de una
colección de archivos en uno "tar").
* Aprender una estrategia para programar simulaciones de fenómenos continuos.
Descripción General
En esta tarea se modela la interacción objetos reales resortes y
bloques en presencia de otro señor llamado naturaleza. 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 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.
Para ello usted contará con una solución bastante avanzada del problema
en R. 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
Resultados Esperados de su Grupo
Su tarea puede ser ejecutada de dos formas:
Desde consola con: $ java Experimento [nombre de archivo de salida]
o vía su makefile con: $ 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 en la salida del estado del sistema: <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 el esquema de 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í.
- Archivo Vector2D.java donde usted describe su clase para representar vectores en R2.
- Archivo Spring.java donde cada resorte opera en un plano de dos dimensiones.
Esta clase debe admitir los mismos constructores del caso en R.
- Archivo Block.java para bloques en el plano.
Esta clase debe admitir el siguiente constructor de Bloques:
public Block(float mass, float width, Vector2D position, Vector2D speed);
La idea de mantener algunas cosas es que el ayudante pueda
construir su propio experimento y usar su implementación para generar
sus resultados.
- Archivo Simulator.java el cual no debería diferir del proporcionado más abajo.
- Archivo PhysicsElement.java que debe ser igual al proporcionado.
- Archivo Experiment.java éste contendrá su configuración para el experimento de la Figura 1.
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.
El gráfico para el experimento de la Figura 2 debería ser como el de la Figura 3.
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 la solución del problema en R. 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.
No dude en consultar al profesor o ayudante sobre dudas de esta tarea.
Nociones de simulación de fenómenos continuos
La idea básica usada en esta tarea es discretizar el tiempo; para cada
instante discreto, congelamos el tiempo y pedimos a cada objeto
del experimento calcular cuál será su estado futuro (delta t más tarde)
a partir del estado actual y las condiciones en que está sometido. Es
importante congelar el tiempo y hacer este cálculo en cada objeto.
Luego pedimos a todos actualizar su estado basado en lo calculado y
avanzamos el tiempo en ese delta. Esta simple idea trabaja bien aquí y
en muchas situaciones, pero no en todas; por ejemplo si
deseáramos permitir que dos resortes estén juntos uno después del
otro. En estos casos, como aproximación podemos usar una masa pequeña
entre ambos. Si quisiéramos pegar dos bloques juntos, podemos poner un
resorte muy pequeño entre ambos con constante elástica "infinita". Lo
mismo si deseamos modelar barras rígidas.
Una vez hecha la tares, usted debería notar que es posible incorporar
roce o gravedad. Cuerdas pueden ser modeladas como resortes con
constante elástica "infinita" cuando se extiende respecto al reposo y
cero cuando se acorta respecto a su largo de reposo.
Se puede jugar bastante, pero en algunos casos es posible encontrar
problemas de acondicionamiento numérico; por ejemplo si usa masas cero,
aparecerá una división por cero. Por otro lado este ramo no es el único
donde deben rendir bien este semestre.
Dejemos esto hasta aquí para que la tarea salga hoy.