7.2 KiB
Aufgabenblatt 4
Allgemeine Anmerkungen
Ihre Lösung für dieses Aufgabenblatt ist bis Montag, 2.5. 11h durch git commit
und push
abzugeben. Mit der Angabe werden die Dateien CosmicSystem.java
, Drawable.java
,
NamedBodyForcePair.java
, HierarchicalSystem.java
, Simulation4.java
und Aufgabe4Test.java
mitgeliefert.
Wenn Sie zusätzlich zu den gefragten Klassen weitere Klassen definieren, achten Sie darauf, dass
die Klassennamen mit My
beginnen, um Konflikte mit späteren Aufgabenblättern zu vermeiden.
Ziel
Ziel der Aufgabe ist die Anwendung der Konzepte: Interfaces, dynamisches Binden, toString() (siehe Skriptum Seite 75-84).
Beschreibung der gegebenen Dateien
- CosmicSystem ist ein gegebenes Interface, das von den Klassen
NamedBodyForcePair
undHierarchicalSystem
implementiert wird. Mithilfe dieses lässt sich somit eine Hierarchie von Systemen und Subsystemen beschreiben. Unser Sonnensystem ist ein Beispiel eines Systems, das mehrere Teilsysteme beinhaltet. Ein solches Teilsystem ist beispielsweise das System Erde und Erdmond. Ein anderes Teilsystem wäre Jupiter mit seinen Monden. Verändern Sie dieses Interface nicht. - Drawable wird von
CosmicSystem
verwendet. Verändern Sie dieses Interface nicht. - NamedBodyForcePair ist das Gerüst für eine Klassendefinition.
Die Klasse implementiert
CosmicSystem
und repräsentiert einen einzelnen benannten Himmelskörper (z.B. "Mars") zusammen mit der auf ihn wirkenden Kraft. - HierarchicalSystem ist das Gerüst für eine Klassendefinition.
Die Klasse implementiert
CosmicSystem
und repräsentiert ein System von Himmelskörpern (z.B. Sonnensystem) bestehend aus einem zentralen Himmelskörper und beliebig vielen Untersystemen in dessen Orbit. Für alle Himmelskörper werden die Kräfte, die auf diese jeweils wirken, mitverwaltet. - Simulation4 ist ein Gerüst für eine ausführbare Klasse. Hier soll
die Simulation analog zur Klasse
Simulation
implementiert werden (damit Sie Ihre ursprüngliche Datei nicht überschreiben müssen). - Aufgabe4Test ist eine vorgegebene Klasse, die Sie zum Testen Ihrer Implementierung verwenden sollten. Bei einer fehlerfreien Implementierung sollten bei der Ausführung dieser Klasse keine Exceptions geworfen werden und alle Tests als erfolgreich ("successful") ausgegeben werden. Entfernen Sie die Kommentarzeichen, um diese Klasse verwenden zu können. Sie müssen diese Klasse nicht weiter verändern, können aber eigene Testfälle hinzufügen.
Aufgaben
Ihre Aufgaben sind folgende:
1. Implementierung von CosmicSystem
in NamedBodyForcePair
:
Fügen Sie in der Klasse Body
eine öffentliche Methode massCenter()
hinzu, die die
Position des Himmelskörpers liefert.
Definieren Sie die Klasse NamedBodyForcePair
so, dass sie das Interface CosmicSystem
implementiert. Die Methoden getMass()
und getMassCenter()
geben lediglich die Masse bzw.
Position des Himmelskörpers zurück.
2. Implementierung von CosmicSystem
in HierarchicalSystem
:
Definieren Sie die Klasse HierarchicalSystem
so, dass sie das Interface CosmicSystem
implementiert.
Die Klasse repräsentiert ein hierarchisch aufgebautes kosmisches System von Himmelskörpern.
Ein solches System besteht aus einem zentralen Himmelskörper und beliebig vielen weiteren
kosmischen Systemen, die sich im Orbit um diesen zentralen Himmelskörper befinden. Neben der
Spezifikationen in CosmicSystem
beachten Sie bitte folgende spezielle Anforderungen und Hinweise
für die Implementierung:
-
toString()
: diese Methode soll eine textuelle Beschreibung der Hierarchie von Himmelskörpern und Subsystemen liefern. Dafür wird der Namen des zentralen Himmelskörpers eines Systems gefolgt von den Objekten im Orbit jeweils in {}-Klammern repräsentiert. Beispiel:"Sun {Mercury, Venus, Earth {Moon} , Mars {Deimos, Phobos} , Vesta, Pallas, Hygiea, Ceres}"
-
numberOfBodies()
: diese Methode liefert die Gesamtanzahl aller Himmelskörper (nicht Systeme) im System bzw. Himmelskörper, das heißt alle Objekte vom TypNamedBodyForcePair
. Das oben genannte Beispiel-System besteht z.B. aus 12 Himmelskörpern, das Mars-System im Orbit der Sonne jedoch nur aus 3. -
getMass()
: diese Methode liefert die Summe der Massen aller Himmelskörper im System. -
getMassCenter()
: diese Methode liefert den Schwerpunkt aller Himmelskörper im System. Dieser entspricht dem mit den Massen gewichteten Mittelwert aller Positionen, es müssen daher alle Positionen mit der jeweiligen Masse multipliziert und aufsummiert werden und das Resultat durch die Summe aller Massen dividiert werden. Nutzen Sie dafür die bereits implementierten Rechenoperationen inVector3
. -
addForceFrom(Body b)
aktualisiert für jedesNamedBodyForcePair
-Objekt inthis
die Kraft, indem die vonb
auf dasNamedBodyForcePair
-Objekt ausgeübte Kraft zur Kraft hinzuaddiert wird. -
addForceTo(CosmicSystem cs)
aktualisiert für jedesNamedBodyForcePair
-Objekt incs
die Kraft, indem alle Kräfte die von Körpern austhis
auf dasNamedBodyForcePair
-Objekt ausgeübt werden, zur Kraft im Objekt hinzuaddiert werden. Beispiel: Die Anweisungcs.addForce(cs)
aktualisiert alle wechselseitigen im Systemcs
wirkenden Kräfte. -
update()
führt auf Basis der gespeicherten Kräfte alle Bewegungen im Systemthis
durch und setzt danach alle Kräfte wieder auf den null-Vektor zurück. -
getBodies()
liefert eine Liste (Typ:BodyLinkedList
) mit allen Himmelskörpern austhis
.
3. Implementierung von Simulation4
:
Implementieren Sie die Simulationsschleife unter Verwendung eines Objekts vom Typ
HierachicalSystem
. Alle Berechnungen sollen mittels Methoden von CosmicSystem
durchgeführt
werden.
Hinweise:
-
Nutzen Sie für die Implementierung dieser Methoden Rekursion sowie das Konzept des dynamischen Bindens. Da
NamedBodyForcePair
undHierarchicalSystem
Untertypen vonCosmicSystem
sind, haben sie jeweils eine eigene Implementierung der inCosmicSystem
definierten Methoden und es wird zur Laufzeit entschieden, von welchem dynamischen Typ ein Objekt ist und welche Methode somit ausgeführt wird. Sie dürfen hier keine Typumwandlungen (Casts) und auch nicht die MethodengetClass()
undinstanceOf()
verwenden. -
Es ist möglich, aber nicht verlangt,
addForceTo(CosmicSystem cs)
ohne Verwendung vongetBodies()
zu implementieren. Dazu kann inaddForceTo(CosmicSystem cs)
der Zugriff auf die einzelnen Körper incs
dadurch erreicht werden, dassthis
für alle seine Himmelskörper und UntersystemeaddForceTo(cs)
aufruft. Wird beim rekursiven Abstieg ein einzelner Himmelskörper erreicht (Blattknoten) ruft diesercs.addForceFrom(this)
auf. -
Achten Sie bei der Berechnung der Kräfte in
addForceFrom(Body b)
darauf, dass die Kraft nicht verändert wird, wennthis
undb
derselbe Himmelskörper sind.
Punkteaufteilung
-
Implementierung von
CosmicSystem
inNamedBodyForcePair
: 1.5 Punkte -
Implementierung von
CosmicSystem
inHierarchicalSystem
: 2.5 Punkte -
Implementierung von
Simulation4
: 1 Punkte -
Gesamt: 5 Punkte