Sign Up for Free

RunKit +

Try any Node.js package right in your browser

This is a playground to test code. It runs a full Node.js environment and already has all of npm’s 400,000 packages pre-installed, including ngraph.quadtreebh3d with all npm packages installed. Try it out:

var ngraphQuadtreebh3d = require("ngraph.quadtreebh3d")

This service is provided by RunKit and is not affiliated with npm, Inc or the package authors.

ngraph.quadtreebh3d v1.0.0

Quad Tree data structure for Barnes-Hut simulation in 3d space

ngraph.quadtreebh3d

Quad Tree data structure for Barnes-Hut simulation in 3d space. Technically it should be named OctTree, since it's not a quad tree. But for parity with 2d interface it's currently called quadtree. Let me know if you think it should be changed :).

This project is part of ngraph family. If you need 2d quad tree follow to ngraph.quadtreebh.

Build Status.

Reference

  1. Fast Hierarchical Methods for the N-body Problem - one of the best explanations of Barnes-Hut method by James Demmel.
  2. Wikipedia article - general introduction into the problem

Usage

var Body = require('ngraph.physics.primitives').Body3d;
// Create new bodies at (1, 1, 1) and (0, 0, 0):
var bodies = [];
bodies.push(new Body(1, 1, 1));
bodies.push(new Body(0, 0, 0));
/* ... create more as you need ... */

// build quad tree:
var createQuadTree = require('ngraph.quadtreebh3d');
var quadTree = createQuadTree();

// insert bodies into the quad tree 
quadTree.insertBodies(bodies); // performance: O(n * log n)

// calculate forces acting on each body in the tree O(n * log n):
bodies.forEach(function(body) {
  quadTree.updateBodyForce(body);
});
// At this point every body object has valid 3d force vecor
console.dir(bodies[0].force);

Note: You don't necessary have to use ngraph.physics.primitives. That package merely defines an interface for a physical Body, which is expected by quad tree. As long as your Body object implements this interface (mass, pos and force) - you can use current quad tree structure to calculate forces.

Configuring quad tree

Quad tree allows to change two global options:

  • gravity - Gravitational constant, used in force value calculation. Defaults to -1;
  • theta - a threshold which determines when group of bodies is considered distant enough to be approximated as a single body. The value should be > 0, and usually little less than 1. It defaults to 0.8 if not suplied. This argument affects accuracy and speed of simulation. Please refer to [1] for more details.

You can pass these setting to quad tree as follows:

var createQuadTree = require('ngraph.quadtreebh3d');
var quadTree = createQuadTree({
  theta: 1.2,
  gravity: -10
});

To query current options of the tree use:

var createQuadTree = require('ngraph.quadtreebh3d');
var quadTree = createQuadTree();
console.dir(quadTree.options()); // prints { theta: 0.8, gravity: -1};

To change options at run time:

var createQuadTree = require('ngraph.quadtreebh3d');
var quadTree = createQuadTree();
quadTree.options({
  theta: 0.5,
  gravity: -42
});

Mass of each body affects overall result of computation. You can tweak it when creating new bodies:

var Body = require('ngraph.physics.primitives').Body;
var earth = new Body(); earth.mass = 5.972;
var sun   = new Body(); sun.mass = 1989000;

install

With npm do:

npm install ngraph.quadtreebh3d

license

MIT

Metadata

RunKit is a free, in-browser JavaScript dev environment for prototyping Node.js code, with every npm package installed. Sign up to share your code.
Sign Up for Free