Merge branch 'force-charge-distance' into 3.4
This commit is contained in:
Коммит
a18c8a23fb
|
@ -6112,19 +6112,21 @@
|
||||||
return chord;
|
return chord;
|
||||||
};
|
};
|
||||||
d3.layout.force = function() {
|
d3.layout.force = function() {
|
||||||
var force = {}, event = d3.dispatch("start", "tick", "end"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, gravity = .1, theta = .8, nodes = [], links = [], distances, strengths, charges;
|
var force = {}, event = d3.dispatch("start", "tick", "end"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;
|
||||||
function repulse(node) {
|
function repulse(node) {
|
||||||
return function(quad, x1, _, x2) {
|
return function(quad, x1, _, x2) {
|
||||||
if (quad.point !== node) {
|
if (quad.point !== node) {
|
||||||
var dx = quad.cx - node.x, dy = quad.cy - node.y, dn = 1 / Math.sqrt(dx * dx + dy * dy);
|
var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;
|
||||||
if ((x2 - x1) * dn < theta) {
|
if (dw * dw / theta2 < dn) {
|
||||||
var k = quad.charge * dn * dn;
|
if (dn < chargeDistance2) {
|
||||||
|
var k = quad.charge / dn;
|
||||||
node.px -= dx * k;
|
node.px -= dx * k;
|
||||||
node.py -= dy * k;
|
node.py -= dy * k;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (quad.point && isFinite(dn)) {
|
if (quad.point && dn && dn < chargeDistance2) {
|
||||||
var k = quad.pointCharge * dn * dn;
|
var k = quad.pointCharge / dn;
|
||||||
node.px -= dx * k;
|
node.px -= dx * k;
|
||||||
node.py -= dy * k;
|
node.py -= dy * k;
|
||||||
}
|
}
|
||||||
|
@ -6228,14 +6230,19 @@
|
||||||
charge = typeof x === "function" ? x : +x;
|
charge = typeof x === "function" ? x : +x;
|
||||||
return force;
|
return force;
|
||||||
};
|
};
|
||||||
|
force.chargeDistance = function(x) {
|
||||||
|
if (!arguments.length) return Math.sqrt(chargeDistance2);
|
||||||
|
chargeDistance2 = x * x;
|
||||||
|
return force;
|
||||||
|
};
|
||||||
force.gravity = function(x) {
|
force.gravity = function(x) {
|
||||||
if (!arguments.length) return gravity;
|
if (!arguments.length) return gravity;
|
||||||
gravity = +x;
|
gravity = +x;
|
||||||
return force;
|
return force;
|
||||||
};
|
};
|
||||||
force.theta = function(x) {
|
force.theta = function(x) {
|
||||||
if (!arguments.length) return theta;
|
if (!arguments.length) return Math.sqrt(theta2);
|
||||||
theta = +x;
|
theta2 = x * x;
|
||||||
return force;
|
return force;
|
||||||
};
|
};
|
||||||
force.alpha = function(x) {
|
force.alpha = function(x) {
|
||||||
|
@ -6353,7 +6360,7 @@
|
||||||
quad.cx = cx / quad.charge;
|
quad.cx = cx / quad.charge;
|
||||||
quad.cy = cy / quad.charge;
|
quad.cy = cy / quad.charge;
|
||||||
}
|
}
|
||||||
var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1;
|
var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;
|
||||||
d3.layout.hierarchy = function() {
|
d3.layout.hierarchy = function() {
|
||||||
var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;
|
var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;
|
||||||
function recurse(node, depth, nodes) {
|
function recurse(node, depth, nodes) {
|
||||||
|
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -18,8 +18,9 @@ d3.layout.force = function() {
|
||||||
linkDistance = d3_layout_forceLinkDistance,
|
linkDistance = d3_layout_forceLinkDistance,
|
||||||
linkStrength = d3_layout_forceLinkStrength,
|
linkStrength = d3_layout_forceLinkStrength,
|
||||||
charge = -30,
|
charge = -30,
|
||||||
|
chargeDistance2 = d3_layout_forceChargeDistance2,
|
||||||
gravity = .1,
|
gravity = .1,
|
||||||
theta = .8,
|
theta2 = .64,
|
||||||
nodes = [],
|
nodes = [],
|
||||||
links = [],
|
links = [],
|
||||||
distances,
|
distances,
|
||||||
|
@ -31,18 +32,21 @@ d3.layout.force = function() {
|
||||||
if (quad.point !== node) {
|
if (quad.point !== node) {
|
||||||
var dx = quad.cx - node.x,
|
var dx = quad.cx - node.x,
|
||||||
dy = quad.cy - node.y,
|
dy = quad.cy - node.y,
|
||||||
dn = 1 / Math.sqrt(dx * dx + dy * dy);
|
dw = x2 - x1,
|
||||||
|
dn = dx * dx + dy * dy;
|
||||||
|
|
||||||
/* Barnes-Hut criterion. */
|
/* Barnes-Hut criterion. */
|
||||||
if ((x2 - x1) * dn < theta) {
|
if (dw * dw / theta2 < dn) {
|
||||||
var k = quad.charge * dn * dn;
|
if (dn < chargeDistance2) {
|
||||||
|
var k = quad.charge / dn;
|
||||||
node.px -= dx * k;
|
node.px -= dx * k;
|
||||||
node.py -= dy * k;
|
node.py -= dy * k;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (quad.point && isFinite(dn)) {
|
if (quad.point && dn && dn < chargeDistance2) {
|
||||||
var k = quad.pointCharge * dn * dn;
|
var k = quad.pointCharge / dn;
|
||||||
node.px -= dx * k;
|
node.px -= dx * k;
|
||||||
node.py -= dy * k;
|
node.py -= dy * k;
|
||||||
}
|
}
|
||||||
|
@ -169,6 +173,12 @@ d3.layout.force = function() {
|
||||||
return force;
|
return force;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
force.chargeDistance = function(x) {
|
||||||
|
if (!arguments.length) return Math.sqrt(chargeDistance2);
|
||||||
|
chargeDistance2 = x * x;
|
||||||
|
return force;
|
||||||
|
};
|
||||||
|
|
||||||
force.gravity = function(x) {
|
force.gravity = function(x) {
|
||||||
if (!arguments.length) return gravity;
|
if (!arguments.length) return gravity;
|
||||||
gravity = +x;
|
gravity = +x;
|
||||||
|
@ -176,8 +186,8 @@ d3.layout.force = function() {
|
||||||
};
|
};
|
||||||
|
|
||||||
force.theta = function(x) {
|
force.theta = function(x) {
|
||||||
if (!arguments.length) return theta;
|
if (!arguments.length) return Math.sqrt(theta2);
|
||||||
theta = +x;
|
theta2 = x * x;
|
||||||
return force;
|
return force;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -352,4 +362,5 @@ function d3_layout_forceAccumulate(quad, alpha, charges) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var d3_layout_forceLinkDistance = 20,
|
var d3_layout_forceLinkDistance = 20,
|
||||||
d3_layout_forceLinkStrength = 1;
|
d3_layout_forceLinkStrength = 1,
|
||||||
|
d3_layout_forceChargeDistance2 = Infinity;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче