mirror of
https://kevinblog.sytes.net/Code/Jibo-Revival-Group/RoboCommander.git
synced 2026-06-18 18:36:09 +00:00
Initial commit
This commit is contained in:
27
node_modules/d3-force/LICENSE
generated
vendored
Normal file
27
node_modules/d3-force/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
Copyright 2010-2016 Mike Bostock
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the author nor the names of contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
660
node_modules/d3-force/build/d3-force.js
generated
vendored
Normal file
660
node_modules/d3-force/build/d3-force.js
generated
vendored
Normal file
@@ -0,0 +1,660 @@
|
||||
// https://d3js.org/d3-force/ Version 1.1.0. Copyright 2017 Mike Bostock.
|
||||
(function (global, factory) {
|
||||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-quadtree'), require('d3-collection'), require('d3-dispatch'), require('d3-timer')) :
|
||||
typeof define === 'function' && define.amd ? define(['exports', 'd3-quadtree', 'd3-collection', 'd3-dispatch', 'd3-timer'], factory) :
|
||||
(factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3));
|
||||
}(this, (function (exports,d3Quadtree,d3Collection,d3Dispatch,d3Timer) { 'use strict';
|
||||
|
||||
var center = function(x, y) {
|
||||
var nodes;
|
||||
|
||||
if (x == null) x = 0;
|
||||
if (y == null) y = 0;
|
||||
|
||||
function force() {
|
||||
var i,
|
||||
n = nodes.length,
|
||||
node,
|
||||
sx = 0,
|
||||
sy = 0;
|
||||
|
||||
for (i = 0; i < n; ++i) {
|
||||
node = nodes[i], sx += node.x, sy += node.y;
|
||||
}
|
||||
|
||||
for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
|
||||
node = nodes[i], node.x -= sx, node.y -= sy;
|
||||
}
|
||||
}
|
||||
|
||||
force.initialize = function(_) {
|
||||
nodes = _;
|
||||
};
|
||||
|
||||
force.x = function(_) {
|
||||
return arguments.length ? (x = +_, force) : x;
|
||||
};
|
||||
|
||||
force.y = function(_) {
|
||||
return arguments.length ? (y = +_, force) : y;
|
||||
};
|
||||
|
||||
return force;
|
||||
};
|
||||
|
||||
var constant = function(x) {
|
||||
return function() {
|
||||
return x;
|
||||
};
|
||||
};
|
||||
|
||||
var jiggle = function() {
|
||||
return (Math.random() - 0.5) * 1e-6;
|
||||
};
|
||||
|
||||
function x(d) {
|
||||
return d.x + d.vx;
|
||||
}
|
||||
|
||||
function y(d) {
|
||||
return d.y + d.vy;
|
||||
}
|
||||
|
||||
var collide = function(radius) {
|
||||
var nodes,
|
||||
radii,
|
||||
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,
|
||||
ri,
|
||||
ri2;
|
||||
|
||||
for (var k = 0; k < iterations; ++k) {
|
||||
tree = d3Quadtree.quadtree(nodes, x, y).visitAfter(prepare);
|
||||
for (i = 0; i < n; ++i) {
|
||||
node = nodes[i];
|
||||
ri = radii[node.index], ri2 = ri * ri;
|
||||
xi = node.x + node.vx;
|
||||
yi = node.y + node.vy;
|
||||
tree.visit(apply);
|
||||
}
|
||||
}
|
||||
|
||||
function apply(quad, x0, y0, x1, y1) {
|
||||
var data = quad.data, rj = quad.r, r = ri + rj;
|
||||
if (data) {
|
||||
if (data.index > node.index) {
|
||||
var x = xi - data.x - data.vx,
|
||||
y = yi - data.y - data.vy,
|
||||
l = x * x + y * y;
|
||||
if (l < r * r) {
|
||||
if (x === 0) x = jiggle(), l += x * x;
|
||||
if (y === 0) y = jiggle(), l += y * y;
|
||||
l = (r - (l = Math.sqrt(l))) / l * strength;
|
||||
node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
|
||||
node.vy += (y *= l) * r;
|
||||
data.vx -= x * (r = 1 - r);
|
||||
data.vy -= y * r;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
|
||||
}
|
||||
}
|
||||
|
||||
function prepare(quad) {
|
||||
if (quad.data) return quad.r = radii[quad.data.index];
|
||||
for (var i = quad.r = 0; i < 4; ++i) {
|
||||
if (quad[i] && quad[i].r > quad.r) {
|
||||
quad.r = quad[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 = _;
|
||||
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;
|
||||
};
|
||||
|
||||
function index(d) {
|
||||
return d.index;
|
||||
}
|
||||
|
||||
function find(nodeById, nodeId) {
|
||||
var node = nodeById.get(nodeId);
|
||||
if (!node) throw new Error("missing: " + nodeId);
|
||||
return node;
|
||||
}
|
||||
|
||||
var link = function(links) {
|
||||
var id = index,
|
||||
strength = defaultStrength,
|
||||
strengths,
|
||||
distance = constant(30),
|
||||
distances,
|
||||
nodes,
|
||||
count,
|
||||
bias,
|
||||
iterations = 1;
|
||||
|
||||
if (links == null) links = [];
|
||||
|
||||
function defaultStrength(link) {
|
||||
return 1 / Math.min(count[link.source.index], count[link.target.index]);
|
||||
}
|
||||
|
||||
function force(alpha) {
|
||||
for (var k = 0, n = links.length; k < iterations; ++k) {
|
||||
for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
|
||||
link = links[i], source = link.source, target = link.target;
|
||||
x = target.x + target.vx - source.x - source.vx || jiggle();
|
||||
y = target.y + target.vy - source.y - source.vy || jiggle();
|
||||
l = Math.sqrt(x * x + y * y);
|
||||
l = (l - distances[i]) / l * alpha * strengths[i];
|
||||
x *= l, y *= l;
|
||||
target.vx -= x * (b = bias[i]);
|
||||
target.vy -= y * b;
|
||||
source.vx += x * (b = 1 - b);
|
||||
source.vy += y * b;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function initialize() {
|
||||
if (!nodes) return;
|
||||
|
||||
var i,
|
||||
n = nodes.length,
|
||||
m = links.length,
|
||||
nodeById = d3Collection.map(nodes, id),
|
||||
link;
|
||||
|
||||
for (i = 0, count = new Array(n); i < m; ++i) {
|
||||
link = links[i], link.index = i;
|
||||
if (typeof link.source !== "object") link.source = find(nodeById, link.source);
|
||||
if (typeof link.target !== "object") link.target = find(nodeById, link.target);
|
||||
count[link.source.index] = (count[link.source.index] || 0) + 1;
|
||||
count[link.target.index] = (count[link.target.index] || 0) + 1;
|
||||
}
|
||||
|
||||
for (i = 0, bias = new Array(m); i < m; ++i) {
|
||||
link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
|
||||
}
|
||||
|
||||
strengths = new Array(m), initializeStrength();
|
||||
distances = new Array(m), initializeDistance();
|
||||
}
|
||||
|
||||
function initializeStrength() {
|
||||
if (!nodes) return;
|
||||
|
||||
for (var i = 0, n = links.length; i < n; ++i) {
|
||||
strengths[i] = +strength(links[i], i, links);
|
||||
}
|
||||
}
|
||||
|
||||
function initializeDistance() {
|
||||
if (!nodes) return;
|
||||
|
||||
for (var i = 0, n = links.length; i < n; ++i) {
|
||||
distances[i] = +distance(links[i], i, links);
|
||||
}
|
||||
}
|
||||
|
||||
force.initialize = function(_) {
|
||||
nodes = _;
|
||||
initialize();
|
||||
};
|
||||
|
||||
force.links = function(_) {
|
||||
return arguments.length ? (links = _, initialize(), force) : links;
|
||||
};
|
||||
|
||||
force.id = function(_) {
|
||||
return arguments.length ? (id = _, force) : id;
|
||||
};
|
||||
|
||||
force.iterations = function(_) {
|
||||
return arguments.length ? (iterations = +_, force) : iterations;
|
||||
};
|
||||
|
||||
force.strength = function(_) {
|
||||
return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initializeStrength(), force) : strength;
|
||||
};
|
||||
|
||||
force.distance = function(_) {
|
||||
return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance;
|
||||
};
|
||||
|
||||
return force;
|
||||
};
|
||||
|
||||
function x$1(d) {
|
||||
return d.x;
|
||||
}
|
||||
|
||||
function y$1(d) {
|
||||
return d.y;
|
||||
}
|
||||
|
||||
var initialRadius = 10;
|
||||
var initialAngle = Math.PI * (3 - Math.sqrt(5));
|
||||
|
||||
var simulation = function(nodes) {
|
||||
var simulation,
|
||||
alpha = 1,
|
||||
alphaMin = 0.001,
|
||||
alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
|
||||
alphaTarget = 0,
|
||||
velocityDecay = 0.6,
|
||||
forces = d3Collection.map(),
|
||||
stepper = d3Timer.timer(step),
|
||||
event = d3Dispatch.dispatch("tick", "end");
|
||||
|
||||
if (nodes == null) nodes = [];
|
||||
|
||||
function step() {
|
||||
tick();
|
||||
event.call("tick", simulation);
|
||||
if (alpha < alphaMin) {
|
||||
stepper.stop();
|
||||
event.call("end", simulation);
|
||||
}
|
||||
}
|
||||
|
||||
function tick() {
|
||||
var i, n = nodes.length, node;
|
||||
|
||||
alpha += (alphaTarget - alpha) * alphaDecay;
|
||||
|
||||
forces.each(function(force) {
|
||||
force(alpha);
|
||||
});
|
||||
|
||||
for (i = 0; i < n; ++i) {
|
||||
node = nodes[i];
|
||||
if (node.fx == null) node.x += node.vx *= velocityDecay;
|
||||
else node.x = node.fx, node.vx = 0;
|
||||
if (node.fy == null) node.y += node.vy *= velocityDecay;
|
||||
else node.y = node.fy, node.vy = 0;
|
||||
}
|
||||
}
|
||||
|
||||
function initializeNodes() {
|
||||
for (var i = 0, n = nodes.length, node; i < n; ++i) {
|
||||
node = nodes[i], node.index = i;
|
||||
if (isNaN(node.x) || isNaN(node.y)) {
|
||||
var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
|
||||
node.x = radius * Math.cos(angle);
|
||||
node.y = radius * Math.sin(angle);
|
||||
}
|
||||
if (isNaN(node.vx) || isNaN(node.vy)) {
|
||||
node.vx = node.vy = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function initializeForce(force) {
|
||||
if (force.initialize) force.initialize(nodes);
|
||||
return force;
|
||||
}
|
||||
|
||||
initializeNodes();
|
||||
|
||||
return simulation = {
|
||||
tick: tick,
|
||||
|
||||
restart: function() {
|
||||
return stepper.restart(step), simulation;
|
||||
},
|
||||
|
||||
stop: function() {
|
||||
return stepper.stop(), simulation;
|
||||
},
|
||||
|
||||
nodes: function(_) {
|
||||
return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
|
||||
},
|
||||
|
||||
alpha: function(_) {
|
||||
return arguments.length ? (alpha = +_, simulation) : alpha;
|
||||
},
|
||||
|
||||
alphaMin: function(_) {
|
||||
return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
|
||||
},
|
||||
|
||||
alphaDecay: function(_) {
|
||||
return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
|
||||
},
|
||||
|
||||
alphaTarget: function(_) {
|
||||
return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
|
||||
},
|
||||
|
||||
velocityDecay: function(_) {
|
||||
return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
|
||||
},
|
||||
|
||||
force: function(name, _) {
|
||||
return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
|
||||
},
|
||||
|
||||
find: function(x, y, radius) {
|
||||
var i = 0,
|
||||
n = nodes.length,
|
||||
dx,
|
||||
dy,
|
||||
d2,
|
||||
node,
|
||||
closest;
|
||||
|
||||
if (radius == null) radius = Infinity;
|
||||
else radius *= radius;
|
||||
|
||||
for (i = 0; i < n; ++i) {
|
||||
node = nodes[i];
|
||||
dx = x - node.x;
|
||||
dy = y - node.y;
|
||||
d2 = dx * dx + dy * dy;
|
||||
if (d2 < radius) closest = node, radius = d2;
|
||||
}
|
||||
|
||||
return closest;
|
||||
},
|
||||
|
||||
on: function(name, _) {
|
||||
return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
var manyBody = function() {
|
||||
var nodes,
|
||||
node,
|
||||
alpha,
|
||||
strength = constant(-30),
|
||||
strengths,
|
||||
distanceMin2 = 1,
|
||||
distanceMax2 = Infinity,
|
||||
theta2 = 0.81;
|
||||
|
||||
function force(_) {
|
||||
var i, n = nodes.length, tree = d3Quadtree.quadtree(nodes, x$1, y$1).visitAfter(accumulate);
|
||||
for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
|
||||
}
|
||||
|
||||
function initialize() {
|
||||
if (!nodes) return;
|
||||
var i, n = nodes.length, node;
|
||||
strengths = new Array(n);
|
||||
for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
|
||||
}
|
||||
|
||||
function accumulate(quad) {
|
||||
var strength = 0, q, c, weight = 0, x, y, i;
|
||||
|
||||
// For internal nodes, accumulate forces from child quadrants.
|
||||
if (quad.length) {
|
||||
for (x = y = i = 0; i < 4; ++i) {
|
||||
if ((q = quad[i]) && (c = Math.abs(q.value))) {
|
||||
strength += q.value, weight += c, x += c * q.x, y += c * q.y;
|
||||
}
|
||||
}
|
||||
quad.x = x / weight;
|
||||
quad.y = y / weight;
|
||||
}
|
||||
|
||||
// For leaf nodes, accumulate forces from coincident quadrants.
|
||||
else {
|
||||
q = quad;
|
||||
q.x = q.data.x;
|
||||
q.y = q.data.y;
|
||||
do strength += strengths[q.data.index];
|
||||
while (q = q.next);
|
||||
}
|
||||
|
||||
quad.value = strength;
|
||||
}
|
||||
|
||||
function apply(quad, x1, _, x2) {
|
||||
if (!quad.value) return true;
|
||||
|
||||
var x = quad.x - node.x,
|
||||
y = quad.y - node.y,
|
||||
w = x2 - x1,
|
||||
l = x * x + y * y;
|
||||
|
||||
// Apply the Barnes-Hut approximation if possible.
|
||||
// Limit forces for very close nodes; randomize direction if coincident.
|
||||
if (w * w / theta2 < l) {
|
||||
if (l < distanceMax2) {
|
||||
if (x === 0) x = jiggle(), l += x * x;
|
||||
if (y === 0) y = jiggle(), l += y * y;
|
||||
if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
|
||||
node.vx += x * quad.value * alpha / l;
|
||||
node.vy += y * quad.value * alpha / l;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Otherwise, process points directly.
|
||||
else if (quad.length || l >= distanceMax2) return;
|
||||
|
||||
// Limit forces for very close nodes; randomize direction if coincident.
|
||||
if (quad.data !== node || quad.next) {
|
||||
if (x === 0) x = jiggle(), l += x * x;
|
||||
if (y === 0) y = jiggle(), l += y * y;
|
||||
if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
|
||||
}
|
||||
|
||||
do if (quad.data !== node) {
|
||||
w = strengths[quad.data.index] * alpha / l;
|
||||
node.vx += x * w;
|
||||
node.vy += y * w;
|
||||
} while (quad = quad.next);
|
||||
}
|
||||
|
||||
force.initialize = function(_) {
|
||||
nodes = _;
|
||||
initialize();
|
||||
};
|
||||
|
||||
force.strength = function(_) {
|
||||
return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength;
|
||||
};
|
||||
|
||||
force.distanceMin = function(_) {
|
||||
return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
|
||||
};
|
||||
|
||||
force.distanceMax = function(_) {
|
||||
return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
|
||||
};
|
||||
|
||||
force.theta = function(_) {
|
||||
return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
|
||||
};
|
||||
|
||||
return force;
|
||||
};
|
||||
|
||||
var radial = function(radius, x, y) {
|
||||
var nodes,
|
||||
strength = constant(0.1),
|
||||
strengths,
|
||||
radiuses;
|
||||
|
||||
if (typeof radius !== "function") radius = constant(+radius);
|
||||
if (x == null) x = 0;
|
||||
if (y == null) y = 0;
|
||||
|
||||
function force(alpha) {
|
||||
for (var i = 0, n = nodes.length; i < n; ++i) {
|
||||
var node = nodes[i],
|
||||
dx = node.x - x || 1e-6,
|
||||
dy = node.y - y || 1e-6,
|
||||
r = Math.sqrt(dx * dx + dy * dy),
|
||||
k = (radiuses[i] - r) * strengths[i] * alpha / r;
|
||||
node.vx += dx * k;
|
||||
node.vy += dy * k;
|
||||
}
|
||||
}
|
||||
|
||||
function initialize() {
|
||||
if (!nodes) return;
|
||||
var i, n = nodes.length;
|
||||
strengths = new Array(n);
|
||||
radiuses = new Array(n);
|
||||
for (i = 0; i < n; ++i) {
|
||||
radiuses[i] = +radius(nodes[i], i, nodes);
|
||||
strengths[i] = isNaN(radiuses[i]) ? 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.radius = function(_) {
|
||||
return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius;
|
||||
};
|
||||
|
||||
force.x = function(_) {
|
||||
return arguments.length ? (x = +_, force) : x;
|
||||
};
|
||||
|
||||
force.y = function(_) {
|
||||
return arguments.length ? (y = +_, force) : y;
|
||||
};
|
||||
|
||||
return force;
|
||||
};
|
||||
|
||||
var x$2 = function(x) {
|
||||
var strength = constant(0.1),
|
||||
nodes,
|
||||
strengths,
|
||||
xz;
|
||||
|
||||
if (typeof x !== "function") x = constant(x == null ? 0 : +x);
|
||||
|
||||
function force(alpha) {
|
||||
for (var i = 0, n = nodes.length, node; i < n; ++i) {
|
||||
node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
|
||||
}
|
||||
}
|
||||
|
||||
function initialize() {
|
||||
if (!nodes) return;
|
||||
var i, n = nodes.length;
|
||||
strengths = new Array(n);
|
||||
xz = new Array(n);
|
||||
for (i = 0; i < n; ++i) {
|
||||
strengths[i] = isNaN(xz[i] = +x(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.x = function(_) {
|
||||
return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), initialize(), force) : x;
|
||||
};
|
||||
|
||||
return force;
|
||||
};
|
||||
|
||||
var y$2 = 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;
|
||||
};
|
||||
|
||||
exports.forceCenter = center;
|
||||
exports.forceCollide = collide;
|
||||
exports.forceLink = link;
|
||||
exports.forceManyBody = manyBody;
|
||||
exports.forceRadial = radial;
|
||||
exports.forceSimulation = simulation;
|
||||
exports.forceX = x$2;
|
||||
exports.forceY = y$2;
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
})));
|
||||
2
node_modules/d3-force/build/d3-force.min.js
generated
vendored
Normal file
2
node_modules/d3-force/build/d3-force.min.js
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
node_modules/d3-force/img/beeswarm.png
generated
vendored
Normal file
BIN
node_modules/d3-force/img/beeswarm.png
generated
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
BIN
node_modules/d3-force/img/collide.png
generated
vendored
Normal file
BIN
node_modules/d3-force/img/collide.png
generated
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 126 KiB |
BIN
node_modules/d3-force/img/graph.png
generated
vendored
Normal file
BIN
node_modules/d3-force/img/graph.png
generated
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
BIN
node_modules/d3-force/img/lattice.png
generated
vendored
Normal file
BIN
node_modules/d3-force/img/lattice.png
generated
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 58 KiB |
BIN
node_modules/d3-force/img/phyllotaxis.png
generated
vendored
Normal file
BIN
node_modules/d3-force/img/phyllotaxis.png
generated
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
BIN
node_modules/d3-force/img/tree.png
generated
vendored
Normal file
BIN
node_modules/d3-force/img/tree.png
generated
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 54 KiB |
8
node_modules/d3-force/index.js
generated
vendored
Normal file
8
node_modules/d3-force/index.js
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
export {default as forceCenter} from "./src/center";
|
||||
export {default as forceCollide} from "./src/collide";
|
||||
export {default as forceLink} from "./src/link";
|
||||
export {default as forceManyBody} from "./src/manyBody";
|
||||
export {default as forceRadial} from "./src/radial";
|
||||
export {default as forceSimulation} from "./src/simulation";
|
||||
export {default as forceX} from "./src/x";
|
||||
export {default as forceY} from "./src/y";
|
||||
17
node_modules/d3-force/node_modules/d3-quadtree/.eslintrc.json
generated
vendored
Normal file
17
node_modules/d3-force/node_modules/d3-quadtree/.eslintrc.json
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"extends": "eslint:recommended",
|
||||
"parserOptions": {
|
||||
"sourceType": "module",
|
||||
"ecmaVersion": 8
|
||||
},
|
||||
"env": {
|
||||
"es6": true,
|
||||
"node": true,
|
||||
"browser": true
|
||||
},
|
||||
"rules": {
|
||||
"no-cond-assign": 0,
|
||||
"no-constant-condition": 0,
|
||||
"no-sparse-arrays": 0
|
||||
}
|
||||
}
|
||||
27
node_modules/d3-force/node_modules/d3-quadtree/LICENSE
generated
vendored
Normal file
27
node_modules/d3-force/node_modules/d3-quadtree/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
Copyright 2010-2016 Mike Bostock
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the author nor the names of contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
435
node_modules/d3-force/node_modules/d3-quadtree/dist/d3-quadtree.js
generated
vendored
Normal file
435
node_modules/d3-force/node_modules/d3-quadtree/dist/d3-quadtree.js
generated
vendored
Normal file
@@ -0,0 +1,435 @@
|
||||
// https://d3js.org/d3-quadtree/ v1.0.5 Copyright 2018 Mike Bostock
|
||||
(function (global, factory) {
|
||||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
||||
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
||||
(factory((global.d3 = global.d3 || {})));
|
||||
}(this, (function (exports) { 'use strict';
|
||||
|
||||
function tree_add(d) {
|
||||
var x = +this._x.call(null, d),
|
||||
y = +this._y.call(null, d);
|
||||
return add(this.cover(x, y), x, y, d);
|
||||
}
|
||||
|
||||
function add(tree, x, y, d) {
|
||||
if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
|
||||
|
||||
var parent,
|
||||
node = tree._root,
|
||||
leaf = {data: d},
|
||||
x0 = tree._x0,
|
||||
y0 = tree._y0,
|
||||
x1 = tree._x1,
|
||||
y1 = tree._y1,
|
||||
xm,
|
||||
ym,
|
||||
xp,
|
||||
yp,
|
||||
right,
|
||||
bottom,
|
||||
i,
|
||||
j;
|
||||
|
||||
// If the tree is empty, initialize the root as a leaf.
|
||||
if (!node) return tree._root = leaf, tree;
|
||||
|
||||
// Find the existing leaf for the new point, or add it.
|
||||
while (node.length) {
|
||||
if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
|
||||
if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
|
||||
if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
|
||||
}
|
||||
|
||||
// Is the new point is exactly coincident with the existing point?
|
||||
xp = +tree._x.call(null, node.data);
|
||||
yp = +tree._y.call(null, node.data);
|
||||
if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
|
||||
|
||||
// Otherwise, split the leaf node until the old and new point are separated.
|
||||
do {
|
||||
parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
|
||||
if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
|
||||
if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
|
||||
} while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
|
||||
return parent[j] = node, parent[i] = leaf, tree;
|
||||
}
|
||||
|
||||
function addAll(data) {
|
||||
var d, i, n = data.length,
|
||||
x,
|
||||
y,
|
||||
xz = new Array(n),
|
||||
yz = new Array(n),
|
||||
x0 = Infinity,
|
||||
y0 = Infinity,
|
||||
x1 = -Infinity,
|
||||
y1 = -Infinity;
|
||||
|
||||
// Compute the points and their extent.
|
||||
for (i = 0; i < n; ++i) {
|
||||
if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
|
||||
xz[i] = x;
|
||||
yz[i] = y;
|
||||
if (x < x0) x0 = x;
|
||||
if (x > x1) x1 = x;
|
||||
if (y < y0) y0 = y;
|
||||
if (y > y1) y1 = y;
|
||||
}
|
||||
|
||||
// If there were no (valid) points, inherit the existing extent.
|
||||
if (x1 < x0) x0 = this._x0, x1 = this._x1;
|
||||
if (y1 < y0) y0 = this._y0, y1 = this._y1;
|
||||
|
||||
// Expand the tree to cover the new points.
|
||||
this.cover(x0, y0).cover(x1, y1);
|
||||
|
||||
// Add the new points.
|
||||
for (i = 0; i < n; ++i) {
|
||||
add(this, xz[i], yz[i], data[i]);
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
function tree_cover(x, y) {
|
||||
if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
|
||||
|
||||
var x0 = this._x0,
|
||||
y0 = this._y0,
|
||||
x1 = this._x1,
|
||||
y1 = this._y1;
|
||||
|
||||
// If the quadtree has no extent, initialize them.
|
||||
// Integer extent are necessary so that if we later double the extent,
|
||||
// the existing quadrant boundaries don’t change due to floating point error!
|
||||
if (isNaN(x0)) {
|
||||
x1 = (x0 = Math.floor(x)) + 1;
|
||||
y1 = (y0 = Math.floor(y)) + 1;
|
||||
}
|
||||
|
||||
// Otherwise, double repeatedly to cover.
|
||||
else if (x0 > x || x > x1 || y0 > y || y > y1) {
|
||||
var z = x1 - x0,
|
||||
node = this._root,
|
||||
parent,
|
||||
i;
|
||||
|
||||
switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {
|
||||
case 0: {
|
||||
do parent = new Array(4), parent[i] = node, node = parent;
|
||||
while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1);
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
do parent = new Array(4), parent[i] = node, node = parent;
|
||||
while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1);
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
do parent = new Array(4), parent[i] = node, node = parent;
|
||||
while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y);
|
||||
break;
|
||||
}
|
||||
case 3: {
|
||||
do parent = new Array(4), parent[i] = node, node = parent;
|
||||
while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (this._root && this._root.length) this._root = node;
|
||||
}
|
||||
|
||||
// If the quadtree covers the point already, just return.
|
||||
else return this;
|
||||
|
||||
this._x0 = x0;
|
||||
this._y0 = y0;
|
||||
this._x1 = x1;
|
||||
this._y1 = y1;
|
||||
return this;
|
||||
}
|
||||
|
||||
function tree_data() {
|
||||
var data = [];
|
||||
this.visit(function(node) {
|
||||
if (!node.length) do data.push(node.data); while (node = node.next)
|
||||
});
|
||||
return data;
|
||||
}
|
||||
|
||||
function tree_extent(_) {
|
||||
return arguments.length
|
||||
? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
|
||||
: isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
|
||||
}
|
||||
|
||||
function Quad(node, x0, y0, x1, y1) {
|
||||
this.node = node;
|
||||
this.x0 = x0;
|
||||
this.y0 = y0;
|
||||
this.x1 = x1;
|
||||
this.y1 = y1;
|
||||
}
|
||||
|
||||
function tree_find(x, y, radius) {
|
||||
var data,
|
||||
x0 = this._x0,
|
||||
y0 = this._y0,
|
||||
x1,
|
||||
y1,
|
||||
x2,
|
||||
y2,
|
||||
x3 = this._x1,
|
||||
y3 = this._y1,
|
||||
quads = [],
|
||||
node = this._root,
|
||||
q,
|
||||
i;
|
||||
|
||||
if (node) quads.push(new Quad(node, x0, y0, x3, y3));
|
||||
if (radius == null) radius = Infinity;
|
||||
else {
|
||||
x0 = x - radius, y0 = y - radius;
|
||||
x3 = x + radius, y3 = y + radius;
|
||||
radius *= radius;
|
||||
}
|
||||
|
||||
while (q = quads.pop()) {
|
||||
|
||||
// Stop searching if this quadrant can’t contain a closer node.
|
||||
if (!(node = q.node)
|
||||
|| (x1 = q.x0) > x3
|
||||
|| (y1 = q.y0) > y3
|
||||
|| (x2 = q.x1) < x0
|
||||
|| (y2 = q.y1) < y0) continue;
|
||||
|
||||
// Bisect the current quadrant.
|
||||
if (node.length) {
|
||||
var xm = (x1 + x2) / 2,
|
||||
ym = (y1 + y2) / 2;
|
||||
|
||||
quads.push(
|
||||
new Quad(node[3], xm, ym, x2, y2),
|
||||
new Quad(node[2], x1, ym, xm, y2),
|
||||
new Quad(node[1], xm, y1, x2, ym),
|
||||
new Quad(node[0], x1, y1, xm, ym)
|
||||
);
|
||||
|
||||
// Visit the closest quadrant first.
|
||||
if (i = (y >= ym) << 1 | (x >= xm)) {
|
||||
q = quads[quads.length - 1];
|
||||
quads[quads.length - 1] = quads[quads.length - 1 - i];
|
||||
quads[quads.length - 1 - i] = q;
|
||||
}
|
||||
}
|
||||
|
||||
// Visit this point. (Visiting coincident points isn’t necessary!)
|
||||
else {
|
||||
var dx = x - +this._x.call(null, node.data),
|
||||
dy = y - +this._y.call(null, node.data),
|
||||
d2 = dx * dx + dy * dy;
|
||||
if (d2 < radius) {
|
||||
var d = Math.sqrt(radius = d2);
|
||||
x0 = x - d, y0 = y - d;
|
||||
x3 = x + d, y3 = y + d;
|
||||
data = node.data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
function tree_remove(d) {
|
||||
if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
|
||||
|
||||
var parent,
|
||||
node = this._root,
|
||||
retainer,
|
||||
previous,
|
||||
next,
|
||||
x0 = this._x0,
|
||||
y0 = this._y0,
|
||||
x1 = this._x1,
|
||||
y1 = this._y1,
|
||||
x,
|
||||
y,
|
||||
xm,
|
||||
ym,
|
||||
right,
|
||||
bottom,
|
||||
i,
|
||||
j;
|
||||
|
||||
// If the tree is empty, initialize the root as a leaf.
|
||||
if (!node) return this;
|
||||
|
||||
// Find the leaf node for the point.
|
||||
// While descending, also retain the deepest parent with a non-removed sibling.
|
||||
if (node.length) while (true) {
|
||||
if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
|
||||
if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
|
||||
if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
|
||||
if (!node.length) break;
|
||||
if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
|
||||
}
|
||||
|
||||
// Find the point to remove.
|
||||
while (node.data !== d) if (!(previous = node, node = node.next)) return this;
|
||||
if (next = node.next) delete node.next;
|
||||
|
||||
// If there are multiple coincident points, remove just the point.
|
||||
if (previous) return (next ? previous.next = next : delete previous.next), this;
|
||||
|
||||
// If this is the root point, remove it.
|
||||
if (!parent) return this._root = next, this;
|
||||
|
||||
// Remove this leaf.
|
||||
next ? parent[i] = next : delete parent[i];
|
||||
|
||||
// If the parent now contains exactly one leaf, collapse superfluous parents.
|
||||
if ((node = parent[0] || parent[1] || parent[2] || parent[3])
|
||||
&& node === (parent[3] || parent[2] || parent[1] || parent[0])
|
||||
&& !node.length) {
|
||||
if (retainer) retainer[j] = node;
|
||||
else this._root = node;
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
function removeAll(data) {
|
||||
for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
|
||||
return this;
|
||||
}
|
||||
|
||||
function tree_root() {
|
||||
return this._root;
|
||||
}
|
||||
|
||||
function tree_size() {
|
||||
var size = 0;
|
||||
this.visit(function(node) {
|
||||
if (!node.length) do ++size; while (node = node.next)
|
||||
});
|
||||
return size;
|
||||
}
|
||||
|
||||
function tree_visit(callback) {
|
||||
var quads = [], q, node = this._root, child, x0, y0, x1, y1;
|
||||
if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
|
||||
while (q = quads.pop()) {
|
||||
if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
|
||||
var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
|
||||
if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
|
||||
if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
|
||||
if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
|
||||
if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
function tree_visitAfter(callback) {
|
||||
var quads = [], next = [], q;
|
||||
if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
|
||||
while (q = quads.pop()) {
|
||||
var node = q.node;
|
||||
if (node.length) {
|
||||
var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
|
||||
if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
|
||||
if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
|
||||
if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
|
||||
if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
|
||||
}
|
||||
next.push(q);
|
||||
}
|
||||
while (q = next.pop()) {
|
||||
callback(q.node, q.x0, q.y0, q.x1, q.y1);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
function defaultX(d) {
|
||||
return d[0];
|
||||
}
|
||||
|
||||
function tree_x(_) {
|
||||
return arguments.length ? (this._x = _, this) : this._x;
|
||||
}
|
||||
|
||||
function defaultY(d) {
|
||||
return d[1];
|
||||
}
|
||||
|
||||
function tree_y(_) {
|
||||
return arguments.length ? (this._y = _, this) : this._y;
|
||||
}
|
||||
|
||||
function quadtree(nodes, x, y) {
|
||||
var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);
|
||||
return nodes == null ? tree : tree.addAll(nodes);
|
||||
}
|
||||
|
||||
function Quadtree(x, y, x0, y0, x1, y1) {
|
||||
this._x = x;
|
||||
this._y = y;
|
||||
this._x0 = x0;
|
||||
this._y0 = y0;
|
||||
this._x1 = x1;
|
||||
this._y1 = y1;
|
||||
this._root = undefined;
|
||||
}
|
||||
|
||||
function leaf_copy(leaf) {
|
||||
var copy = {data: leaf.data}, next = copy;
|
||||
while (leaf = leaf.next) next = next.next = {data: leaf.data};
|
||||
return copy;
|
||||
}
|
||||
|
||||
var treeProto = quadtree.prototype = Quadtree.prototype;
|
||||
|
||||
treeProto.copy = function() {
|
||||
var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
|
||||
node = this._root,
|
||||
nodes,
|
||||
child;
|
||||
|
||||
if (!node) return copy;
|
||||
|
||||
if (!node.length) return copy._root = leaf_copy(node), copy;
|
||||
|
||||
nodes = [{source: node, target: copy._root = new Array(4)}];
|
||||
while (node = nodes.pop()) {
|
||||
for (var i = 0; i < 4; ++i) {
|
||||
if (child = node.source[i]) {
|
||||
if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
|
||||
else node.target[i] = leaf_copy(child);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return copy;
|
||||
};
|
||||
|
||||
treeProto.add = tree_add;
|
||||
treeProto.addAll = addAll;
|
||||
treeProto.cover = tree_cover;
|
||||
treeProto.data = tree_data;
|
||||
treeProto.extent = tree_extent;
|
||||
treeProto.find = tree_find;
|
||||
treeProto.remove = tree_remove;
|
||||
treeProto.removeAll = removeAll;
|
||||
treeProto.root = tree_root;
|
||||
treeProto.size = tree_size;
|
||||
treeProto.visit = tree_visit;
|
||||
treeProto.visitAfter = tree_visitAfter;
|
||||
treeProto.x = tree_x;
|
||||
treeProto.y = tree_y;
|
||||
|
||||
exports.quadtree = quadtree;
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true });
|
||||
|
||||
})));
|
||||
2
node_modules/d3-force/node_modules/d3-quadtree/dist/d3-quadtree.min.js
generated
vendored
Normal file
2
node_modules/d3-force/node_modules/d3-quadtree/dist/d3-quadtree.min.js
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
26
node_modules/d3-force/node_modules/d3-quadtree/package.json
generated
vendored
Normal file
26
node_modules/d3-force/node_modules/d3-quadtree/package.json
generated
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"name": "d3-quadtree",
|
||||
"version": "1.0.5",
|
||||
"description": "Two-dimensional recursive spatial subdivision.",
|
||||
"homepage": "https://d3js.org/d3-quadtree/",
|
||||
"license": "BSD-3-Clause",
|
||||
"author": {
|
||||
"name": "Mike Bostock",
|
||||
"url": "http://bost.ocks.org/mike"
|
||||
},
|
||||
"main": "dist/d3-quadtree.js",
|
||||
"unpkg": "dist/d3-quadtree.min.js",
|
||||
"jsdelivr": "dist/d3-quadtree.min.js",
|
||||
"module": "src/index.js",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/d3/d3-quadtree.git"
|
||||
},
|
||||
"devDependencies": {
|
||||
"d3-array": "1",
|
||||
"eslint": "5",
|
||||
"rollup": "0.64",
|
||||
"rollup-plugin-terser": "1",
|
||||
"tape": "4"
|
||||
}
|
||||
}
|
||||
36
node_modules/d3-force/node_modules/d3-quadtree/rollup.config.js
generated
vendored
Normal file
36
node_modules/d3-force/node_modules/d3-quadtree/rollup.config.js
generated
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
import {terser} from "rollup-plugin-terser";
|
||||
import * as meta from "./package.json";
|
||||
|
||||
const config = {
|
||||
input: "src/index.js",
|
||||
external: Object.keys(meta.dependencies || {}).filter(key => /^d3-/.test(key)),
|
||||
output: {
|
||||
file: `dist/${meta.name}.js`,
|
||||
name: "d3",
|
||||
format: "umd",
|
||||
indent: false,
|
||||
extend: true,
|
||||
banner: `// ${meta.homepage} v${meta.version} Copyright ${(new Date).getFullYear()} ${meta.author.name}`,
|
||||
globals: Object.assign({}, ...Object.keys(meta.dependencies || {}).filter(key => /^d3-/.test(key)).map(key => ({[key]: "d3"})))
|
||||
},
|
||||
plugins: []
|
||||
};
|
||||
|
||||
export default [
|
||||
config,
|
||||
{
|
||||
...config,
|
||||
output: {
|
||||
...config.output,
|
||||
file: `dist/${meta.name}.min.js`
|
||||
},
|
||||
plugins: [
|
||||
...config.plugins,
|
||||
terser({
|
||||
output: {
|
||||
preamble: config.output.banner
|
||||
}
|
||||
})
|
||||
]
|
||||
}
|
||||
];
|
||||
85
node_modules/d3-force/node_modules/d3-quadtree/src/add.js
generated
vendored
Normal file
85
node_modules/d3-force/node_modules/d3-quadtree/src/add.js
generated
vendored
Normal file
@@ -0,0 +1,85 @@
|
||||
export default function(d) {
|
||||
var x = +this._x.call(null, d),
|
||||
y = +this._y.call(null, d);
|
||||
return add(this.cover(x, y), x, y, d);
|
||||
}
|
||||
|
||||
function add(tree, x, y, d) {
|
||||
if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
|
||||
|
||||
var parent,
|
||||
node = tree._root,
|
||||
leaf = {data: d},
|
||||
x0 = tree._x0,
|
||||
y0 = tree._y0,
|
||||
x1 = tree._x1,
|
||||
y1 = tree._y1,
|
||||
xm,
|
||||
ym,
|
||||
xp,
|
||||
yp,
|
||||
right,
|
||||
bottom,
|
||||
i,
|
||||
j;
|
||||
|
||||
// If the tree is empty, initialize the root as a leaf.
|
||||
if (!node) return tree._root = leaf, tree;
|
||||
|
||||
// Find the existing leaf for the new point, or add it.
|
||||
while (node.length) {
|
||||
if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
|
||||
if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
|
||||
if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
|
||||
}
|
||||
|
||||
// Is the new point is exactly coincident with the existing point?
|
||||
xp = +tree._x.call(null, node.data);
|
||||
yp = +tree._y.call(null, node.data);
|
||||
if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
|
||||
|
||||
// Otherwise, split the leaf node until the old and new point are separated.
|
||||
do {
|
||||
parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
|
||||
if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
|
||||
if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
|
||||
} while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
|
||||
return parent[j] = node, parent[i] = leaf, tree;
|
||||
}
|
||||
|
||||
export function addAll(data) {
|
||||
var d, i, n = data.length,
|
||||
x,
|
||||
y,
|
||||
xz = new Array(n),
|
||||
yz = new Array(n),
|
||||
x0 = Infinity,
|
||||
y0 = Infinity,
|
||||
x1 = -Infinity,
|
||||
y1 = -Infinity;
|
||||
|
||||
// Compute the points and their extent.
|
||||
for (i = 0; i < n; ++i) {
|
||||
if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
|
||||
xz[i] = x;
|
||||
yz[i] = y;
|
||||
if (x < x0) x0 = x;
|
||||
if (x > x1) x1 = x;
|
||||
if (y < y0) y0 = y;
|
||||
if (y > y1) y1 = y;
|
||||
}
|
||||
|
||||
// If there were no (valid) points, inherit the existing extent.
|
||||
if (x1 < x0) x0 = this._x0, x1 = this._x1;
|
||||
if (y1 < y0) y0 = this._y0, y1 = this._y1;
|
||||
|
||||
// Expand the tree to cover the new points.
|
||||
this.cover(x0, y0).cover(x1, y1);
|
||||
|
||||
// Add the new points.
|
||||
for (i = 0; i < n; ++i) {
|
||||
add(this, xz[i], yz[i], data[i]);
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
58
node_modules/d3-force/node_modules/d3-quadtree/src/cover.js
generated
vendored
Normal file
58
node_modules/d3-force/node_modules/d3-quadtree/src/cover.js
generated
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
export default function(x, y) {
|
||||
if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
|
||||
|
||||
var x0 = this._x0,
|
||||
y0 = this._y0,
|
||||
x1 = this._x1,
|
||||
y1 = this._y1;
|
||||
|
||||
// If the quadtree has no extent, initialize them.
|
||||
// Integer extent are necessary so that if we later double the extent,
|
||||
// the existing quadrant boundaries don’t change due to floating point error!
|
||||
if (isNaN(x0)) {
|
||||
x1 = (x0 = Math.floor(x)) + 1;
|
||||
y1 = (y0 = Math.floor(y)) + 1;
|
||||
}
|
||||
|
||||
// Otherwise, double repeatedly to cover.
|
||||
else if (x0 > x || x > x1 || y0 > y || y > y1) {
|
||||
var z = x1 - x0,
|
||||
node = this._root,
|
||||
parent,
|
||||
i;
|
||||
|
||||
switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {
|
||||
case 0: {
|
||||
do parent = new Array(4), parent[i] = node, node = parent;
|
||||
while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1);
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
do parent = new Array(4), parent[i] = node, node = parent;
|
||||
while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1);
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
do parent = new Array(4), parent[i] = node, node = parent;
|
||||
while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y);
|
||||
break;
|
||||
}
|
||||
case 3: {
|
||||
do parent = new Array(4), parent[i] = node, node = parent;
|
||||
while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (this._root && this._root.length) this._root = node;
|
||||
}
|
||||
|
||||
// If the quadtree covers the point already, just return.
|
||||
else return this;
|
||||
|
||||
this._x0 = x0;
|
||||
this._y0 = y0;
|
||||
this._x1 = x1;
|
||||
this._y1 = y1;
|
||||
return this;
|
||||
}
|
||||
7
node_modules/d3-force/node_modules/d3-quadtree/src/data.js
generated
vendored
Normal file
7
node_modules/d3-force/node_modules/d3-quadtree/src/data.js
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
export default function() {
|
||||
var data = [];
|
||||
this.visit(function(node) {
|
||||
if (!node.length) do data.push(node.data); while (node = node.next)
|
||||
});
|
||||
return data;
|
||||
}
|
||||
5
node_modules/d3-force/node_modules/d3-quadtree/src/extent.js
generated
vendored
Normal file
5
node_modules/d3-force/node_modules/d3-quadtree/src/extent.js
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
export default function(_) {
|
||||
return arguments.length
|
||||
? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
|
||||
: isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
|
||||
}
|
||||
70
node_modules/d3-force/node_modules/d3-quadtree/src/find.js
generated
vendored
Normal file
70
node_modules/d3-force/node_modules/d3-quadtree/src/find.js
generated
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
import Quad from "./quad";
|
||||
|
||||
export default function(x, y, radius) {
|
||||
var data,
|
||||
x0 = this._x0,
|
||||
y0 = this._y0,
|
||||
x1,
|
||||
y1,
|
||||
x2,
|
||||
y2,
|
||||
x3 = this._x1,
|
||||
y3 = this._y1,
|
||||
quads = [],
|
||||
node = this._root,
|
||||
q,
|
||||
i;
|
||||
|
||||
if (node) quads.push(new Quad(node, x0, y0, x3, y3));
|
||||
if (radius == null) radius = Infinity;
|
||||
else {
|
||||
x0 = x - radius, y0 = y - radius;
|
||||
x3 = x + radius, y3 = y + radius;
|
||||
radius *= radius;
|
||||
}
|
||||
|
||||
while (q = quads.pop()) {
|
||||
|
||||
// Stop searching if this quadrant can’t contain a closer node.
|
||||
if (!(node = q.node)
|
||||
|| (x1 = q.x0) > x3
|
||||
|| (y1 = q.y0) > y3
|
||||
|| (x2 = q.x1) < x0
|
||||
|| (y2 = q.y1) < y0) continue;
|
||||
|
||||
// Bisect the current quadrant.
|
||||
if (node.length) {
|
||||
var xm = (x1 + x2) / 2,
|
||||
ym = (y1 + y2) / 2;
|
||||
|
||||
quads.push(
|
||||
new Quad(node[3], xm, ym, x2, y2),
|
||||
new Quad(node[2], x1, ym, xm, y2),
|
||||
new Quad(node[1], xm, y1, x2, ym),
|
||||
new Quad(node[0], x1, y1, xm, ym)
|
||||
);
|
||||
|
||||
// Visit the closest quadrant first.
|
||||
if (i = (y >= ym) << 1 | (x >= xm)) {
|
||||
q = quads[quads.length - 1];
|
||||
quads[quads.length - 1] = quads[quads.length - 1 - i];
|
||||
quads[quads.length - 1 - i] = q;
|
||||
}
|
||||
}
|
||||
|
||||
// Visit this point. (Visiting coincident points isn’t necessary!)
|
||||
else {
|
||||
var dx = x - +this._x.call(null, node.data),
|
||||
dy = y - +this._y.call(null, node.data),
|
||||
d2 = dx * dx + dy * dy;
|
||||
if (d2 < radius) {
|
||||
var d = Math.sqrt(radius = d2);
|
||||
x0 = x - d, y0 = y - d;
|
||||
x3 = x + d, y3 = y + d;
|
||||
data = node.data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
1
node_modules/d3-force/node_modules/d3-quadtree/src/index.js
generated
vendored
Normal file
1
node_modules/d3-force/node_modules/d3-quadtree/src/index.js
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
export {default as quadtree} from "./quadtree";
|
||||
7
node_modules/d3-force/node_modules/d3-quadtree/src/quad.js
generated
vendored
Normal file
7
node_modules/d3-force/node_modules/d3-quadtree/src/quad.js
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
export default function(node, x0, y0, x1, y1) {
|
||||
this.node = node;
|
||||
this.x0 = x0;
|
||||
this.y0 = y0;
|
||||
this.x1 = x1;
|
||||
this.y1 = y1;
|
||||
}
|
||||
73
node_modules/d3-force/node_modules/d3-quadtree/src/quadtree.js
generated
vendored
Normal file
73
node_modules/d3-force/node_modules/d3-quadtree/src/quadtree.js
generated
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
import tree_add, {addAll as tree_addAll} from "./add";
|
||||
import tree_cover from "./cover";
|
||||
import tree_data from "./data";
|
||||
import tree_extent from "./extent";
|
||||
import tree_find from "./find";
|
||||
import tree_remove, {removeAll as tree_removeAll} from "./remove";
|
||||
import tree_root from "./root";
|
||||
import tree_size from "./size";
|
||||
import tree_visit from "./visit";
|
||||
import tree_visitAfter from "./visitAfter";
|
||||
import tree_x, {defaultX} from "./x";
|
||||
import tree_y, {defaultY} from "./y";
|
||||
|
||||
export default function quadtree(nodes, x, y) {
|
||||
var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);
|
||||
return nodes == null ? tree : tree.addAll(nodes);
|
||||
}
|
||||
|
||||
function Quadtree(x, y, x0, y0, x1, y1) {
|
||||
this._x = x;
|
||||
this._y = y;
|
||||
this._x0 = x0;
|
||||
this._y0 = y0;
|
||||
this._x1 = x1;
|
||||
this._y1 = y1;
|
||||
this._root = undefined;
|
||||
}
|
||||
|
||||
function leaf_copy(leaf) {
|
||||
var copy = {data: leaf.data}, next = copy;
|
||||
while (leaf = leaf.next) next = next.next = {data: leaf.data};
|
||||
return copy;
|
||||
}
|
||||
|
||||
var treeProto = quadtree.prototype = Quadtree.prototype;
|
||||
|
||||
treeProto.copy = function() {
|
||||
var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
|
||||
node = this._root,
|
||||
nodes,
|
||||
child;
|
||||
|
||||
if (!node) return copy;
|
||||
|
||||
if (!node.length) return copy._root = leaf_copy(node), copy;
|
||||
|
||||
nodes = [{source: node, target: copy._root = new Array(4)}];
|
||||
while (node = nodes.pop()) {
|
||||
for (var i = 0; i < 4; ++i) {
|
||||
if (child = node.source[i]) {
|
||||
if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
|
||||
else node.target[i] = leaf_copy(child);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return copy;
|
||||
};
|
||||
|
||||
treeProto.add = tree_add;
|
||||
treeProto.addAll = tree_addAll;
|
||||
treeProto.cover = tree_cover;
|
||||
treeProto.data = tree_data;
|
||||
treeProto.extent = tree_extent;
|
||||
treeProto.find = tree_find;
|
||||
treeProto.remove = tree_remove;
|
||||
treeProto.removeAll = tree_removeAll;
|
||||
treeProto.root = tree_root;
|
||||
treeProto.size = tree_size;
|
||||
treeProto.visit = tree_visit;
|
||||
treeProto.visitAfter = tree_visitAfter;
|
||||
treeProto.x = tree_x;
|
||||
treeProto.y = tree_y;
|
||||
62
node_modules/d3-force/node_modules/d3-quadtree/src/remove.js
generated
vendored
Normal file
62
node_modules/d3-force/node_modules/d3-quadtree/src/remove.js
generated
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
export default function(d) {
|
||||
if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
|
||||
|
||||
var parent,
|
||||
node = this._root,
|
||||
retainer,
|
||||
previous,
|
||||
next,
|
||||
x0 = this._x0,
|
||||
y0 = this._y0,
|
||||
x1 = this._x1,
|
||||
y1 = this._y1,
|
||||
x,
|
||||
y,
|
||||
xm,
|
||||
ym,
|
||||
right,
|
||||
bottom,
|
||||
i,
|
||||
j;
|
||||
|
||||
// If the tree is empty, initialize the root as a leaf.
|
||||
if (!node) return this;
|
||||
|
||||
// Find the leaf node for the point.
|
||||
// While descending, also retain the deepest parent with a non-removed sibling.
|
||||
if (node.length) while (true) {
|
||||
if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
|
||||
if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
|
||||
if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
|
||||
if (!node.length) break;
|
||||
if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
|
||||
}
|
||||
|
||||
// Find the point to remove.
|
||||
while (node.data !== d) if (!(previous = node, node = node.next)) return this;
|
||||
if (next = node.next) delete node.next;
|
||||
|
||||
// If there are multiple coincident points, remove just the point.
|
||||
if (previous) return (next ? previous.next = next : delete previous.next), this;
|
||||
|
||||
// If this is the root point, remove it.
|
||||
if (!parent) return this._root = next, this;
|
||||
|
||||
// Remove this leaf.
|
||||
next ? parent[i] = next : delete parent[i];
|
||||
|
||||
// If the parent now contains exactly one leaf, collapse superfluous parents.
|
||||
if ((node = parent[0] || parent[1] || parent[2] || parent[3])
|
||||
&& node === (parent[3] || parent[2] || parent[1] || parent[0])
|
||||
&& !node.length) {
|
||||
if (retainer) retainer[j] = node;
|
||||
else this._root = node;
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
export function removeAll(data) {
|
||||
for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
|
||||
return this;
|
||||
}
|
||||
3
node_modules/d3-force/node_modules/d3-quadtree/src/root.js
generated
vendored
Normal file
3
node_modules/d3-force/node_modules/d3-quadtree/src/root.js
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
export default function() {
|
||||
return this._root;
|
||||
}
|
||||
7
node_modules/d3-force/node_modules/d3-quadtree/src/size.js
generated
vendored
Normal file
7
node_modules/d3-force/node_modules/d3-quadtree/src/size.js
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
export default function() {
|
||||
var size = 0;
|
||||
this.visit(function(node) {
|
||||
if (!node.length) do ++size; while (node = node.next)
|
||||
});
|
||||
return size;
|
||||
}
|
||||
16
node_modules/d3-force/node_modules/d3-quadtree/src/visit.js
generated
vendored
Normal file
16
node_modules/d3-force/node_modules/d3-quadtree/src/visit.js
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
import Quad from "./quad";
|
||||
|
||||
export default function(callback) {
|
||||
var quads = [], q, node = this._root, child, x0, y0, x1, y1;
|
||||
if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
|
||||
while (q = quads.pop()) {
|
||||
if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
|
||||
var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
|
||||
if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
|
||||
if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
|
||||
if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
|
||||
if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
21
node_modules/d3-force/node_modules/d3-quadtree/src/visitAfter.js
generated
vendored
Normal file
21
node_modules/d3-force/node_modules/d3-quadtree/src/visitAfter.js
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
import Quad from "./quad";
|
||||
|
||||
export default function(callback) {
|
||||
var quads = [], next = [], q;
|
||||
if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
|
||||
while (q = quads.pop()) {
|
||||
var node = q.node;
|
||||
if (node.length) {
|
||||
var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
|
||||
if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
|
||||
if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
|
||||
if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
|
||||
if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
|
||||
}
|
||||
next.push(q);
|
||||
}
|
||||
while (q = next.pop()) {
|
||||
callback(q.node, q.x0, q.y0, q.x1, q.y1);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
7
node_modules/d3-force/node_modules/d3-quadtree/src/x.js
generated
vendored
Normal file
7
node_modules/d3-force/node_modules/d3-quadtree/src/x.js
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
export function defaultX(d) {
|
||||
return d[0];
|
||||
}
|
||||
|
||||
export default function(_) {
|
||||
return arguments.length ? (this._x = _, this) : this._x;
|
||||
}
|
||||
7
node_modules/d3-force/node_modules/d3-quadtree/src/y.js
generated
vendored
Normal file
7
node_modules/d3-force/node_modules/d3-quadtree/src/y.js
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
export function defaultY(d) {
|
||||
return d[1];
|
||||
}
|
||||
|
||||
export default function(_) {
|
||||
return arguments.length ? (this._y = _, this) : this._y;
|
||||
}
|
||||
31
node_modules/d3-force/package.json
generated
vendored
Normal file
31
node_modules/d3-force/package.json
generated
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"name": "d3-force",
|
||||
"version": "1.1.0",
|
||||
"description": "Force-directed graph layout using velocity Verlet integration.",
|
||||
"homepage": "https://d3js.org/d3-force/",
|
||||
"license": "BSD-3-Clause",
|
||||
"author": {
|
||||
"name": "Mike Bostock",
|
||||
"url": "http://bost.ocks.org/mike"
|
||||
},
|
||||
"main": "build/d3-force.js",
|
||||
"module": "index",
|
||||
"jsnext:main": "index",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/d3/d3-force.git"
|
||||
},
|
||||
"dependencies": {
|
||||
"d3-collection": "1",
|
||||
"d3-dispatch": "1",
|
||||
"d3-quadtree": "1",
|
||||
"d3-timer": "1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"eslint": "4",
|
||||
"package-preamble": "0.1",
|
||||
"rollup": "0.50",
|
||||
"tape": "4",
|
||||
"uglify-js": "3"
|
||||
}
|
||||
}
|
||||
14
node_modules/d3-force/rollup.config.js
generated
vendored
Normal file
14
node_modules/d3-force/rollup.config.js
generated
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
const definition = require("./package.json");
|
||||
const dependencies = Object.keys(definition.dependencies);
|
||||
|
||||
export default {
|
||||
input: "index",
|
||||
external: dependencies,
|
||||
output: {
|
||||
extend: true,
|
||||
file: `build/${definition.name}.js`,
|
||||
format: "umd",
|
||||
globals: dependencies.reduce((p, v) => (p[v] = "d3", p), {}),
|
||||
name: "d3"
|
||||
}
|
||||
};
|
||||
36
node_modules/d3-force/src/center.js
generated
vendored
Normal file
36
node_modules/d3-force/src/center.js
generated
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
export default function(x, y) {
|
||||
var nodes;
|
||||
|
||||
if (x == null) x = 0;
|
||||
if (y == null) y = 0;
|
||||
|
||||
function force() {
|
||||
var i,
|
||||
n = nodes.length,
|
||||
node,
|
||||
sx = 0,
|
||||
sy = 0;
|
||||
|
||||
for (i = 0; i < n; ++i) {
|
||||
node = nodes[i], sx += node.x, sy += node.y;
|
||||
}
|
||||
|
||||
for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
|
||||
node = nodes[i], node.x -= sx, node.y -= sy;
|
||||
}
|
||||
}
|
||||
|
||||
force.initialize = function(_) {
|
||||
nodes = _;
|
||||
};
|
||||
|
||||
force.x = function(_) {
|
||||
return arguments.length ? (x = +_, force) : x;
|
||||
};
|
||||
|
||||
force.y = function(_) {
|
||||
return arguments.length ? (y = +_, force) : y;
|
||||
};
|
||||
|
||||
return force;
|
||||
}
|
||||
98
node_modules/d3-force/src/collide.js
generated
vendored
Normal file
98
node_modules/d3-force/src/collide.js
generated
vendored
Normal file
@@ -0,0 +1,98 @@
|
||||
import constant from "./constant";
|
||||
import jiggle from "./jiggle";
|
||||
import {quadtree} from "d3-quadtree";
|
||||
|
||||
function x(d) {
|
||||
return d.x + d.vx;
|
||||
}
|
||||
|
||||
function y(d) {
|
||||
return d.y + d.vy;
|
||||
}
|
||||
|
||||
export default function(radius) {
|
||||
var nodes,
|
||||
radii,
|
||||
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,
|
||||
ri,
|
||||
ri2;
|
||||
|
||||
for (var k = 0; k < iterations; ++k) {
|
||||
tree = quadtree(nodes, x, y).visitAfter(prepare);
|
||||
for (i = 0; i < n; ++i) {
|
||||
node = nodes[i];
|
||||
ri = radii[node.index], ri2 = ri * ri;
|
||||
xi = node.x + node.vx;
|
||||
yi = node.y + node.vy;
|
||||
tree.visit(apply);
|
||||
}
|
||||
}
|
||||
|
||||
function apply(quad, x0, y0, x1, y1) {
|
||||
var data = quad.data, rj = quad.r, r = ri + rj;
|
||||
if (data) {
|
||||
if (data.index > node.index) {
|
||||
var x = xi - data.x - data.vx,
|
||||
y = yi - data.y - data.vy,
|
||||
l = x * x + y * y;
|
||||
if (l < r * r) {
|
||||
if (x === 0) x = jiggle(), l += x * x;
|
||||
if (y === 0) y = jiggle(), l += y * y;
|
||||
l = (r - (l = Math.sqrt(l))) / l * strength;
|
||||
node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
|
||||
node.vy += (y *= l) * r;
|
||||
data.vx -= x * (r = 1 - r);
|
||||
data.vy -= y * r;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
|
||||
}
|
||||
}
|
||||
|
||||
function prepare(quad) {
|
||||
if (quad.data) return quad.r = radii[quad.data.index];
|
||||
for (var i = quad.r = 0; i < 4; ++i) {
|
||||
if (quad[i] && quad[i].r > quad.r) {
|
||||
quad.r = quad[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 = _;
|
||||
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;
|
||||
}
|
||||
5
node_modules/d3-force/src/constant.js
generated
vendored
Normal file
5
node_modules/d3-force/src/constant.js
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
export default function(x) {
|
||||
return function() {
|
||||
return x;
|
||||
};
|
||||
}
|
||||
3
node_modules/d3-force/src/jiggle.js
generated
vendored
Normal file
3
node_modules/d3-force/src/jiggle.js
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
export default function() {
|
||||
return (Math.random() - 0.5) * 1e-6;
|
||||
}
|
||||
116
node_modules/d3-force/src/link.js
generated
vendored
Normal file
116
node_modules/d3-force/src/link.js
generated
vendored
Normal file
@@ -0,0 +1,116 @@
|
||||
import constant from "./constant";
|
||||
import jiggle from "./jiggle";
|
||||
import {map} from "d3-collection";
|
||||
|
||||
function index(d) {
|
||||
return d.index;
|
||||
}
|
||||
|
||||
function find(nodeById, nodeId) {
|
||||
var node = nodeById.get(nodeId);
|
||||
if (!node) throw new Error("missing: " + nodeId);
|
||||
return node;
|
||||
}
|
||||
|
||||
export default function(links) {
|
||||
var id = index,
|
||||
strength = defaultStrength,
|
||||
strengths,
|
||||
distance = constant(30),
|
||||
distances,
|
||||
nodes,
|
||||
count,
|
||||
bias,
|
||||
iterations = 1;
|
||||
|
||||
if (links == null) links = [];
|
||||
|
||||
function defaultStrength(link) {
|
||||
return 1 / Math.min(count[link.source.index], count[link.target.index]);
|
||||
}
|
||||
|
||||
function force(alpha) {
|
||||
for (var k = 0, n = links.length; k < iterations; ++k) {
|
||||
for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
|
||||
link = links[i], source = link.source, target = link.target;
|
||||
x = target.x + target.vx - source.x - source.vx || jiggle();
|
||||
y = target.y + target.vy - source.y - source.vy || jiggle();
|
||||
l = Math.sqrt(x * x + y * y);
|
||||
l = (l - distances[i]) / l * alpha * strengths[i];
|
||||
x *= l, y *= l;
|
||||
target.vx -= x * (b = bias[i]);
|
||||
target.vy -= y * b;
|
||||
source.vx += x * (b = 1 - b);
|
||||
source.vy += y * b;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function initialize() {
|
||||
if (!nodes) return;
|
||||
|
||||
var i,
|
||||
n = nodes.length,
|
||||
m = links.length,
|
||||
nodeById = map(nodes, id),
|
||||
link;
|
||||
|
||||
for (i = 0, count = new Array(n); i < m; ++i) {
|
||||
link = links[i], link.index = i;
|
||||
if (typeof link.source !== "object") link.source = find(nodeById, link.source);
|
||||
if (typeof link.target !== "object") link.target = find(nodeById, link.target);
|
||||
count[link.source.index] = (count[link.source.index] || 0) + 1;
|
||||
count[link.target.index] = (count[link.target.index] || 0) + 1;
|
||||
}
|
||||
|
||||
for (i = 0, bias = new Array(m); i < m; ++i) {
|
||||
link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
|
||||
}
|
||||
|
||||
strengths = new Array(m), initializeStrength();
|
||||
distances = new Array(m), initializeDistance();
|
||||
}
|
||||
|
||||
function initializeStrength() {
|
||||
if (!nodes) return;
|
||||
|
||||
for (var i = 0, n = links.length; i < n; ++i) {
|
||||
strengths[i] = +strength(links[i], i, links);
|
||||
}
|
||||
}
|
||||
|
||||
function initializeDistance() {
|
||||
if (!nodes) return;
|
||||
|
||||
for (var i = 0, n = links.length; i < n; ++i) {
|
||||
distances[i] = +distance(links[i], i, links);
|
||||
}
|
||||
}
|
||||
|
||||
force.initialize = function(_) {
|
||||
nodes = _;
|
||||
initialize();
|
||||
};
|
||||
|
||||
force.links = function(_) {
|
||||
return arguments.length ? (links = _, initialize(), force) : links;
|
||||
};
|
||||
|
||||
force.id = function(_) {
|
||||
return arguments.length ? (id = _, force) : id;
|
||||
};
|
||||
|
||||
force.iterations = function(_) {
|
||||
return arguments.length ? (iterations = +_, force) : iterations;
|
||||
};
|
||||
|
||||
force.strength = function(_) {
|
||||
return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initializeStrength(), force) : strength;
|
||||
};
|
||||
|
||||
force.distance = function(_) {
|
||||
return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance;
|
||||
};
|
||||
|
||||
return force;
|
||||
}
|
||||
114
node_modules/d3-force/src/manyBody.js
generated
vendored
Normal file
114
node_modules/d3-force/src/manyBody.js
generated
vendored
Normal file
@@ -0,0 +1,114 @@
|
||||
import constant from "./constant";
|
||||
import jiggle from "./jiggle";
|
||||
import {quadtree} from "d3-quadtree";
|
||||
import {x, y} from "./simulation";
|
||||
|
||||
export default function() {
|
||||
var nodes,
|
||||
node,
|
||||
alpha,
|
||||
strength = constant(-30),
|
||||
strengths,
|
||||
distanceMin2 = 1,
|
||||
distanceMax2 = Infinity,
|
||||
theta2 = 0.81;
|
||||
|
||||
function force(_) {
|
||||
var i, n = nodes.length, tree = quadtree(nodes, x, y).visitAfter(accumulate);
|
||||
for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
|
||||
}
|
||||
|
||||
function initialize() {
|
||||
if (!nodes) return;
|
||||
var i, n = nodes.length, node;
|
||||
strengths = new Array(n);
|
||||
for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
|
||||
}
|
||||
|
||||
function accumulate(quad) {
|
||||
var strength = 0, q, c, weight = 0, x, y, i;
|
||||
|
||||
// For internal nodes, accumulate forces from child quadrants.
|
||||
if (quad.length) {
|
||||
for (x = y = i = 0; i < 4; ++i) {
|
||||
if ((q = quad[i]) && (c = Math.abs(q.value))) {
|
||||
strength += q.value, weight += c, x += c * q.x, y += c * q.y;
|
||||
}
|
||||
}
|
||||
quad.x = x / weight;
|
||||
quad.y = y / weight;
|
||||
}
|
||||
|
||||
// For leaf nodes, accumulate forces from coincident quadrants.
|
||||
else {
|
||||
q = quad;
|
||||
q.x = q.data.x;
|
||||
q.y = q.data.y;
|
||||
do strength += strengths[q.data.index];
|
||||
while (q = q.next);
|
||||
}
|
||||
|
||||
quad.value = strength;
|
||||
}
|
||||
|
||||
function apply(quad, x1, _, x2) {
|
||||
if (!quad.value) return true;
|
||||
|
||||
var x = quad.x - node.x,
|
||||
y = quad.y - node.y,
|
||||
w = x2 - x1,
|
||||
l = x * x + y * y;
|
||||
|
||||
// Apply the Barnes-Hut approximation if possible.
|
||||
// Limit forces for very close nodes; randomize direction if coincident.
|
||||
if (w * w / theta2 < l) {
|
||||
if (l < distanceMax2) {
|
||||
if (x === 0) x = jiggle(), l += x * x;
|
||||
if (y === 0) y = jiggle(), l += y * y;
|
||||
if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
|
||||
node.vx += x * quad.value * alpha / l;
|
||||
node.vy += y * quad.value * alpha / l;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Otherwise, process points directly.
|
||||
else if (quad.length || l >= distanceMax2) return;
|
||||
|
||||
// Limit forces for very close nodes; randomize direction if coincident.
|
||||
if (quad.data !== node || quad.next) {
|
||||
if (x === 0) x = jiggle(), l += x * x;
|
||||
if (y === 0) y = jiggle(), l += y * y;
|
||||
if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
|
||||
}
|
||||
|
||||
do if (quad.data !== node) {
|
||||
w = strengths[quad.data.index] * alpha / l;
|
||||
node.vx += x * w;
|
||||
node.vy += y * w;
|
||||
} while (quad = quad.next);
|
||||
}
|
||||
|
||||
force.initialize = function(_) {
|
||||
nodes = _;
|
||||
initialize();
|
||||
};
|
||||
|
||||
force.strength = function(_) {
|
||||
return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength;
|
||||
};
|
||||
|
||||
force.distanceMin = function(_) {
|
||||
return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
|
||||
};
|
||||
|
||||
force.distanceMax = function(_) {
|
||||
return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
|
||||
};
|
||||
|
||||
force.theta = function(_) {
|
||||
return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
|
||||
};
|
||||
|
||||
return force;
|
||||
}
|
||||
57
node_modules/d3-force/src/radial.js
generated
vendored
Normal file
57
node_modules/d3-force/src/radial.js
generated
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
import constant from "./constant";
|
||||
|
||||
export default function(radius, x, y) {
|
||||
var nodes,
|
||||
strength = constant(0.1),
|
||||
strengths,
|
||||
radiuses;
|
||||
|
||||
if (typeof radius !== "function") radius = constant(+radius);
|
||||
if (x == null) x = 0;
|
||||
if (y == null) y = 0;
|
||||
|
||||
function force(alpha) {
|
||||
for (var i = 0, n = nodes.length; i < n; ++i) {
|
||||
var node = nodes[i],
|
||||
dx = node.x - x || 1e-6,
|
||||
dy = node.y - y || 1e-6,
|
||||
r = Math.sqrt(dx * dx + dy * dy),
|
||||
k = (radiuses[i] - r) * strengths[i] * alpha / r;
|
||||
node.vx += dx * k;
|
||||
node.vy += dy * k;
|
||||
}
|
||||
}
|
||||
|
||||
function initialize() {
|
||||
if (!nodes) return;
|
||||
var i, n = nodes.length;
|
||||
strengths = new Array(n);
|
||||
radiuses = new Array(n);
|
||||
for (i = 0; i < n; ++i) {
|
||||
radiuses[i] = +radius(nodes[i], i, nodes);
|
||||
strengths[i] = isNaN(radiuses[i]) ? 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.radius = function(_) {
|
||||
return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius;
|
||||
};
|
||||
|
||||
force.x = function(_) {
|
||||
return arguments.length ? (x = +_, force) : x;
|
||||
};
|
||||
|
||||
force.y = function(_) {
|
||||
return arguments.length ? (y = +_, force) : y;
|
||||
};
|
||||
|
||||
return force;
|
||||
}
|
||||
143
node_modules/d3-force/src/simulation.js
generated
vendored
Normal file
143
node_modules/d3-force/src/simulation.js
generated
vendored
Normal file
@@ -0,0 +1,143 @@
|
||||
import {dispatch} from "d3-dispatch";
|
||||
import {map} from "d3-collection";
|
||||
import {timer} from "d3-timer";
|
||||
|
||||
export function x(d) {
|
||||
return d.x;
|
||||
}
|
||||
|
||||
export function y(d) {
|
||||
return d.y;
|
||||
}
|
||||
|
||||
var initialRadius = 10,
|
||||
initialAngle = Math.PI * (3 - Math.sqrt(5));
|
||||
|
||||
export default function(nodes) {
|
||||
var simulation,
|
||||
alpha = 1,
|
||||
alphaMin = 0.001,
|
||||
alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
|
||||
alphaTarget = 0,
|
||||
velocityDecay = 0.6,
|
||||
forces = map(),
|
||||
stepper = timer(step),
|
||||
event = dispatch("tick", "end");
|
||||
|
||||
if (nodes == null) nodes = [];
|
||||
|
||||
function step() {
|
||||
tick();
|
||||
event.call("tick", simulation);
|
||||
if (alpha < alphaMin) {
|
||||
stepper.stop();
|
||||
event.call("end", simulation);
|
||||
}
|
||||
}
|
||||
|
||||
function tick() {
|
||||
var i, n = nodes.length, node;
|
||||
|
||||
alpha += (alphaTarget - alpha) * alphaDecay;
|
||||
|
||||
forces.each(function(force) {
|
||||
force(alpha);
|
||||
});
|
||||
|
||||
for (i = 0; i < n; ++i) {
|
||||
node = nodes[i];
|
||||
if (node.fx == null) node.x += node.vx *= velocityDecay;
|
||||
else node.x = node.fx, node.vx = 0;
|
||||
if (node.fy == null) node.y += node.vy *= velocityDecay;
|
||||
else node.y = node.fy, node.vy = 0;
|
||||
}
|
||||
}
|
||||
|
||||
function initializeNodes() {
|
||||
for (var i = 0, n = nodes.length, node; i < n; ++i) {
|
||||
node = nodes[i], node.index = i;
|
||||
if (isNaN(node.x) || isNaN(node.y)) {
|
||||
var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
|
||||
node.x = radius * Math.cos(angle);
|
||||
node.y = radius * Math.sin(angle);
|
||||
}
|
||||
if (isNaN(node.vx) || isNaN(node.vy)) {
|
||||
node.vx = node.vy = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function initializeForce(force) {
|
||||
if (force.initialize) force.initialize(nodes);
|
||||
return force;
|
||||
}
|
||||
|
||||
initializeNodes();
|
||||
|
||||
return simulation = {
|
||||
tick: tick,
|
||||
|
||||
restart: function() {
|
||||
return stepper.restart(step), simulation;
|
||||
},
|
||||
|
||||
stop: function() {
|
||||
return stepper.stop(), simulation;
|
||||
},
|
||||
|
||||
nodes: function(_) {
|
||||
return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
|
||||
},
|
||||
|
||||
alpha: function(_) {
|
||||
return arguments.length ? (alpha = +_, simulation) : alpha;
|
||||
},
|
||||
|
||||
alphaMin: function(_) {
|
||||
return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
|
||||
},
|
||||
|
||||
alphaDecay: function(_) {
|
||||
return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
|
||||
},
|
||||
|
||||
alphaTarget: function(_) {
|
||||
return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
|
||||
},
|
||||
|
||||
velocityDecay: function(_) {
|
||||
return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
|
||||
},
|
||||
|
||||
force: function(name, _) {
|
||||
return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
|
||||
},
|
||||
|
||||
find: function(x, y, radius) {
|
||||
var i = 0,
|
||||
n = nodes.length,
|
||||
dx,
|
||||
dy,
|
||||
d2,
|
||||
node,
|
||||
closest;
|
||||
|
||||
if (radius == null) radius = Infinity;
|
||||
else radius *= radius;
|
||||
|
||||
for (i = 0; i < n; ++i) {
|
||||
node = nodes[i];
|
||||
dx = x - node.x;
|
||||
dy = y - node.y;
|
||||
d2 = dx * dx + dy * dy;
|
||||
if (d2 < radius) closest = node, radius = d2;
|
||||
}
|
||||
|
||||
return closest;
|
||||
},
|
||||
|
||||
on: function(name, _) {
|
||||
return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
|
||||
}
|
||||
};
|
||||
}
|
||||
41
node_modules/d3-force/src/x.js
generated
vendored
Normal file
41
node_modules/d3-force/src/x.js
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
import constant from "./constant";
|
||||
|
||||
export default function(x) {
|
||||
var strength = constant(0.1),
|
||||
nodes,
|
||||
strengths,
|
||||
xz;
|
||||
|
||||
if (typeof x !== "function") x = constant(x == null ? 0 : +x);
|
||||
|
||||
function force(alpha) {
|
||||
for (var i = 0, n = nodes.length, node; i < n; ++i) {
|
||||
node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
|
||||
}
|
||||
}
|
||||
|
||||
function initialize() {
|
||||
if (!nodes) return;
|
||||
var i, n = nodes.length;
|
||||
strengths = new Array(n);
|
||||
xz = new Array(n);
|
||||
for (i = 0; i < n; ++i) {
|
||||
strengths[i] = isNaN(xz[i] = +x(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.x = function(_) {
|
||||
return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), initialize(), force) : x;
|
||||
};
|
||||
|
||||
return force;
|
||||
}
|
||||
41
node_modules/d3-force/src/y.js
generated
vendored
Normal file
41
node_modules/d3-force/src/y.js
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user