75 lines
2.3 KiB
Java
75 lines
2.3 KiB
Java
import codedraw.CodeDraw;
|
|
|
|
import java.awt.*;
|
|
import java.util.Random;
|
|
|
|
/**
|
|
* Simulates the formation of a massive solar system.
|
|
*/
|
|
public class Simulation3 {
|
|
|
|
/**
|
|
* The main simulation method using instances of other classes.
|
|
*/
|
|
public static void main(String[] args) {
|
|
CodeDraw cd = new CodeDraw();
|
|
BodyLinkedList bodies = new BodyLinkedList();
|
|
BodyForceTreeMap forceOnBody = new BodyForceTreeMap();
|
|
|
|
Random random = new Random(2022);
|
|
|
|
for (int i = 0; i < Simulation.NUMBER_OF_BODIES; i++) {
|
|
bodies.addLast(new Body(
|
|
Math.abs(random.nextGaussian()) * Simulation.OVERALL_SYSTEM_MASS / Simulation.NUMBER_OF_BODIES,
|
|
new Vector3(
|
|
0.2 * random.nextGaussian() * Simulation.AU,
|
|
0.2 * random.nextGaussian() * Simulation.AU,
|
|
0.2 * random.nextGaussian() * Simulation.AU
|
|
),
|
|
new Vector3(
|
|
0 + random.nextGaussian() * 5e3,
|
|
0 + random.nextGaussian() * 5e3,
|
|
0 + random.nextGaussian() * 5e3
|
|
)
|
|
));
|
|
}
|
|
|
|
long seconds = 0;
|
|
while (true) {
|
|
seconds++;
|
|
|
|
BodyLinkedList mergedBodies = new BodyLinkedList();
|
|
for (Body b1 : bodies) {
|
|
BodyLinkedList colliding = bodies.removeCollidingWith(b1);
|
|
for (Body b2 : colliding) {
|
|
b1 = b1.merge(b2);
|
|
}
|
|
mergedBodies.addLast(b1);
|
|
}
|
|
bodies = mergedBodies;
|
|
|
|
for (Body b1 : bodies) {
|
|
Vector3 force = new Vector3();
|
|
for (Body b2 : bodies) {
|
|
if (b1 != b2) {
|
|
force = force.plus(b1.gravitationalForce(b2));
|
|
}
|
|
}
|
|
forceOnBody.put(b1, force);
|
|
}
|
|
|
|
for (Body body : bodies) {
|
|
body.move(forceOnBody.get(body));
|
|
}
|
|
|
|
if ((seconds % 3600) == 0) {
|
|
cd.clear(Color.BLACK);
|
|
for (Body body : bodies) {
|
|
body.draw(cd);
|
|
}
|
|
cd.show();
|
|
}
|
|
}
|
|
}
|
|
}
|