diff --git a/src/Body.java b/src/Body.java index 4d45bf2..671403b 100644 --- a/src/Body.java +++ b/src/Body.java @@ -39,6 +39,7 @@ public class Body { public Vector gravitationalForce(Body b) { Vector direction = b.massCenter.minus(massCenter); double distance = direction.length(); + if (distance == 0) return new Vector(); direction.normalize(); double force = Simulation.G * mass * b.mass / (distance * distance); return direction.times(force); diff --git a/src/Octree.java b/src/Octree.java index f33f6a1..6003091 100644 --- a/src/Octree.java +++ b/src/Octree.java @@ -1,3 +1,6 @@ +import codedraw.CodeDraw; + +import java.awt.*; /** * + -> >= 0 @@ -44,6 +47,11 @@ public class Octree { bodies[i].move(forces[i]); } } + + public void draw(CodeDraw cd) { + if (root == null) return; + root.draw(cd); + } } abstract class OctreeItem { @@ -62,13 +70,16 @@ abstract class OctreeItem { abstract protected void preCalc(); abstract protected Vector getForcesOnBody(Body body, double t); + + abstract protected void draw(CodeDraw cd); } class OctreeNode extends OctreeItem { - private final OctreeItem[] children = new OctreeItem[8];; + private final OctreeItem[] children; protected OctreeNode(Vector center, double size) { super(center, size); + children = new OctreeItem[8]; } @Override @@ -77,7 +88,7 @@ class OctreeNode extends OctreeItem { if (num < 0) return this; OctreeItem oct = children[num]; if (oct == null) { - children[num] = new OctreeLeaf(getOctantCenter(num), size / 2.0, body); + children[num] = new OctreeLeaf(getOctantCenter(num), size / 2, body); } else { children[num] = oct.add(body); } @@ -116,9 +127,21 @@ class OctreeNode extends OctreeItem { return force; } + @Override + protected void draw(CodeDraw cd) { + for (OctreeItem child : children) { + if (child == null) continue; + child.draw(cd); + } + Vector p1 = center.minus(new Vector(size / 2)); + Vector p2 = new Vector(size).minus(new Vector(Simulation.SECTION_SIZE / 2)); + cd.setColor(Color.CYAN); + cd.drawRectangle(p1.getScreenX(cd), p1.getScreenY(cd), p2.getScreenX(cd), p2.getScreenY(cd)); + } + private int getOctantNum(Vector bodyPos) { - Vector pos = bodyPos.minus(this.center); if (!isInOctant(bodyPos)) return -1; + Vector pos = bodyPos.minus(this.center); return ((pos.getX() < 0) ? 1 : 0) | ((pos.getY() < 0) ? 2 : 0) | ((pos.getZ() < 0) ? 4 : 0); } @@ -131,10 +154,10 @@ class OctreeNode extends OctreeItem { private Vector getOctantCenter(int octNum) { return this.center.plus(new Vector( - ((octNum & 1) != 0) ? -0.5 : 0.5, - ((octNum & 2) != 0) ? -0.5 : 0.5, - ((octNum & 4) != 0) ? -0.5 : 0.5) - .times(this.size)); + ((octNum & 1) != 0) ? -1 : 1, + ((octNum & 2) != 0) ? -1 : 1, + ((octNum & 4) != 0) ? -1 : 1) + .times(this.size / 4)); } } @@ -148,15 +171,11 @@ class OctreeLeaf extends OctreeItem { @Override protected OctreeNode add(Body body) { - OctreeNode replace = new OctreeNode(this.center, this.size); - replace.add(this.body); - replace.add(body); - return replace; + return new OctreeNode(this.center, this.size).add(this.body).add(body); } @Override protected void preCalc() { - System.out.println(this.body); this.pseudoBody = new Body(this.body); } @@ -164,4 +183,12 @@ class OctreeLeaf extends OctreeItem { protected Vector getForcesOnBody(Body body, double 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)); + } } diff --git a/src/Simulation.java b/src/Simulation.java index c435283..559bcb1 100644 --- a/src/Simulation.java +++ b/src/Simulation.java @@ -62,7 +62,7 @@ public class Simulation { } bodies = mergedBodies; */ - Octree octree = new Octree(new Vector(AU), SECTION_SIZE); + Octree octree = new Octree(new Vector(0, 0, 0), SECTION_SIZE); for (Body body : bodies) { octree.add(body); } @@ -73,6 +73,7 @@ public class Simulation { for (Body body : bodies) { body.draw(cd); } + octree.draw(cd); cd.show(); } }