Accelerators
Accelerators decide how particles behave if they come close to each other.
More precicely, they decide how much an individual particle should accelerate and in what direction.
For that, they are only provided with very limited information:
- the factor between the type of this particle and the type of the neighbor particle
- the position of the neighbor particle, relative to this particle
Accelerators must implement the Accelerator
interface. You can do this with a lambda expression:
java
Accelerator myAccelerator = (a, pos) -> {
return new Vector3d(0, 0, 0); // no acceleration
};
Accelerator myAccelerator = (a, pos) -> {
return new Vector3d(0, 0, 0); // no acceleration
};
Pass this to the constructor of the Physics
class:
java
Physics physics = new Physics(myAccelerator);
Physics physics = new Physics(myAccelerator);
To change the accelerator later, simply set the accelerator
attribute of your Physics
instance:
java
physics.accelerator = myAccelerator;
physics.accelerator = myAccelerator;
For example, you could implement the rules of Particle Life like this:
java
Accelerator particleLife = (a, pos) -> {
double rmin = 0.3;
double dist = pos.length();
double force = dist < rmin ?
(dist / rmin - 1) : a * (1 - Math.abs(1 + rmin - 2 * dist) / (1 - rmin));
return pos.mul(force / dist);
};
Accelerator particleLife = (a, pos) -> {
double rmin = 0.3;
double dist = pos.length();
double force = dist < rmin ?
(dist / rmin - 1) : a * (1 - Math.abs(1 + rmin - 2 * dist) / (1 - rmin));
return pos.mul(force / dist);
};
But that is just one possible accelerator, and there are many other accelerators that show interesting behaviour.