@antv/layout
Version:
graph layout algorithm
136 lines (115 loc) • 3.82 kB
JavaScript
import constant from './constant.js';
import jiggle from './jiggle.js';
import binarytree from '../../d3-binarytree/src/binarytree.js';
import quadtree from '../../d3-quadtree/src/quadtree.js';
import octree from '../../d3-octree/src/octree.js';
function x$1(d) {
return d.x + d.vx;
}
function y$1(d) {
return d.y + d.vy;
}
function z$1(d) {
return d.z + d.vz;
}
function forceCollide$1(radius) {
var nodes,
nDim,
radii,
random,
strength = 1,
iterations = 1;
if (typeof radius !== "function") radius = constant(radius == null ? 1 : +radius);
function force() {
var i, n = nodes.length,
tree,
node,
xi,
yi,
zi,
ri,
ri2;
for (var k = 0; k < iterations; ++k) {
tree =
(nDim === 1 ? binarytree(nodes, x$1)
:(nDim === 2 ? quadtree(nodes, x$1, y$1)
:(nDim === 3 ? octree(nodes, x$1, y$1, z$1)
:null
))).visitAfter(prepare);
for (i = 0; i < n; ++i) {
node = nodes[i];
ri = radii[node.index], ri2 = ri * ri;
xi = node.x + node.vx;
if (nDim > 1) { yi = node.y + node.vy; }
if (nDim > 2) { zi = node.z + node.vz; }
tree.visit(apply);
}
}
function apply(treeNode, arg1, arg2, arg3, arg4, arg5, arg6) {
var args = [arg1, arg2, arg3, arg4, arg5, arg6];
var x0 = args[0],
y0 = args[1],
z0 = args[2],
x1 = args[nDim],
y1 = args[nDim+1],
z1 = args[nDim+2];
var data = treeNode.data, rj = treeNode.r, r = ri + rj;
if (data) {
if (data.index > node.index) {
var x = xi - data.x - data.vx,
y = (nDim > 1 ? yi - data.y - data.vy : 0),
z = (nDim > 2 ? zi - data.z - data.vz : 0),
l = x * x + y * y + z * z;
if (l < r * r) {
if (x === 0) x = jiggle(random), l += x * x;
if (nDim > 1 && y === 0) y = jiggle(random), l += y * y;
if (nDim > 2 && z === 0) z = jiggle(random), l += z * z;
l = (r - (l = Math.sqrt(l))) / l * strength;
node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
if (nDim > 1) { node.vy += (y *= l) * r; }
if (nDim > 2) { node.vz += (z *= l) * r; }
data.vx -= x * (r = 1 - r);
if (nDim > 1) { data.vy -= y * r; }
if (nDim > 2) { data.vz -= z * r; }
}
}
return;
}
return x0 > xi + r || x1 < xi - r
|| (nDim > 1 && (y0 > yi + r || y1 < yi - r))
|| (nDim > 2 && (z0 > zi + r || z1 < zi - r));
}
}
function prepare(treeNode) {
if (treeNode.data) return treeNode.r = radii[treeNode.data.index];
for (var i = treeNode.r = 0; i < Math.pow(2, nDim); ++i) {
if (treeNode[i] && treeNode[i].r > treeNode.r) {
treeNode.r = treeNode[i].r;
}
}
}
function initialize() {
if (!nodes) return;
var i, n = nodes.length, node;
radii = new Array(n);
for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);
}
force.initialize = function(_nodes, ...args) {
nodes = _nodes;
random = args.find(arg => typeof arg === 'function') || Math.random;
nDim = args.find(arg => [1, 2, 3].includes(arg)) || 2;
initialize();
};
force.iterations = function(_) {
return arguments.length ? (iterations = +_, force) : iterations;
};
force.strength = function(_) {
return arguments.length ? (strength = +_, force) : strength;
};
force.radius = function(_) {
return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius;
};
return force;
}
export { forceCollide$1 as default };
//# sourceMappingURL=collide.js.map