cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
99 lines (98 loc) • 3.04 kB
JavaScript
import { create, clone, sub, len, normalize, set, copy, scaleAndAdd as scaleAndAdd$1 } from "../../../../zrender/lib/core/vector.mjs";
var scaleAndAdd = scaleAndAdd$1;
function forceLayout(inNodes, inEdges, opts) {
var nodes = inNodes;
var edges = inEdges;
var rect = opts.rect;
var width = rect.width;
var height = rect.height;
var center = [rect.x + width / 2, rect.y + height / 2];
var gravity = opts.gravity == null ? 0.1 : opts.gravity;
for (var i = 0; i < nodes.length; i++) {
var n = nodes[i];
if (!n.p) {
n.p = create(width * (Math.random() - 0.5) + center[0], height * (Math.random() - 0.5) + center[1]);
}
n.pp = clone(n.p);
n.edges = null;
}
var initialFriction = opts.friction == null ? 0.6 : opts.friction;
var friction = initialFriction;
var beforeStepCallback;
var afterStepCallback;
return {
warmUp: function() {
friction = initialFriction * 0.8;
},
setFixed: function(idx) {
nodes[idx].fixed = true;
},
setUnfixed: function(idx) {
nodes[idx].fixed = false;
},
beforeStep: function(cb) {
beforeStepCallback = cb;
},
afterStep: function(cb) {
afterStepCallback = cb;
},
step: function(cb) {
beforeStepCallback && beforeStepCallback(nodes, edges);
var v12 = [];
var nLen = nodes.length;
for (var i2 = 0; i2 < edges.length; i2++) {
var e = edges[i2];
if (e.ignoreForceLayout) {
continue;
}
var n1 = e.n1;
var n2 = e.n2;
sub(v12, n2.p, n1.p);
var d = len(v12) - e.d;
var w = n2.w / (n1.w + n2.w);
if (isNaN(w)) {
w = 0;
}
normalize(v12, v12);
!n1.fixed && scaleAndAdd(n1.p, n1.p, v12, w * d * friction);
!n2.fixed && scaleAndAdd(n2.p, n2.p, v12, -(1 - w) * d * friction);
}
for (var i2 = 0; i2 < nLen; i2++) {
var n3 = nodes[i2];
if (!n3.fixed) {
sub(v12, center, n3.p);
scaleAndAdd(n3.p, n3.p, v12, gravity * friction);
}
}
for (var i2 = 0; i2 < nLen; i2++) {
var n1 = nodes[i2];
for (var j = i2 + 1; j < nLen; j++) {
var n2 = nodes[j];
sub(v12, n2.p, n1.p);
var d = len(v12);
if (d === 0) {
set(v12, Math.random() - 0.5, Math.random() - 0.5);
d = 1;
}
var repFact = (n1.rep + n2.rep) / d / d;
!n1.fixed && scaleAndAdd(n1.pp, n1.pp, v12, repFact);
!n2.fixed && scaleAndAdd(n2.pp, n2.pp, v12, -repFact);
}
}
var v = [];
for (var i2 = 0; i2 < nLen; i2++) {
var n3 = nodes[i2];
if (!n3.fixed) {
sub(v, n3.p, n3.pp);
scaleAndAdd(n3.p, n3.p, v, friction);
copy(n3.pp, n3.p);
}
}
friction = friction * 0.992;
var finished = friction < 0.01;
afterStepCallback && afterStepCallback(nodes, edges, finished);
cb && cb(finished);
}
};
}
export { forceLayout };