| src | ||
| .eslintrc | ||
| .gitignore | ||
| .npmignore | ||
| d3-force.sublime-project | ||
| index.js | ||
| LICENSE | ||
| package.json | ||
| README.md | ||
d3-force
…
Installing
If you use NPM, npm install d3-force. Otherwise, download the latest release. You can also load directly from d3js.org, either as a standalone library or as part of D3 4.0 alpha. AMD, CommonJS, and vanilla environments are supported. In vanilla, a d3_force global is exported:
<script src="https://d3js.org/d3-collection.v0.1.min.js"></script>
<script src="https://d3js.org/d3-dispatch.v0.4.min.js"></script>
<script src="https://d3js.org/d3-quadtree.v0.7.min.js"></script>
<script src="https://d3js.org/d3-timer.v0.4.min.js"></script>
<script src="https://d3js.org/d3-force.v0.3.min.js"></script>
<script>
var simulation = d3_force.forceSimulation(nodes);
</script>
API Reference
…
Simulation
…
# d3.forceSimulation([nodes])
Creates a new velocity Verlet simulator with the specified array of nodes and no forces. If nodes is not specified, it defaults to the empty array. The simulator starts automatically; if you wish to run the simulation manually, call simulation.stop, and then call simulation.tick as desired.
# simulation.restart()
…
# simulation.stop()
…
# simulation.tick()
Invokes each registered force, passing the current alpha; then updates the ⟨x,y⟩ position of each node according to the following formula: position += velocity × (1 - drag). Returns true if the current alpha is less than alphaMin, indicating that the simulation would normally stop after this tick, and false otherwise.
The current alpha is defined as exp(iteration × alphaDecay) where iteration is the number of times this method can be called since the simulation started. Thus, the exact number of iterations needed to terminate the simulation naturally is ⌈log(alphaMin) / -alphaDecay⌉. For example:
for (var i = 0, n = Math.ceil(Math.log(simulation.alphaMin()) / -simulation.alphaDecay()); i < n; ++i) {
simulation.tick();
}
Manual invocation is useful for computing static layouts, such as in a background web worker or on the server.
This method does not dispatch events; events are only dispatched by the internal timer when the simulation is started automatically upon creation or by calling simulation.restart.
# simulation.nodes([nodes])
…
index- the node’s zero-based index into nodesx- the node’s current x-positiony- the node’s current y-positionvx- the node’s current x-velocityvy- the node’s current y-velocity
# simulation.alphaMin([alpha])
…
# simulation.alphaDecay([decay])
…
# simulation.drag([drag])
…
# simulation.force(name[, force])
…
# simulation.on(typenames, [callback])
…
Forces
Simulations apply arbitrary forces. This module provides several built-in forces for your enjoyment:
You may also implement your own custom force. A force is simply a function that takes the simulation’s current alpha and modifies nodes’ positions or velocities. Forces may optionally implement force.initialize to receive the simulation’s array of nodes.
# force(alpha)
…
# force.initialize(nodes)
…
Centering
The centering force moves nodes so that their center of mass (assuming all nodes are equal-weight) is at the given position ⟨x,y⟩. (These parameters are only recomputed when the force is initialized, not on every application.)
# d3.forceCenter([x, y])
…
# center.x([x])
…
# center.y([y])
…
Circle Collision
The circle collision force prevents circular nodes with a given radius from overlapping. More formally, two nodes a and b are separated so that the distance between a and b is at least radius(a) + radius(b). To reduce jitter, this is by default a “soft” constraint with a configurable strength. (These parameters are only recomputed when the force is initialized, not on every application.)
# d3.forceCollide([radius])
…
# collide.radius([radius])
…
# collide.strength([strength])
…
# collide.iterations([iterations])
…
Circle Containment
The circle containment force constrains nodes to fit within a circle of a given radius and center ⟨x,y⟩. The radius and center can be specified on a per-node basis. (These parameters are only recomputed when the force is initialized, not on every application.)
# d3.forceContain([radius[, x, y]])
…
# contain.radius([radius])
…
# contain.x([x])
…
# contain.y([y])
…
Links
The link force pushes linked nodes closer together or farther apart according to the desired link distance, which may be specified on a per-node basis. (These parameters are only recomputed when the force is initialized, not on every application.)
# d3.forceLink([links])
…
# link.links([links])
…
index- the zero-based index into linkssource- the link’s source node; see simulation.nodestarget- the link’s target node; see simulation.nodes
The source and target properties may be initialized using link.id.
# link.id([id])
…
# link.distance([distance])
…
# link.strength([strength])
…
# link.iterations([iterations])
…
Many-Body
The many-body (or n-body) force applies mutally amongst all nodes. It can be used to simulate gravity (attraction) if the strength is positive, or eletrical charge (repulsion) if the strength is negative. This implementation uses quadtrees and the Barnes–Hut approximation to greatly improve performance; the accuracy can be customized using the theta parameter. The strength can be specified on a per-node basis. (This parameter is only recomputed when the force is initialized, not on every application.)
# d3.forceManyBody()
…
# manyBody.strength([strength])
…
# manyBody.theta([theta])
…
# manyBody.distanceMin([distance])
…
# manyBody.distanceMax([distance])
…
Positioning
The positioning force pushes nodes towards a desired position ⟨x,y⟩. The position and strength can be specified on a per-node basis. (These parameters are only recomputed when the force is initialized, not on every application.)
# d3.forcePosition([x, y])
…
# position.strength([strength])
…
# position.x([x])
…
# position.y([y])
…