45 lines
No EOL
1.4 KiB
JavaScript
Executable file
45 lines
No EOL
1.4 KiB
JavaScript
Executable file
/**
|
|
* This is not used anywhere, but it is a good exploration into kd-tree based
|
|
* simulation.
|
|
*/
|
|
module.exports = createKDForce;
|
|
|
|
function createKDForce(bodies, settings) {
|
|
var KDBush = require('kdbush').default;
|
|
var random = require('ngraph.random').random(1984);
|
|
|
|
return kdForce;
|
|
|
|
function kdForce(iterationNumber) {
|
|
if (iterationNumber < 500) return;
|
|
var gravity = settings.gravity;
|
|
var points = new KDBush(bodies, p => p.pos.x0, p => p.pos.x1);
|
|
var i = bodies.length;
|
|
while (i--) {
|
|
var body = bodies[i];
|
|
body.reset();
|
|
var neighbors = points.within(body.pos.x0, body.pos.x1, settings.springLength);
|
|
var fx = 0, fy = 0;
|
|
for (var j = 0; j < neighbors.length; ++j) {
|
|
var other = bodies[neighbors[j]];
|
|
if (other === body) continue;
|
|
|
|
var dx = other.pos.x0 - body.pos.x0;
|
|
var dy = other.pos.x1 - body.pos.x1;
|
|
var r = Math.sqrt(dx * dx + dy * dy);
|
|
if (r === 0) {
|
|
// Poor man's protection against zero distance.
|
|
dx = (random.nextDouble() - 0.5) / 50;
|
|
dy = (random.nextDouble() - 0.5) / 50;
|
|
r = Math.sqrt(dx * dx + dy * dy);
|
|
}
|
|
var v = gravity * other.mass * body.mass / (r * r * r);
|
|
fx += v * dx;
|
|
fy += v * dy;
|
|
}
|
|
body.force.x0 = fx;
|
|
body.force.x1 = fy;
|
|
//dragForce.update(body);
|
|
}
|
|
}
|
|
} |