Compare commits
	
		
			1 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						0259be8338
	
				 | 
					
					
						
@@ -37,14 +37,12 @@ public class Body {
 | 
			
		||||
     * Hint: see simulation loop in Simulation.java to find out how this is done.
 | 
			
		||||
     */
 | 
			
		||||
    public Vector gravitationalForce(Body b) {
 | 
			
		||||
        Vector direction = b.massCenter.minus(this.massCenter);
 | 
			
		||||
        Vector direction = b.massCenter.minus(massCenter);
 | 
			
		||||
        double distance = direction.length();
 | 
			
		||||
        if (distance == 0) return direction;
 | 
			
		||||
 | 
			
		||||
        if (distance == 0) return new Vector();
 | 
			
		||||
        direction.normalize();
 | 
			
		||||
        double force = Simulation.G * this.mass * b.mass / (distance * distance);
 | 
			
		||||
        direction.mul(force);
 | 
			
		||||
        return direction;
 | 
			
		||||
        double force = Simulation.G * mass * b.mass / (distance * distance);
 | 
			
		||||
        return direction.times(force);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -36,10 +36,11 @@ public class Octree {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void applyForces(Body[] bodies, Vector[] forces, double t) {
 | 
			
		||||
    public void applyForces(Body[] bodies, double t) {
 | 
			
		||||
        if (root == null) return;
 | 
			
		||||
        Vector[] forces = new Vector[bodies.length];
 | 
			
		||||
        for (int i = 0; i < bodies.length; i++) {
 | 
			
		||||
            root.addForcesOnBody(bodies[i], forces[i], t);
 | 
			
		||||
            forces[i] = root.getForcesOnBody(bodies[i], t);
 | 
			
		||||
        }
 | 
			
		||||
        for (int i = 0; i < bodies.length; i++) {
 | 
			
		||||
            bodies[i].move(forces[i]);
 | 
			
		||||
@@ -67,8 +68,6 @@ abstract class OctreeItem {
 | 
			
		||||
 | 
			
		||||
    abstract protected Vector getForcesOnBody(Body body, double t);
 | 
			
		||||
 | 
			
		||||
    abstract protected void addForcesOnBody(Body body, Vector force, double t);
 | 
			
		||||
 | 
			
		||||
    abstract protected void draw(CodeDraw cd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -104,24 +103,18 @@ class OctreeNode extends OctreeItem {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected Vector getForcesOnBody(Body body, double t) {
 | 
			
		||||
        Vector v = new Vector();
 | 
			
		||||
        addForcesOnBody(body, v, t);
 | 
			
		||||
        return v;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void addForcesOnBody(Body body, Vector force, double t) {
 | 
			
		||||
        double r = center.distanceTo(body.massCenter());
 | 
			
		||||
        double r = pseudoBody.massCenter().distanceTo(body.massCenter());
 | 
			
		||||
        if (r == 0) {
 | 
			
		||||
            return;
 | 
			
		||||
            return new Vector();
 | 
			
		||||
        } else if (size / r < t) {
 | 
			
		||||
            force.add(body.gravitationalForce(pseudoBody));
 | 
			
		||||
            return;
 | 
			
		||||
            return body.gravitationalForce(pseudoBody);
 | 
			
		||||
        }
 | 
			
		||||
        Vector force = new Vector();
 | 
			
		||||
        for (OctreeItem child : children) {
 | 
			
		||||
            if (child == null) continue;
 | 
			
		||||
            child.addForcesOnBody(body, force, t);
 | 
			
		||||
            force.add(child.getForcesOnBody(body, t));
 | 
			
		||||
        }
 | 
			
		||||
        return force;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -164,7 +157,7 @@ class OctreeLeaf extends OctreeItem {
 | 
			
		||||
    public OctreeLeaf(Vector center, double size, Body body) {
 | 
			
		||||
        super(center, size);
 | 
			
		||||
        this.body = body;
 | 
			
		||||
        //this.pseudoBody = new Body(this.body);
 | 
			
		||||
        this.pseudoBody = new Body(this.body);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -174,21 +167,14 @@ class OctreeLeaf extends OctreeItem {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected Vector getForcesOnBody(Body body, double t) {
 | 
			
		||||
        return body.gravitationalForce(body);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void addForcesOnBody(Body body, Vector force, double t) {
 | 
			
		||||
        force.add(getForcesOnBody(body, t));
 | 
			
		||||
        return body.gravitationalForce(pseudoBody);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void draw(CodeDraw cd) {
 | 
			
		||||
        /*
 | 
			
		||||
        Vector p1 = center.minus(new Vector(size / 2));
 | 
			
		||||
        Vector p2 = new Vector(size).minus(new Vector(Simulation.SECTION_SIZE / 2));
 | 
			
		||||
        cd.setColor(Color.GREEN);
 | 
			
		||||
        cd.drawRectangle(p1.getScreenX(cd), p1.getScreenY(cd), p2.getScreenX(cd), p2.getScreenY(cd));
 | 
			
		||||
         */
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ public class Simulation {
 | 
			
		||||
    // set some system parameters
 | 
			
		||||
    public static final double SECTION_SIZE = 2 * AU; // the size of the square region in space
 | 
			
		||||
    public static final int NUMBER_OF_BODIES = 10000;
 | 
			
		||||
    public static final double OVERALL_SYSTEM_MASS = 20 * SUN_MASS; // kilograms
 | 
			
		||||
    public static final double OVERALL_SYSTEM_MASS = 2000 * SUN_MASS; // kilograms
 | 
			
		||||
 | 
			
		||||
    public static void main(String[] args) {
 | 
			
		||||
        CodeDraw cd = new CodeDraw();
 | 
			
		||||
@@ -48,34 +48,14 @@ public class Simulation {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        long seconds = 0;
 | 
			
		||||
        Vector[] forces = new Vector[bodies.length];
 | 
			
		||||
        for (int i = 0; i < forces.length; i++) forces[i] = new Vector();
 | 
			
		||||
 | 
			
		||||
        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;
 | 
			
		||||
            */
 | 
			
		||||
            //long n1 = System.nanoTime();
 | 
			
		||||
            Octree octree = new Octree(new Vector(0, 0, 0), SECTION_SIZE);
 | 
			
		||||
            for (Body body : bodies) {
 | 
			
		||||
                octree.add(body);
 | 
			
		||||
            }
 | 
			
		||||
            //long n2 = System.nanoTime();
 | 
			
		||||
            for (Vector f : forces) f.reset();
 | 
			
		||||
            octree.applyForces(bodies, forces, 1);
 | 
			
		||||
            //long n3 = System.nanoTime();
 | 
			
		||||
 | 
			
		||||
            //System.out.format("%8.3f µs, %8.3f µs\n", (n2 - n1) / 1000.0, (n3 - n2) / 1000.0);
 | 
			
		||||
            octree.applyForces(bodies, 100);
 | 
			
		||||
 | 
			
		||||
            if ((seconds % 60) == 0) {
 | 
			
		||||
                cd.clear(Color.BLACK);
 | 
			
		||||
 
 | 
			
		||||
@@ -58,18 +58,6 @@ public class Vector {
 | 
			
		||||
        return new Vector(x * d, y * d, z * d);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void mul(double d) {
 | 
			
		||||
        this.x *= d;
 | 
			
		||||
        this.y *= d;
 | 
			
		||||
        this.z *= d;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void div(double d) {
 | 
			
		||||
        this.x /= d;
 | 
			
		||||
        this.y /= d;
 | 
			
		||||
        this.z /= d;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the sum of this vector and -1*v.
 | 
			
		||||
     */
 | 
			
		||||
@@ -92,7 +80,7 @@ public class Vector {
 | 
			
		||||
     * Returns the length (norm) of this vector.
 | 
			
		||||
     */
 | 
			
		||||
    public double length() {
 | 
			
		||||
        return Math.sqrt(x * x + y * y + z * z);
 | 
			
		||||
        return distanceTo(new Vector());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -100,13 +88,10 @@ public class Vector {
 | 
			
		||||
     * The direction and orientation of the vector is not affected.
 | 
			
		||||
     */
 | 
			
		||||
    public void normalize() {
 | 
			
		||||
        div(length());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void reset() {
 | 
			
		||||
        x = 0;
 | 
			
		||||
        y = 0;
 | 
			
		||||
        z = 0;
 | 
			
		||||
        double length = length();
 | 
			
		||||
        x /= length;
 | 
			
		||||
        y /= length;
 | 
			
		||||
        z /= length;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public double getScreenX(CodeDraw cd) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user