UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

99 lines (98 loc) 3.04 kB
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 };