ngraph.forcelayout
Version:
Force directed graph drawing layout
45 lines (41 loc) • 1.39 kB
JavaScript
/**
* 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);
}
}
}