-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathPhysicsObject.pde
More file actions
100 lines (81 loc) · 2.61 KB
/
PhysicsObject.pde
File metadata and controls
100 lines (81 loc) · 2.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
abstract class PhysicsObject {
VectorGetter[] forces;
VectorGetter[] velMods;
PVector force, vel, tempVel = new PVector(), pos, tempPos = new PVector(),
prevPos = new PVector();
ArrayList<PVector> k = new ArrayList<PVector>(),
kv = new ArrayList<PVector>();
float mass;
PhysicsObject(
VectorGetter[] f,
VectorGetter[] v,
PVector force,
PVector vel,
PVector pos,
float mass
) {
this.forces = f;
this.velMods = v;
this.force = force;
this.vel = vel;
this.pos = pos;
this.mass = mass;
for (int i = 0; i < rkCoefficients.length; i++) {
k.add(new PVector());
kv.add(new PVector());
}
}
void rk4() {
// find k1
PVector kThis = k.get(0);
kThis.set(force);
// includes any forces applied during neighbor search
// (eg. random force from particles on top of each other)
tempVel.set(vel);
tempPos.set(pos);
kv.set(0, vel);
for (VectorGetter f : forces) {
kThis.add(fixVector((PVector) f.apply(this)));
// if (kThis.mag() == Float.POSITIVE_INFINITY) println(f);
}
// find the rest
for (int i = 1; i < rkCoefficients.length; i++) {
tempVel.add(PVector.mult(kThis, t * rkCoefficients[i] / mass));
tempPos.add(PVector.mult(tempVel, t * rkCoefficients[i]));
kv.set(i, tempVel);
kThis = k.get(i);
kThis.set(0, 0);
for (VectorGetter f : forces) {
kThis.add(fixVector((PVector) f.apply(this)));
}
}
}
void move() {
for (int i = 0; i < rkCoefficients.length; i++) {
force.add(k.get(i).div(rkCoefficients[i]));
}
force.div(divBy);
// for (VectorGetter f : forces) {
// force.add(fixVector(f.apply(this)));
// }
vel.add(PVector.mult(force, t / mass));
force.set(0, 0);
for (VectorGetter v : velMods) {
vel = fixVector((PVector) v.apply(this));
}
PVector rkVel = new PVector();
for (int i = 0; i < rkCoefficients.length; i++) {
rkVel.add(kv.get(i).div(rkCoefficients[i]));
}
rkVel.div(divBy);
for (VectorGetter v : velMods) {
rkVel = fixVector((PVector) v.apply(this));
}
pos.add(PVector.mult(rkVel, t));
fixVector(pos);
}
abstract void draw();
PVector gravity() {
return new PVector(0, 9.81 * mass);
}
}