Woking (sort of)

This commit is contained in:
2022-04-12 21:10:48 +02:00
parent 5d129cd6f9
commit 4f8f9e0c37
3 changed files with 42 additions and 13 deletions

View File

@ -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));
}
}