SEP WS 2015
Einführungsaufgabe “Ball in Box”

Hintergrund

Aus den zurückliegenden SEPs wurde immer wieder ersichtlich, dass der Kenntnisstand der verschiedenen Teilnehmenden sehr unterschiedlich ist. Das diesjährige SEP Projekt verlangt (unter anderem) eine graphische Oberfläche in Swing zu implementieren die auf Daten eines Modells zugreift, wobei die Daten in einem separatem Thread berechnet werden. Um sicherzustellen, dass sich jede Teilnehmerin und jeder Teilnehmer mit einer solchen Problemstellung zumindest einmal auseinandergesetzt hat, wird eine Einführungsaufgabe gestellt. Sie gibt die Gelegenheit, sich mit folgenden Themen auseinanderzusetzen:

Die Bearbeitung dieser Aufgabe ist als Einarbeitung für das SEP dringend angeraten. Unserer Meinung nach ist es für das Gelingen des SEP notwendig, dass jedes Mitglied eurer Gruppe in der Lage ist, diese Aufgabe zu bewältigen, bevor mit dem Pflichtenheft begonnen wird. Deshalb soll diese Aufgabe von jedem Teammitglied eigenständig bearbeitet werden und bei der jeweiligen Betreuungsperson als ausführbare JAR-Datei und als Quellcode per E-Mail abgegeben werden. Der Abgabetermin ist eine Woche vor Beginn des SEP. Damit bleibt vor Beginn des SEP noch Zeit für die Besprechung der Abgabe mit der Betreuungsperson und eventuelle Nachbesserungen.

Aufgabenstellung

Es soll einfaches physikalisches Modell einer Kugel in einem Kasten simuliert werden:

Das physikalische Modell soll in einem eigenen Thread simuliert werden, der in diskreten Zeitschritten die nötigen physikalischen Berechnungen durchgeführt (neue Position/Geschwindigkeit der Kugel usw.), wobei eine ZE einer Millisekunden entspricht. Bewegt sich die Kugel ohne auf eine Wand zu prallen, so werden die physikalischen Daten all 10 ms aktualisiert. Würde die Kugel bis zum nächsten Berechnungsschritt auf eine der Seitenwände prallen muss der nächste Berechnungsschritt vorgezogen werden (z.B. schon nach 5 ms, wenn die Kugel in 5 ms auf die Wand auftrifft).

In einer Swing-Anwendung mit einem Fenster der Größe 640x480 (d.h. 1 LE entspricht einem Pixel) wird die physikalische Simulation visualisiert: Die Kugel wird an ihrer aktuellen Position angezeigt. Das Darstellungfenster aktualisiert seine Darstellung alle 25 ms. Diese Aktualisierung muss innerhalb des Swing-Dispatcher-Threads vonstatten gehen (siehe dazu javax.swing.Timer). Geht die Kugel in den ruhenden Zustand, so wird die automatische Aktualisierung der Anzeige unterbrochen und wieder aufgenommen wenn sich die Kugel sich wieder in Bewegung setzt. Dies ist mit dem Observer-Pattern zu realisieren, d.h. die Anzeige ist der Observer des physikalischen Modells. Außerdem soll in dem Fenster der aktuelle Zustand der Kugel (ruhend, rollend) angezeigt werden.

Es muss außerdem auf konkurrierenden Zugriff geachtet werden da die View und das physikalische Modell in verschiedenen Threads laufen. Die Kommunikation zwischen diesen Threads muss auf korrekte Art und Weise erfolgen (keine Auftreten von Deadlocks und anderen Multithreading-Problemen). Erfahrungsgemäß ist dies einer schwierigsten Punkte während der Implementierungsphase im SEP, daher arbeitet euch bereits jetzt ein.

Folgendes Java-Applet realisiert die Simulation und deren Darstellung wie oben beschrieben:

Hinweis: Die Einführungsaufgabe muss als Swing-Anwendung und nicht als Java-Applet realisiert werden!

Hinweise

Die Aufgabe sollte innerhalb eines Tages lösbar sein (wenn man sich mit den entsprechenden Techniken schon auskennt). Zusätzliche Features wie Menüs, Buttons oder andere Verschönerungen sind nicht nötig. Als Literatur bieten sich das 8. Kapitel (Nebenläufigkeit) und das 9. Kapitel (Swing) des Vorlesungsskripts von Programmieren 2 an.

Weitere Literatur: