d3 / d3-force

Force-directed graph layout using velocity Verlet integration.
https://d3js.org/d3-force
ISC License
1.82k stars 377 forks source link

d3.forceLimit? #169

Open mbostock opened 4 years ago

mbostock commented 4 years ago

A way to limit the maximum instantaneous force (speed) of nodes.

function forceLimit(limit) {
  let nodes;

  function force() {
    for (const node of nodes) {
      const speed = Math.hypot(node.vx, node.vy);
      if (speed > limit) {
        node.vx = node.vx / speed * limit;
        node.vy = node.vy / speed * limit;
      }
    }
  }

  force.limit = function(_) {
    return arguments.length ? (limit = +_, force) : limit;
  };

  force.initialize = function (_) {
    nodes = _;
  };

  return force;
}

To use:

simulation.force("limit", forceLimit(8));

https://observablehq.com/d/1849551f209b16ed