You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1.0 KiB
41 lines
1.0 KiB
import constant from "./constant"; |
|
|
|
export default function(y) { |
|
var strength = constant(0.1), |
|
nodes, |
|
strengths, |
|
yz; |
|
|
|
if (typeof y !== "function") y = constant(y == null ? 0 : +y); |
|
|
|
function force(alpha) { |
|
for (var i = 0, n = nodes.length, node; i < n; ++i) { |
|
node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha; |
|
} |
|
} |
|
|
|
function initialize() { |
|
if (!nodes) return; |
|
var i, n = nodes.length; |
|
strengths = new Array(n); |
|
yz = new Array(n); |
|
for (i = 0; i < n; ++i) { |
|
strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); |
|
} |
|
} |
|
|
|
force.initialize = function(_) { |
|
nodes = _; |
|
initialize(); |
|
}; |
|
|
|
force.strength = function(_) { |
|
return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; |
|
}; |
|
|
|
force.y = function(_) { |
|
return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), initialize(), force) : y; |
|
}; |
|
|
|
return force; |
|
}
|
|
|