ngraph.forcelayout
Version:
Force directed graph drawing layout
69 lines (54 loc) • 2.02 kB
JavaScript
var test = require('tap').test;
var dimensions = 2;
var Body = require('../lib/codeGenerators/generateCreateBody')(dimensions);
var integrate = require('../lib/codeGenerators/generateIntegrator')(dimensions);
test('Body preserves velocity without forces', function (t) {
var body = new Body();
var timeStep = 1;
body.mass = 1; body.velocity.x = 1;
integrate([body], timeStep);
t.equal(body.pos.x, 1, 'Should move by 1 pixel on first iteration');
timeStep = 2; // let's increase time step:
integrate([body], timeStep);
t.equal(body.pos.x, 3, 'Should move by 2 pixel on second iteration');
t.end();
});
test('Body gains velocity under force', function (t) {
var body = new Body();
var timeStep = 1;
body.mass = 1; body.force.x = 0.1;
// F = m * a;
// since mass = 1 => F = a = y';
integrate([body], timeStep);
t.equal(body.velocity.x, 0.1, 'Should increase velocity');
integrate([body], timeStep);
t.equal(body.velocity.x, 0.2, 'Should increase velocity');
// floating point math:
t.ok(0.29 < body.pos.x && body.pos.x < 0.31, 'Position should be at 0.3 now');
t.end();
});
test('No bodies yield 0 movement', function (t) {
var movement = integrate([], 2);
t.equal(movement, 0, 'Nothing has moved');
t.end();
});
test('Body does not move faster than 1px', function (t) {
var body = new Body();
var timeStep = 1;
body.mass = 1; body.force.x = 2;
integrate([body], timeStep);
t.ok(body.velocity.x <= 1, 'Velocity should be within speed limit');
integrate([body], timeStep);
t.ok(body.velocity.x <= 1, 'Velocity should be within speed limit');
t.end();
});
test('Can get total system movement', function (t) {
var body = new Body();
var timeStep = 1;
body.mass = 1; body.velocity.x = 0.2;
var movement = integrate([body], timeStep);
// to improve performance, integrator does not take square root, thus
// total movement is .2 * .2 = 0.04;
t.ok(0.04 <= movement && movement <= 0.041, 'System should travel by 0.2 pixels');
t.end();
});