Optimize charge calculation.
This commit is contained in:
Родитель
14b6231e45
Коммит
cc74ee022b
|
@ -5579,21 +5579,21 @@ d3 = function() {
|
|||
return chord;
|
||||
};
|
||||
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, chargeDistance = d3_layout_forceChargeDistance, 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 = .8 * .8, nodes = [], links = [], distances, strengths, charges;
|
||||
function repulse(node) {
|
||||
return function(quad, x1, _, x2) {
|
||||
if (quad.point !== node) {
|
||||
var dx = quad.cx - node.x, dy = quad.cy - node.y, dn = Math.sqrt(dx * dx + dy * dy);
|
||||
if ((x2 - x1) / dn < theta) {
|
||||
if (dn < chargeDistance) {
|
||||
var k = quad.charge / dn / dn;
|
||||
var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;
|
||||
if (dw * dw / theta2 < dn) {
|
||||
if (dn < chargeDistance2) {
|
||||
var k = quad.charge / dn;
|
||||
node.px -= dx * k;
|
||||
node.py -= dy * k;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (quad.point && dn && dn < chargeDistance) {
|
||||
var k = quad.pointCharge / dn / dn;
|
||||
if (quad.point && dn && dn < chargeDistance2) {
|
||||
var k = quad.pointCharge / dn;
|
||||
node.px -= dx * k;
|
||||
node.py -= dy * k;
|
||||
}
|
||||
|
@ -5698,8 +5698,8 @@ d3 = function() {
|
|||
return force;
|
||||
};
|
||||
force.chargeDistance = function(x) {
|
||||
if (!arguments.length) return chargeDistance;
|
||||
chargeDistance = +x;
|
||||
if (!arguments.length) return Math.sqrt(chargeDistance2);
|
||||
chargeDistance2 = x * x;
|
||||
return force;
|
||||
};
|
||||
force.gravity = function(x) {
|
||||
|
@ -5708,8 +5708,8 @@ d3 = function() {
|
|||
return force;
|
||||
};
|
||||
force.theta = function(x) {
|
||||
if (!arguments.length) return theta;
|
||||
theta = +x;
|
||||
if (!arguments.length) return Math.sqrt(theta2);
|
||||
theta2 = x * x;
|
||||
return force;
|
||||
};
|
||||
force.alpha = function(x) {
|
||||
|
@ -5830,7 +5830,7 @@ d3 = function() {
|
|||
quad.cx = cx / quad.charge;
|
||||
quad.cy = cy / quad.charge;
|
||||
}
|
||||
var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance = Infinity;
|
||||
var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;
|
||||
d3.layout.hierarchy = function() {
|
||||
var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;
|
||||
function recurse(node, depth, nodes) {
|
||||
|
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -18,9 +18,9 @@ d3.layout.force = function() {
|
|||
linkDistance = d3_layout_forceLinkDistance,
|
||||
linkStrength = d3_layout_forceLinkStrength,
|
||||
charge = -30,
|
||||
chargeDistance = d3_layout_forceChargeDistance,
|
||||
chargeDistance2 = d3_layout_forceChargeDistance2,
|
||||
gravity = .1,
|
||||
theta = .8,
|
||||
theta2 = .64,
|
||||
nodes = [],
|
||||
links = [],
|
||||
distances,
|
||||
|
@ -32,20 +32,21 @@ d3.layout.force = function() {
|
|||
if (quad.point !== node) {
|
||||
var dx = quad.cx - node.x,
|
||||
dy = quad.cy - node.y,
|
||||
dn = Math.sqrt(dx * dx + dy * dy);
|
||||
dw = x2 - x1,
|
||||
dn = dx * dx + dy * dy;
|
||||
|
||||
/* Barnes-Hut criterion. */
|
||||
if ((x2 - x1) / dn < theta) {
|
||||
if (dn < chargeDistance) {
|
||||
var k = quad.charge / dn / dn;
|
||||
if (dw * dw / theta2 < dn) {
|
||||
if (dn < chargeDistance2) {
|
||||
var k = quad.charge / dn;
|
||||
node.px -= dx * k;
|
||||
node.py -= dy * k;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if (quad.point && dn && dn < chargeDistance) {
|
||||
var k = quad.pointCharge / dn / dn;
|
||||
if (quad.point && dn && dn < chargeDistance2) {
|
||||
var k = quad.pointCharge / dn;
|
||||
node.px -= dx * k;
|
||||
node.py -= dy * k;
|
||||
}
|
||||
|
@ -173,8 +174,8 @@ d3.layout.force = function() {
|
|||
};
|
||||
|
||||
force.chargeDistance = function(x) {
|
||||
if (!arguments.length) return chargeDistance;
|
||||
chargeDistance = +x;
|
||||
if (!arguments.length) return Math.sqrt(chargeDistance2);
|
||||
chargeDistance2 = x * x;
|
||||
return force;
|
||||
};
|
||||
|
||||
|
@ -185,8 +186,8 @@ d3.layout.force = function() {
|
|||
};
|
||||
|
||||
force.theta = function(x) {
|
||||
if (!arguments.length) return theta;
|
||||
theta = +x;
|
||||
if (!arguments.length) return Math.sqrt(theta2);
|
||||
theta2 = x * x;
|
||||
return force;
|
||||
};
|
||||
|
||||
|
@ -366,4 +367,4 @@ function d3_layout_forceAccumulate(quad, alpha, charges) {
|
|||
|
||||
var d3_layout_forceLinkDistance = 20,
|
||||
d3_layout_forceLinkStrength = 1,
|
||||
d3_layout_forceChargeDistance = Infinity;
|
||||
d3_layout_forceChargeDistance2 = Infinity;
|
||||
|
|
Загрузка…
Ссылка в новой задаче