Compare commits
	
		
			6 Commits
		
	
	
		
			Abgabe5-Na
			...
			Uebungstes
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 05c52cd3f5 | |||
| 
						
						
							
						
						088fa3cdeb
	
				 | 
					
					
						|||
| 
						
						
							
						
						f801a331c2
	
				 | 
					
					
						|||
| 
						
						
							
						
						b89fc15602
	
				 | 
					
					
						|||
| 
						 | 
					2e14e45bb0 | ||
| 
						 | 
					e311ef3c6b | 
							
								
								
									
										75
									
								
								angabe/Aufgabenblatt6.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								angabe/Aufgabenblatt6.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,75 @@
 | 
				
			|||||||
 | 
					# Aufgabenblatt 6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Allgemeine Anmerkungen
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Ihre Lösung für dieses Aufgabenblatt ist bis Montag, 23.5. 11h durch `git commit` und `git push`
 | 
				
			||||||
 | 
					abzugeben. Mit der Angabe werden die Dateien `MassiveIterable.java`, `MassiveIterator.java`, 
 | 
				
			||||||
 | 
					`MassiveSet.java`, `MassiveForceTreeMap.java`, `Simulation6.java` und `Aufgabe6Test.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: Iterator, Kopie vs. Sichtweise, Sortieren
 | 
				
			||||||
 | 
					(siehe Skriptum Seite 91-109).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Beschreibung der gegebenen Dateien
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- [MassiveIterable](../src/MassiveIterable.java) ist ein Interface, das iterierbare Objekte mit
 | 
				
			||||||
 | 
					Elementen vom Typ `Massive` spezifiziert. Verändern Sie diese Datei bitte nicht.
 | 
				
			||||||
 | 
					- [MassiveIterator](../src/MassiveIterator.java) ist ein Interface, das einen Iterator über
 | 
				
			||||||
 | 
					Elemente vom Typ `Massive` spezifiziert. Verändern Sie diese Datei bitte nicht.
 | 
				
			||||||
 | 
					- [MassiveSet](../src/MassiveSet.java) ist ein Interface, das iterierbare Mengen mit 
 | 
				
			||||||
 | 
					`Massive`-Elementen spezifiziert. Verändern Sie diese Datei bitte nicht.
 | 
				
			||||||
 | 
					- [MassiveForceTreeMap](../src/MassiveForceTreeMap.java) ist das Gerüst für eine Implementierung
 | 
				
			||||||
 | 
					einer assoziativen Datenstruktur, die ein `Massive`-Objekt mit der auf das Objekt wirkenden Kraft
 | 
				
			||||||
 | 
					assoziiert.
 | 
				
			||||||
 | 
					- [Simulation6](../src/Simulation6.java) 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](../src/Simulation.java) nicht überschreiben müssen).
 | 
				
			||||||
 | 
					- [Aufgabe6Test](../src/Aufgabe6Test.java) 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. Implementieren Sie die Klasse `MassiveForceTreeMap`.**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 Implementieren Sie die Klasse `MassiveForceTreeMap`. `MassiveForceTreeMap` ist wie 
 | 
				
			||||||
 | 
					 `BodyForceTreeMap` aufgebaut, mit dem Unterschied, dass der Typ des Schlüssels statt `Body` nun 
 | 
				
			||||||
 | 
					 der Typ `Massive` ist. Weiters soll die Klasse Methode `getKeys()` zur Verfügung stellen, 
 | 
				
			||||||
 | 
					 die eine `MassiveSet`-Sichtweise auf die Menge der Schlüssel liefert. Änderungen an dem 
 | 
				
			||||||
 | 
					 zurückgelieferten `MassiveSet`-Objekt wirken sich auf das zugrunde 
 | 
				
			||||||
 | 
					 liegende `MassiveForceTreeMap`-Objekt aus. Die Methode `toList()` liefert dagegen eine 
 | 
				
			||||||
 | 
					 unabhängige Liste (Kopie) mit allen Schlüsseln der Map. Für die Implementierung von 
 | 
				
			||||||
 | 
					 `MassiveSet` können Sie einen eigenen Klassennamen beginnend mit `My` wählen. Die Definition kann 
 | 
				
			||||||
 | 
					 in einer eigenen Datei oder in der Datei `MassiveForceTreeMap.java` erfolgen.
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					**2. Adaptieren Sie die Klasse `HierarchicalSystem`:**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 Die Klasse `HierarchicalSystem` soll so geändert werden, dass sie das gegebene 
 | 
				
			||||||
 | 
					 Interface `MassiveIterable` implementiert. Die Reihenfolge der vom Iterator gelieferten 
 | 
				
			||||||
 | 
					 Elemente ist nicht festgelegt. Sie dürfen für die Implementierung bei Bedarf Ihren Klassen 
 | 
				
			||||||
 | 
					 `NamedBodyForcePair` und `HierarchicalSystem` neue, nicht angegebene Methoden hinzufügen.
 | 
				
			||||||
 | 
					 Die Verwendung von Klassen des Java-Collection-Frameworks (z.B. java.util.Stack) ist erlaubt
 | 
				
			||||||
 | 
					 (aber nicht notwendig).
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					**3. Implementierung von `Simulation6`:**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 Implementieren Sie die Simulationsschleife unter Verwendung eines Objekts vom Typ
 | 
				
			||||||
 | 
					 `MassiveForceTreeMap`. Die Methode `getKeys()` hilft beim Iterieren der gespeicherten Schlüssel.
 | 
				
			||||||
 | 
					 Kollisionen von Himmelskörpern müssen in dieser Simulation nicht berücksichtigt werden.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### _Punkteaufteilung_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Implementierung von `MassiveForceTreeMap`: 3 Punkte
 | 
				
			||||||
 | 
					- Implementierung von `MassiveIterable` in `HierarchicalSystem`: 1.5 Punkte
 | 
				
			||||||
 | 
					- Implementierung von `Simulation6`: 0.5 Punkte
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					- Gesamt: 5 Punkte
 | 
				
			||||||
@@ -78,4 +78,19 @@ public class Aufgabe5Test {
 | 
				
			|||||||
        assertEquals(hashCode2, map.hashCode());
 | 
					        assertEquals(hashCode2, map.hashCode());
 | 
				
			||||||
        assertNotEquals(hashCode1, hashCode2);
 | 
					        assertNotEquals(hashCode1, hashCode2);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    public void testDelKey() {
 | 
				
			||||||
 | 
					        MassiveForceHashMap map = new MassiveForceHashMap();
 | 
				
			||||||
 | 
					        NamedBody sun1 = new NamedBody(SolSystem4.SUN_NAMED);
 | 
				
			||||||
 | 
					        NamedBody earth1 = new NamedBody(SolSystem4.EARTH_NAMED);
 | 
				
			||||||
 | 
					        NamedBody moon1 = new NamedBody(SolSystem4.MOON_NAMED);
 | 
				
			||||||
 | 
					        map.put(sun1, new Vector3());
 | 
				
			||||||
 | 
					        map.put(earth1, new Vector3());
 | 
				
			||||||
 | 
					        map.put(moon1, new Vector3());
 | 
				
			||||||
 | 
					        assertNotNull(map.get(sun1));
 | 
				
			||||||
 | 
					        assertNotNull(map.delete(sun1));
 | 
				
			||||||
 | 
					        assertNull(map.get(sun1));
 | 
				
			||||||
 | 
					        assertNull(map.delete(sun1));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										116
									
								
								src/Aufgabe6Test.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								src/Aufgabe6Test.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
				
			|||||||
 | 
					import org.junit.jupiter.api.Test;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.HashSet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static org.junit.jupiter.api.Assertions.*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Aufgabe6Test {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    public void testEP2() {
 | 
				
			||||||
 | 
					        NamedBody sun1, mercury1, venus1, earth1, moon1, mars1, deimos1, phobos1, vesta1, pallas1, hygiea1, ceres1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // create the same 12 named body-force pairs
 | 
				
			||||||
 | 
					        sun1 = new NamedBody(SolSystem4.SUN_NAMED);
 | 
				
			||||||
 | 
					        earth1 = new NamedBody(SolSystem4.EARTH_NAMED);
 | 
				
			||||||
 | 
					        moon1 = new NamedBody(SolSystem4.MOON_NAMED);
 | 
				
			||||||
 | 
					        mars1 = new NamedBody(SolSystem4.MARS_NAMED);
 | 
				
			||||||
 | 
					        deimos1 = new NamedBody(SolSystem4.DEIMOS_NAMED);
 | 
				
			||||||
 | 
					        phobos1 = new NamedBody(SolSystem4.PHOBOS_NAMED);
 | 
				
			||||||
 | 
					        mercury1 = new NamedBody(SolSystem4.MERCURY_NAMED);
 | 
				
			||||||
 | 
					        venus1 = new NamedBody(SolSystem4.VENUS_NAMED);
 | 
				
			||||||
 | 
					        vesta1 = new NamedBody(SolSystem4.VESTA_NAMED);
 | 
				
			||||||
 | 
					        pallas1 = new NamedBody(SolSystem4.PALLAS_NAMED);
 | 
				
			||||||
 | 
					        hygiea1 = new NamedBody(SolSystem4.HYGIEA_NAMED);
 | 
				
			||||||
 | 
					        ceres1 = new NamedBody(SolSystem4.CERES_NAMED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // check basic functions of 'MassiveForceHashMap'
 | 
				
			||||||
 | 
					        MassiveForceTreeMap map = new MassiveForceTreeMap();
 | 
				
			||||||
 | 
					        map.put(sun1, new Vector3(0, 0, 0));
 | 
				
			||||||
 | 
					        map.put(mercury1, new Vector3(0, 0, 0));
 | 
				
			||||||
 | 
					        map.put(venus1, new Vector3(0, 0, 0));
 | 
				
			||||||
 | 
					        map.put(earth1, new Vector3(0, 0, 0));
 | 
				
			||||||
 | 
					        map.put(moon1, new Vector3(0, 0, 0));
 | 
				
			||||||
 | 
					        map.put(mars1, new Vector3(0, 0, 0));
 | 
				
			||||||
 | 
					        map.put(deimos1, new Vector3(0, 0, 0));
 | 
				
			||||||
 | 
					        map.put(phobos1, new Vector3(0, 0, 0));
 | 
				
			||||||
 | 
					        map.put(vesta1, new Vector3(0, 0, 0));
 | 
				
			||||||
 | 
					        map.put(pallas1, new Vector3(0, 0, 0));
 | 
				
			||||||
 | 
					        map.put(hygiea1, new Vector3(0, 0, 0));
 | 
				
			||||||
 | 
					        map.put(ceres1, new Vector3(0, 0, 0));
 | 
				
			||||||
 | 
					        map.put(mars1, new Vector3(0, 0, 0)); // inserted twice
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        HashSet<Massive> set1 = new HashSet<>();
 | 
				
			||||||
 | 
					        set1.add(sun1);
 | 
				
			||||||
 | 
					        set1.add(mercury1);
 | 
				
			||||||
 | 
					        set1.add(venus1);
 | 
				
			||||||
 | 
					        set1.add(earth1);
 | 
				
			||||||
 | 
					        set1.add(moon1);
 | 
				
			||||||
 | 
					        set1.add(mars1);
 | 
				
			||||||
 | 
					        set1.add(deimos1);
 | 
				
			||||||
 | 
					        set1.add(phobos1);
 | 
				
			||||||
 | 
					        set1.add(vesta1);
 | 
				
			||||||
 | 
					        set1.add(pallas1);
 | 
				
			||||||
 | 
					        set1.add(hygiea1);
 | 
				
			||||||
 | 
					        set1.add(ceres1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assertTrue(map.toString().contains("Mars"));
 | 
				
			||||||
 | 
					        assertTrue(map.toString().contains("Deimos"));
 | 
				
			||||||
 | 
					        assertTrue(map.toString().contains("Moon"));
 | 
				
			||||||
 | 
					        assertTrue(map.toString().contains("Earth"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assertEquals(12, map.getKeys().size());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assertTrue(map.getKeys().contains(mars1));
 | 
				
			||||||
 | 
					        assertTrue(map.getKeys().contains(new NamedBody("Mars", 6.41712E23, new Vector3(0, 0, 0), new Vector3(0, 0, 0))));
 | 
				
			||||||
 | 
					        assertFalse(map.getKeys().contains(new Body(6.41712E23, new Vector3(0, 0, 0), new Vector3(0, 0, 0))));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        HashSet<Massive> set2 = new HashSet<>();
 | 
				
			||||||
 | 
					        for (Massive m : map.getKeys()) {
 | 
				
			||||||
 | 
					            set2.add(m);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assertEquals(set1, set2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        MassiveLinkedList list = map.getKeys().toList();
 | 
				
			||||||
 | 
					        while (list.size() > 0) {
 | 
				
			||||||
 | 
					            set1.remove(list.pollLast());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        assertTrue(set1.isEmpty());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        map.getKeys().remove(mars1);
 | 
				
			||||||
 | 
					        assertFalse(map.containsKey(mars1));
 | 
				
			||||||
 | 
					        assertEquals(11, map.getKeys().size());
 | 
				
			||||||
 | 
					        map.getKeys().clear();
 | 
				
			||||||
 | 
					        assertEquals(0, map.getKeys().size());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        NamedBodyForcePair sun2, mercury2, venus2, earth2, moon2, mars2, deimos2, phobos2, vesta2, pallas2, hygiea2, ceres2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //test classes NamedBody and MassiveForceHashMap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // create 12 named bodies
 | 
				
			||||||
 | 
					        // create the same 12 named body-force pairs
 | 
				
			||||||
 | 
					        sun2 = new NamedBodyForcePair(SolSystem4.SUN_NAMED);
 | 
				
			||||||
 | 
					        earth2 = new NamedBodyForcePair(SolSystem4.EARTH_NAMED);
 | 
				
			||||||
 | 
					        moon2 = new NamedBodyForcePair(SolSystem4.MOON_NAMED);
 | 
				
			||||||
 | 
					        mars2 = new NamedBodyForcePair(SolSystem4.MARS_NAMED);
 | 
				
			||||||
 | 
					        deimos2 = new NamedBodyForcePair(SolSystem4.DEIMOS_NAMED);
 | 
				
			||||||
 | 
					        phobos2 = new NamedBodyForcePair(SolSystem4.PHOBOS_NAMED);
 | 
				
			||||||
 | 
					        mercury2 = new NamedBodyForcePair(SolSystem4.MERCURY_NAMED);
 | 
				
			||||||
 | 
					        venus2 = new NamedBodyForcePair(SolSystem4.VENUS_NAMED);
 | 
				
			||||||
 | 
					        vesta2 = new NamedBodyForcePair(SolSystem4.VESTA_NAMED);
 | 
				
			||||||
 | 
					        pallas2 = new NamedBodyForcePair(SolSystem4.PALLAS_NAMED);
 | 
				
			||||||
 | 
					        hygiea2 = new NamedBodyForcePair(SolSystem4.HYGIEA_NAMED);
 | 
				
			||||||
 | 
					        ceres2 = new NamedBodyForcePair(SolSystem4.CERES_NAMED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        CosmicSystem earthSystem = new HierarchicalSystem(earth2, moon2);
 | 
				
			||||||
 | 
					        CosmicSystem marsSystem = new HierarchicalSystem(mars2, deimos2, phobos2);
 | 
				
			||||||
 | 
					        HierarchicalSystem solarSystem = new HierarchicalSystem(sun2, mercury2, venus2, earthSystem, marsSystem, vesta2, pallas2, hygiea2, ceres2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int count = 0;
 | 
				
			||||||
 | 
					        for (Massive b : solarSystem) {
 | 
				
			||||||
 | 
					            count++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        assertEquals(12, count);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -103,10 +103,10 @@ public class BodyForceTreeMap {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public String toString() {
 | 
					    public String toString() {
 | 
				
			||||||
        return toString(root);
 | 
					        return (root != null) ? toString(root) : "";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private class Item {
 | 
					    private static class Item {
 | 
				
			||||||
        private final Body key;
 | 
					        private final Body key;
 | 
				
			||||||
        private Vector3 value;
 | 
					        private Vector3 value;
 | 
				
			||||||
        private Item parent;
 | 
					        private Item parent;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -222,7 +222,7 @@ public class BodyLinkedList implements Iterable<Body> {
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private class Item {
 | 
					    private static class Item {
 | 
				
			||||||
        private final Body body;
 | 
					        private final Body body;
 | 
				
			||||||
        private Item prev;
 | 
					        private Item prev;
 | 
				
			||||||
        private Item next;
 | 
					        private Item next;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@ import codedraw.CodeDraw;
 | 
				
			|||||||
 * and an arbitrary number of subsystems (of type 'CosmicSystem') in its orbit.
 | 
					 * and an arbitrary number of subsystems (of type 'CosmicSystem') in its orbit.
 | 
				
			||||||
 * This class implements 'CosmicSystem'.
 | 
					 * This class implements 'CosmicSystem'.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public class HierarchicalSystem implements CosmicSystem {
 | 
					public class HierarchicalSystem implements CosmicSystem, MassiveIterable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private final NamedBodyForcePair central;
 | 
					    private final NamedBodyForcePair central;
 | 
				
			||||||
    private CosmicSystem[] orbit;
 | 
					    private CosmicSystem[] orbit;
 | 
				
			||||||
@@ -127,4 +127,53 @@ public class HierarchicalSystem implements CosmicSystem {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public MassiveIterator iterator() {
 | 
				
			||||||
 | 
					        return new MassiveIterator() {
 | 
				
			||||||
 | 
					            private int i = 0;
 | 
				
			||||||
 | 
					            private MassiveIterator cur = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public Massive next() {
 | 
				
			||||||
 | 
					                if (cur != null && cur.hasNext()) return cur.next();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                for (; i < all.length; i++) {
 | 
				
			||||||
 | 
					                    CosmicSystem sys = all[i];
 | 
				
			||||||
 | 
					                    if (sys instanceof NamedBodyForcePair m) {
 | 
				
			||||||
 | 
					                        i++;
 | 
				
			||||||
 | 
					                        return m.getBody();
 | 
				
			||||||
 | 
					                    } else if (sys instanceof HierarchicalSystem hs) {
 | 
				
			||||||
 | 
					                        cur = hs.iterator();
 | 
				
			||||||
 | 
					                        if (cur.hasNext()) {
 | 
				
			||||||
 | 
					                            i++;
 | 
				
			||||||
 | 
					                            return cur.next();
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public boolean hasNext() {
 | 
				
			||||||
 | 
					                if (cur != null && cur.hasNext()) return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                for (; i < all.length; i++) {
 | 
				
			||||||
 | 
					                    CosmicSystem sys = all[i];
 | 
				
			||||||
 | 
					                    if (sys instanceof NamedBodyForcePair) {
 | 
				
			||||||
 | 
					                        return true;
 | 
				
			||||||
 | 
					                    } else if (sys instanceof HierarchicalSystem hs) {
 | 
				
			||||||
 | 
					                        cur = hs.iterator();
 | 
				
			||||||
 | 
					                        if (cur.hasNext()) {
 | 
				
			||||||
 | 
					                            i++;
 | 
				
			||||||
 | 
					                            return true;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -65,16 +65,36 @@ public class MassiveForceHashMap {
 | 
				
			|||||||
     * Precondition: key != null.
 | 
					     * Precondition: key != null.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public Vector3 get(Massive key) {
 | 
					    public Vector3 get(Massive key) {
 | 
				
			||||||
 | 
					        int pos = find(key);
 | 
				
			||||||
 | 
					        return (pos == -1) ? null : values[pos];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private int find(Massive key) {
 | 
				
			||||||
        int idx = ((key.hashCode() % keys.length) + keys.length) % keys.length;
 | 
					        int idx = ((key.hashCode() % keys.length) + keys.length) % keys.length;
 | 
				
			||||||
        for (int i = 0; i < keys.length; i++) {
 | 
					        for (int i = 0; i < keys.length; i++) {
 | 
				
			||||||
            int pos = (idx + i) % keys.length;
 | 
					            int pos = (idx + i) % keys.length;
 | 
				
			||||||
            if (keys[pos] == null) {
 | 
					            if (keys[pos] == null) {
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            } else if (keys[pos].equals(key)) {
 | 
					            } else if (keys[pos].equals(key)) {
 | 
				
			||||||
                return values[pos];
 | 
					                return pos;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return null;
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Deletes the mapping for the specified key from this map if present.
 | 
				
			||||||
 | 
					     * Returns the previous value associated with key, or null if there was
 | 
				
			||||||
 | 
					     * no mapping for key.
 | 
				
			||||||
 | 
					     * Precondition: key != null
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public Vector3 delete(Massive key) {
 | 
				
			||||||
 | 
					        int pos = find(key);
 | 
				
			||||||
 | 
					        if (pos == -1) return null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Vector3 val = values[pos];
 | 
				
			||||||
 | 
					        values[pos] = null;
 | 
				
			||||||
 | 
					        return val;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										234
									
								
								src/MassiveForceTreeMap.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										234
									
								
								src/MassiveForceTreeMap.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,234 @@
 | 
				
			|||||||
 | 
					import codedraw.CodeDraw;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A map that associates an object of 'Massive' with a Vector3. The number of key-value pairs
 | 
				
			||||||
 | 
					 * is not limited.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class MassiveForceTreeMap implements MassiveSet {
 | 
				
			||||||
 | 
					    private int size = 0;
 | 
				
			||||||
 | 
					    private Item root;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Adds a new key-value association to this map. If the key already exists in this map,
 | 
				
			||||||
 | 
					     * the value is replaced and the old value is returned. Otherwise 'null' is returned.
 | 
				
			||||||
 | 
					     * Precondition: key != null.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public Vector3 put(Massive key, Vector3 value) {
 | 
				
			||||||
 | 
					        if (root == null) {
 | 
				
			||||||
 | 
					            root = new Item(key, value);
 | 
				
			||||||
 | 
					            size++;
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Item item = root;
 | 
				
			||||||
 | 
					        while (item != null) {
 | 
				
			||||||
 | 
					            if (item.key.equals(key)) {
 | 
				
			||||||
 | 
					                Vector3 old = item.value;
 | 
				
			||||||
 | 
					                item.value = value;
 | 
				
			||||||
 | 
					                return old;
 | 
				
			||||||
 | 
					            } else if (item.key.mass() > key.mass()) {
 | 
				
			||||||
 | 
					                if (item.left != null) {
 | 
				
			||||||
 | 
					                    item = item.left;
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    item.setLeft(new Item(key, value));
 | 
				
			||||||
 | 
					                    size++;
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                if (item.right != null) {
 | 
				
			||||||
 | 
					                    item = item.right;
 | 
				
			||||||
 | 
					                } else{
 | 
				
			||||||
 | 
					                    item.setRight(new Item(key, value));
 | 
				
			||||||
 | 
					                    size++;
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns the value associated with the specified key, i.e. the method returns the force vector
 | 
				
			||||||
 | 
					     * associated with the specified key. Returns 'null' if the key is not contained in this map.
 | 
				
			||||||
 | 
					     * Precondition: key != null.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public Vector3 get(Massive key) {
 | 
				
			||||||
 | 
					        Item item = root;
 | 
				
			||||||
 | 
					        while (item != null) {
 | 
				
			||||||
 | 
					            if (item.key.equals(key)) {
 | 
				
			||||||
 | 
					                return item.value;
 | 
				
			||||||
 | 
					            } else if (item.key.mass() > key.mass()) {
 | 
				
			||||||
 | 
					                item = item.left;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                item = item.right;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns 'true' if this map contains a mapping for the specified key.
 | 
				
			||||||
 | 
					     * Precondition: key != null
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public boolean containsKey(Massive key) {
 | 
				
			||||||
 | 
					        Item item = root;
 | 
				
			||||||
 | 
					        while (item != null) {
 | 
				
			||||||
 | 
					            if (item.key.equals(key)) {
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            } else if (item.key.mass() > key.mass()) {
 | 
				
			||||||
 | 
					                item = item.left;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                item = item.right;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private String toString(Item item) {
 | 
				
			||||||
 | 
					        String s = "";
 | 
				
			||||||
 | 
					        if (item == null) {
 | 
				
			||||||
 | 
					            return s;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        s += this.toString(item.right);
 | 
				
			||||||
 | 
					        s += String.format("{%s: %s}\n", item.key, item.value);
 | 
				
			||||||
 | 
					        s += this.toString(item.left);
 | 
				
			||||||
 | 
					        return s;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns a readable representation of this map, in which key-value pairs are ordered
 | 
				
			||||||
 | 
					     * descending according to 'key.getMass()'.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public String toString() {
 | 
				
			||||||
 | 
					        return (root != null) ? toString(root) : "";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns a `MassiveSet` view of the keys contained in this tree map. Changing the
 | 
				
			||||||
 | 
					     * elements of the returned `MassiveSet` object also affects the keys in this tree map.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public MassiveSet getKeys() {
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void draw(CodeDraw cd) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public MassiveIterator iterator() {
 | 
				
			||||||
 | 
					        return new MassiveIterator() {
 | 
				
			||||||
 | 
					            private Item next = root.getLeftLeaf();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public Massive next() {
 | 
				
			||||||
 | 
					                if (next == null) return null;
 | 
				
			||||||
 | 
					                Massive m = next.key;
 | 
				
			||||||
 | 
					                Item newNext = (next.right != null) ? next.right.getLeftLeaf() : next.parent;
 | 
				
			||||||
 | 
					                while (newNext != null && newNext.right == next) {
 | 
				
			||||||
 | 
					                    next = newNext;
 | 
				
			||||||
 | 
					                    newNext = newNext.parent;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                next = newNext;
 | 
				
			||||||
 | 
					                return m;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public boolean hasNext() {
 | 
				
			||||||
 | 
					                return next != null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public boolean contains(Massive element) {
 | 
				
			||||||
 | 
					        return containsKey(element);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void remove(Massive element) {
 | 
				
			||||||
 | 
					        Item item = root;
 | 
				
			||||||
 | 
					        while (item != null) {
 | 
				
			||||||
 | 
					            if (item.key.equals(element)) {
 | 
				
			||||||
 | 
					                Item newP = null;
 | 
				
			||||||
 | 
					                if (item.left != null) {
 | 
				
			||||||
 | 
					                    newP = item.left.getRightLeaf();
 | 
				
			||||||
 | 
					                } else if (item.right != null) {
 | 
				
			||||||
 | 
					                    newP = item.right.getLeftLeaf();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (item.parent.left == item) {
 | 
				
			||||||
 | 
					                    item.parent.setLeft(newP);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    item.parent.setRight(newP);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                size--;
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            } else if (item.key.mass() > element.mass()) {
 | 
				
			||||||
 | 
					                item = item.left;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                item = item.right;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void clear() {
 | 
				
			||||||
 | 
					        size = 0;
 | 
				
			||||||
 | 
					        root = null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int size() {
 | 
				
			||||||
 | 
					        return size;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public MassiveLinkedList toList() {
 | 
				
			||||||
 | 
					        MassiveLinkedList list = new MassiveLinkedList();
 | 
				
			||||||
 | 
					        for (Massive m : this) {
 | 
				
			||||||
 | 
					            list.addLast(m);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return list;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static class Item {
 | 
				
			||||||
 | 
					        private final Massive key;
 | 
				
			||||||
 | 
					        private Vector3 value;
 | 
				
			||||||
 | 
					        private Item parent;
 | 
				
			||||||
 | 
					        private Item left;
 | 
				
			||||||
 | 
					        private Item right;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public Item(Massive key, Vector3 value) {
 | 
				
			||||||
 | 
					            this.key = key;
 | 
				
			||||||
 | 
					            this.value = value;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public void setLeft(Item left) {
 | 
				
			||||||
 | 
					            this.left = left;
 | 
				
			||||||
 | 
					            if (left != null) left.parent = this;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public void setRight(Item right) {
 | 
				
			||||||
 | 
					            this.right = right;
 | 
				
			||||||
 | 
					            if (right != null) right.parent = this;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public Item getLeftLeaf() {
 | 
				
			||||||
 | 
					            Item cur = this;
 | 
				
			||||||
 | 
					            while (cur.left != null) {
 | 
				
			||||||
 | 
					                cur = cur.left;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return cur;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public Item getRightLeaf() {
 | 
				
			||||||
 | 
					            Item cur = this;
 | 
				
			||||||
 | 
					            while (cur.right != null) {
 | 
				
			||||||
 | 
					                cur = cur.right;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return cur;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										11
									
								
								src/MassiveIterable.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/MassiveIterable.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Iterable objects with 'Massive' elements.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public interface MassiveIterable extends Iterable<Massive> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns an iterator over elements of 'Massive'.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    MassiveIterator iterator();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										20
									
								
								src/MassiveIterator.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/MassiveIterator.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					import java.util.Iterator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * An iterator over elements of 'Massive'.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public interface MassiveIterator extends Iterator<Massive> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns the next element in the iteration.
 | 
				
			||||||
 | 
					     * (Returns 'null' if the iteration has no more elements.)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    Massive next();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns 'true' if the iteration has more elements.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    boolean hasNext();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -98,7 +98,7 @@ public class MassiveLinkedList implements Iterable<Massive> {
 | 
				
			|||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Massive m = last.body;
 | 
					        Massive m = last.body;
 | 
				
			||||||
        last = last.next;
 | 
					        last = last.prev;
 | 
				
			||||||
        if (last != null) last.setNext(null);
 | 
					        if (last != null) last.setNext(null);
 | 
				
			||||||
        size--;
 | 
					        size--;
 | 
				
			||||||
        return m;
 | 
					        return m;
 | 
				
			||||||
@@ -194,7 +194,7 @@ public class MassiveLinkedList implements Iterable<Massive> {
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private class Item {
 | 
					    private static class Item {
 | 
				
			||||||
        private final Massive body;
 | 
					        private final Massive body;
 | 
				
			||||||
        private Item prev;
 | 
					        private Item prev;
 | 
				
			||||||
        private Item next;
 | 
					        private Item next;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										31
									
								
								src/MassiveSet.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/MassiveSet.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A collection of 'Massive' objects in which there are no duplicates.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public interface MassiveSet extends MassiveIterable, Drawable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns 'true' if the set has the specified element (i.e., has an element equal to the
 | 
				
			||||||
 | 
					     * specified element).
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    boolean contains(Massive element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Removes the specified element from the set.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void remove(Massive element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Removes all elements from the set.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns the number of elements in the set.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    int size();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns an object of 'MassiveLinkedList' with all elements of 'this'.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    MassiveLinkedList toList();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -35,7 +35,6 @@ public class Simulation5 {
 | 
				
			|||||||
     * The main simulation method using instances of other classes.
 | 
					     * The main simulation method using instances of other classes.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static void main(String[] args) {
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
        // simulation
 | 
					        // simulation
 | 
				
			||||||
        CodeDraw cd = new CodeDraw();
 | 
					        CodeDraw cd = new CodeDraw();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -52,6 +51,7 @@ public class Simulation5 {
 | 
				
			|||||||
        NamedBody pallas = new NamedBody(SolSystem4.PALLAS_NAMED);
 | 
					        NamedBody pallas = new NamedBody(SolSystem4.PALLAS_NAMED);
 | 
				
			||||||
        NamedBody hygiea = new NamedBody(SolSystem4.HYGIEA_NAMED);
 | 
					        NamedBody hygiea = new NamedBody(SolSystem4.HYGIEA_NAMED);
 | 
				
			||||||
        NamedBody ceres = new NamedBody(SolSystem4.CERES_NAMED);
 | 
					        NamedBody ceres = new NamedBody(SolSystem4.CERES_NAMED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // create some additional bodies
 | 
					        // create some additional bodies
 | 
				
			||||||
        Body[] bodies = new Body[NUMBER_OF_BODIES];
 | 
					        Body[] bodies = new Body[NUMBER_OF_BODIES];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										113
									
								
								src/Simulation6.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								src/Simulation6.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,113 @@
 | 
				
			|||||||
 | 
					import codedraw.CodeDraw;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.awt.*;
 | 
				
			||||||
 | 
					import java.util.Random;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Simulates the formation of a massive solar system.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class Simulation6 {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // gravitational constant
 | 
				
			||||||
 | 
					    public static final double G = 6.6743e-11;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // one astronomical unit (AU) is the average distance of earth to the sun.
 | 
				
			||||||
 | 
					    public static final double AU = 150e9; // meters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // one light year
 | 
				
			||||||
 | 
					    public static final double LY = 9.461e15; // meters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // some further constants needed in the simulation
 | 
				
			||||||
 | 
					    public static final double SUN_MASS = 1.989e30; // kilograms
 | 
				
			||||||
 | 
					    public static final double SUN_RADIUS = 696340e3; // meters
 | 
				
			||||||
 | 
					    public static final double EARTH_MASS = 5.972e24; // kilograms
 | 
				
			||||||
 | 
					    public static final double EARTH_RADIUS = 6371e3; // meters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // set some system parameters
 | 
				
			||||||
 | 
					    public static final double SECTION_SIZE = 10 * AU; // the size of the square region in space
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final int NUMBER_OF_BODIES = 22;
 | 
				
			||||||
 | 
					    public static final double OVERALL_SYSTEM_MASS = 20 * SUN_MASS; // kilograms
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // all quantities are based on units of kilogram respectively second and meter.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * The main simulation method using instances of other classes.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					        // simulation
 | 
				
			||||||
 | 
					        CodeDraw cd = new CodeDraw();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // create solar system with 12 bodies
 | 
				
			||||||
 | 
					        NamedBody sun = new NamedBody(SolSystem4.SUN_NAMED);
 | 
				
			||||||
 | 
					        NamedBody earth = new NamedBody(SolSystem4.EARTH_NAMED);
 | 
				
			||||||
 | 
					        NamedBody moon = new NamedBody(SolSystem4.MOON_NAMED);
 | 
				
			||||||
 | 
					        NamedBody mars = new NamedBody(SolSystem4.MARS_NAMED);
 | 
				
			||||||
 | 
					        NamedBody deimos = new NamedBody(SolSystem4.DEIMOS_NAMED);
 | 
				
			||||||
 | 
					        NamedBody phobos = new NamedBody(SolSystem4.PHOBOS_NAMED);
 | 
				
			||||||
 | 
					        NamedBody mercury = new NamedBody(SolSystem4.MERCURY_NAMED);
 | 
				
			||||||
 | 
					        NamedBody venus = new NamedBody(SolSystem4.VENUS_NAMED);
 | 
				
			||||||
 | 
					        NamedBody vesta = new NamedBody(SolSystem4.VESTA_NAMED);
 | 
				
			||||||
 | 
					        NamedBody pallas = new NamedBody(SolSystem4.PALLAS_NAMED);
 | 
				
			||||||
 | 
					        NamedBody hygiea = new NamedBody(SolSystem4.HYGIEA_NAMED);
 | 
				
			||||||
 | 
					        NamedBody ceres = new NamedBody(SolSystem4.CERES_NAMED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // create some additional bodies
 | 
				
			||||||
 | 
					        Body[] bodies = new Body[NUMBER_OF_BODIES];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Random random = new Random(2022);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (int i = 0; i < bodies.length; i++) {
 | 
				
			||||||
 | 
					            bodies[i] = new Body(
 | 
				
			||||||
 | 
					                    Math.abs(random.nextGaussian()) * OVERALL_SYSTEM_MASS / bodies.length,
 | 
				
			||||||
 | 
					                    new Vector3(0.2 * random.nextGaussian() * AU, 0.2 * random.nextGaussian() * AU, 0.2 * random.nextGaussian() * AU),
 | 
				
			||||||
 | 
					                    new Vector3(0 + random.nextGaussian() * 5e3, 0 + random.nextGaussian() * 5e3, 0 + random.nextGaussian() * 5e3)
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        MassiveForceTreeMap forceOnBody = new MassiveForceTreeMap();
 | 
				
			||||||
 | 
					        forceOnBody.put(sun, new Vector3());
 | 
				
			||||||
 | 
					        forceOnBody.put(earth, new Vector3());
 | 
				
			||||||
 | 
					        forceOnBody.put(moon, new Vector3());
 | 
				
			||||||
 | 
					        forceOnBody.put(mars, new Vector3());
 | 
				
			||||||
 | 
					        forceOnBody.put(deimos, new Vector3());
 | 
				
			||||||
 | 
					        forceOnBody.put(phobos, new Vector3());
 | 
				
			||||||
 | 
					        forceOnBody.put(mercury, new Vector3());
 | 
				
			||||||
 | 
					        forceOnBody.put(venus, new Vector3());
 | 
				
			||||||
 | 
					        forceOnBody.put(vesta, new Vector3());
 | 
				
			||||||
 | 
					        forceOnBody.put(pallas, new Vector3());
 | 
				
			||||||
 | 
					        forceOnBody.put(hygiea, new Vector3());
 | 
				
			||||||
 | 
					        forceOnBody.put(ceres, new Vector3());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (Body b : bodies) {
 | 
				
			||||||
 | 
					            forceOnBody.put(b, new Vector3());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        long seconds = 0;
 | 
				
			||||||
 | 
					        while (true) {
 | 
				
			||||||
 | 
					            seconds++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for (Massive b1 : forceOnBody.getKeys()) {
 | 
				
			||||||
 | 
					                Vector3 force = new Vector3();
 | 
				
			||||||
 | 
					                for (Massive b2 : forceOnBody.getKeys()) {
 | 
				
			||||||
 | 
					                    if (b1 != b2) {
 | 
				
			||||||
 | 
					                        force = force.plus(b1.gravitationalForce(b2));
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                forceOnBody.put(b1, force);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for (Massive body : forceOnBody.getKeys()) {
 | 
				
			||||||
 | 
					                body.move(forceOnBody.get(body));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if ((seconds % 3600) == 0) {
 | 
				
			||||||
 | 
					                cd.clear(Color.BLACK);
 | 
				
			||||||
 | 
					                for (Massive body : forceOnBody.getKeys()) {
 | 
				
			||||||
 | 
					                    body.draw(cd);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                cd.show();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user