d3/d3-force

d3.forceLimit?

mbostock opened this issue · 0 comments

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