This commit is contained in:
Mike Bostock 2011-07-08 22:44:41 -07:00
Родитель 489eb0cde7 b788ac710f
Коммит 3c8fabbd65
19 изменённых файлов: 407 добавлений и 41 удалений

Просмотреть файл

@ -8,7 +8,7 @@ d3.behavior.zoom = function() {
z = 0,
listeners = [],
pan,
zoom;
zooming;
function zoom() {
var container = this
@ -35,7 +35,7 @@ d3.behavior.zoom = function() {
}
function mousemove() {
zoom = null;
zooming = null;
if (pan) {
x = d3.event.clientX + pan.x0;
y = d3.event.clientY + pan.y0;
@ -68,9 +68,9 @@ d3.behavior.zoom = function() {
var e = d3.event;
// initialize the mouse location for zooming (to avoid drift)
if (!zoom) {
if (!zooming) {
var p = d3.svg.mouse(this.nearestViewportElement || this);
zoom = {
zooming = {
x0: x,
y0: y,
z0: z,
@ -98,9 +98,9 @@ d3.behavior.zoom = function() {
}
// adjust x and y to center around mouse location
var k = Math.pow(2, z - zoom.z0) - 1;
x = zoom.x0 + zoom.x1 * k;
y = zoom.y0 + zoom.y1 * k;
var k = Math.pow(2, z - zooming.z0) - 1;
x = zooming.x0 + zooming.x1 * k;
y = zooming.y0 + zooming.y1 * k;
// dispatch redraw
dispatch.call(this, d, i);

2
d3.behavior.min.js поставляемый
Просмотреть файл

@ -1 +1 @@
(function(){d3.behavior={},d3.behavior.zoom=function(){function l(e,f){function i(a,b){var c=a.__domain||(a.__domain=a.domain()),d=a.range().map(function(a){return(a-b)/h});a.domain(c).domain(d.map(a.invert))}var g=d3.event,h=Math.pow(2,c);d3.event={scale:h,translate:[a,b],transform:function(c,d){c&&i(c,a),d&&i(d,b)}};try{for(var j=0,k=d.length;j<k;j++)d[j].call(this,e,f)}finally{d3.event=g}}function k(d,e){var g=d3.event;if(!f){var h=d3.svg.mouse(this.nearestViewportElement||this);f={x0:a,y0:b,z0:c,x1:a-h[0],y1:b-h[1]}}if(g.type==="dblclick")c=g.shiftKey?Math.ceil(c-1):Math.floor(c+1);else{var i=g.wheelDelta||-g.detail;if(i){try{j.scrollTop=1e3,j.dispatchEvent(g),i=1e3-j.scrollTop}catch(k){}i*=.005}c+=i}var m=Math.pow(2,c-f.z0)-1;a=f.x0+f.x1*m,b=f.y0+f.y1*m,l.call(this,d,e)}function i(){e&&(h(),e=null)}function h(){f=null,e&&(a=d3.event.clientX+e.x0,b=d3.event.clientY+e.y0,l.call(e.target,e.data,e.index))}function g(c,d){e={x0:a-d3.event.clientX,y0:b-d3.event.clientY,target:this,data:c,index:d},d3.event.preventDefault(),window.focus()}function f(){var a=this.on("mousedown",g).on("mousewheel",k).on("DOMMouseScroll",k).on("dblclick",k);d3.select(window).on("mousemove",h).on("mouseup",i)}var a=0,b=0,c=0,d=[],e,f,j=d3.select("body").append("div").style("visibility","hidden").style("position","absolute").style("top","-3000px").style("height",0).style("overflow-y","scroll").append("div").style("height","2000px").node().parentNode;f.on=function(a,b){a=="zoom"&&d.push(b);return f};return f}})()
(function(){d3.behavior={},d3.behavior.zoom=function(){function m(e,f){function i(a,b){var c=a.__domain||(a.__domain=a.domain()),d=a.range().map(function(a){return(a-b)/h});a.domain(c).domain(d.map(a.invert))}var g=d3.event,h=Math.pow(2,c);d3.event={scale:h,translate:[a,b],transform:function(c,d){c&&i(c,a),d&&i(d,b)}};try{for(var j=0,k=d.length;j<k;j++)d[j].call(this,e,f)}finally{d3.event=g}}function l(d,e){var g=d3.event;if(!f){var h=d3.svg.mouse(this.nearestViewportElement||this);f={x0:a,y0:b,z0:c,x1:a-h[0],y1:b-h[1]}}if(g.type==="dblclick")c=g.shiftKey?Math.ceil(c-1):Math.floor(c+1);else{var i=g.wheelDelta||-g.detail;if(i){try{k.scrollTop=1e3,k.dispatchEvent(g),i=1e3-k.scrollTop}catch(j){}i*=.005}c+=i}var l=Math.pow(2,c-f.z0)-1;a=f.x0+f.x1*l,b=f.y0+f.y1*l,m.call(this,d,e)}function j(){e&&(i(),e=null)}function i(){f=null,e&&(a=d3.event.clientX+e.x0,b=d3.event.clientY+e.y0,m.call(e.target,e.data,e.index))}function h(c,d){e={x0:a-d3.event.clientX,y0:b-d3.event.clientY,target:this,data:c,index:d},d3.event.preventDefault(),window.focus()}function g(){var a=this.on("mousedown",h).on("mousewheel",l).on("DOMMouseScroll",l).on("dblclick",l);d3.select(window).on("mousemove",i).on("mouseup",j)}var a=0,b=0,c=0,d=[],e,f,k=d3.select("body").append("div").style("visibility","hidden").style("position","absolute").style("top","-3000px").style("height",0).style("overflow-y","scroll").append("div").style("height","2000px").node().parentNode;g.on=function(a,b){a=="zoom"&&d.push(b);return g};return g}})()

2
d3.js поставляемый
Просмотреть файл

@ -1,4 +1,4 @@
(function(){d3 = {version: "1.25.0"}; // semver
(function(){d3 = {version: "1.26.0"}; // semver
if (!Date.now) Date.now = function() {
return +new Date;
};

Просмотреть файл

@ -211,14 +211,16 @@ d3.layout.force = function() {
size = [1, 1],
alpha,
friction = .9,
distance = 20,
linkDistance = d3_layout_forceLinkDistance,
linkStrength = d3_layout_forceLinkStrength,
charge = -30,
gravity = .1,
theta = .8,
interval,
nodes = [],
links = [],
distances;
distances,
strengths;
function repulse(node, kc) {
return function(quad, x1, y1, x2, y2) {
@ -264,7 +266,7 @@ d3.layout.force = function() {
x = t.x - s.x;
y = t.y - s.y;
if (l = (x * x + y * y)) {
l = alpha * ((l = Math.sqrt(l)) - distance) / l;
l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;
x *= l;
y *= l;
t.x -= x;
@ -334,9 +336,18 @@ d3.layout.force = function() {
return force;
};
force.distance = function(x) {
if (!arguments.length) return distance;
distance = x;
force.linkDistance = function(x) {
if (!arguments.length) return linkDistance;
linkDistance = d3.functor(x);
return force;
};
// For backwards-compatibility.
force.distance = force.linkDistance;
force.linkStrength = function(x) {
if (!arguments.length) return linkStrength;
linkStrength = d3.functor(x);
return force;
};
@ -378,10 +389,14 @@ d3.layout.force = function() {
(o = nodes[i]).index = i;
}
distances = [];
strengths = [];
for (i = 0; i < m; ++i) {
o = links[i];
if (typeof o.source == "number") o.source = nodes[o.source];
if (typeof o.target == "number") o.target = nodes[o.target];
distances[i] = linkDistance.call(this, o, i);
strengths[i] = linkStrength.call(this, o, i);
}
for (i = 0; i < n; ++i) {
@ -455,14 +470,14 @@ d3.layout.force = function() {
// O NOES! The drag element was removed from the DOM.
if (!parent) {
d3_layout_forceDragNode.fixed = false;
d3_layout_forceDragNode = d3_layout_forceDragElement = null;
d3_layout_forceDragOffset = d3_layout_forceDragNode = d3_layout_forceDragElement = null;
return;
}
var m = d3.svg.mouse(parent);
d3_layout_forceDragMoved = true;
d3_layout_forceDragNode.px = m[0];
d3_layout_forceDragNode.py = m[1];
d3_layout_forceDragNode.px = m[0] - d3_layout_forceDragOffset[0];
d3_layout_forceDragNode.py = m[1] - d3_layout_forceDragOffset[1];
force.resume(); // restart annealing
}
@ -478,7 +493,7 @@ d3.layout.force = function() {
dragmove();
d3_layout_forceDragNode.fixed = false;
d3_layout_forceDragNode = d3_layout_forceDragElement = null;
d3_layout_forceDragOffset = d3_layout_forceDragNode = d3_layout_forceDragElement = null;
}
return force;
@ -486,6 +501,7 @@ d3.layout.force = function() {
var d3_layout_forceDragNode,
d3_layout_forceDragMoved,
d3_layout_forceDragOffset,
d3_layout_forceStopClick,
d3_layout_forceDragElement;
@ -500,9 +516,11 @@ function d3_layout_forceDragOut(d) {
}
function d3_layout_forceDragDown(d, i) {
var m = d3.svg.mouse(this.parentNode);
(d3_layout_forceDragNode = d).fixed = true;
d3_layout_forceDragMoved = false;
d3_layout_forceDragElement = this;
d3_layout_forceDragOffset = [m[0] - d.x, m[1] - d.y];
d3_layout_forceCancel();
}
@ -543,6 +561,14 @@ function d3_layout_forceAccumulate(quad) {
quad.cx = cx / quad.count;
quad.cy = cy / quad.count;
}
function d3_layout_forceLinkDistance(link) {
return 20;
}
function d3_layout_forceLinkStrength(link) {
return 1;
}
d3.layout.partition = function() {
var hierarchy = d3.layout.hierarchy(),
size = [1, 1]; // width, height

2
d3.layout.min.js поставляемый

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

2
d3.min.js поставляемый

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,9 @@
#chart {
width: 960px;
height: 500px;
}
rect {
stroke: #000;
stroke-width: .5px;
}

Просмотреть файл

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>Demers Cartogram</title>
<script type="text/javascript" src="../../d3.js"></script>
<script type="text/javascript" src="../../d3.geo.js"></script>
<script type="text/javascript" src="../../d3.geom.js"></script>
<script type="text/javascript" src="../../d3.layout.js"></script>
<link type="text/css" rel="stylesheet" href="demers.css"/>
</head>
<body>
<div id="chart"></div>
<script type="text/javascript" src="demers.js"></script>
</body>
</html>

Просмотреть файл

@ -0,0 +1,79 @@
// Ratio of Obese (BMI >= 30) in U.S. Adults, CDC 2008
var data = [
, .187, .198, , .133, .175, .151, , .1, .125, .171, , .172, .133, , .108,
.142, .167, .201, .175, .159, .169, .177, .141, .163, .117, .182, .153, .195,
.189, .134, .163, .133, .151, .145, .13, .139, .169, .164, .175, .135, .152,
.169, , .132, .167, .139, .184, .159, .14, .146, .157, , .139, .183, .16, .143
];
var color = d3.scale.linear()
.domain([d3.min(data), d3.max(data)])
.range(["#aad", "#556"]);
var force = d3.layout.force()
.charge(0)
.gravity(0)
.size([960, 500]);
var svg = d3.select("#chart").append("svg:svg");
d3.json("../data/us-state-centroids.json", function(states) {
var project = d3.geo.albersUsa(),
idToNode = {},
links = [],
nodes = states.features.map(function(d) {
var xy = project(d.geometry.coordinates);
return idToNode[d.id] = {
x: xy[0],
y: xy[1],
gravity: {x: xy[0], y: xy[1]},
r: Math.sqrt(data[+d.id] * 2500),
value: data[+d.id]
};
});
force
.nodes(nodes)
.links(links)
.start()
.on("tick", function(e) {
var k = e.alpha * .5,
kg = k * .1;
nodes.forEach(function(a, i) {
// Apply gravity forces.
a.x += (a.gravity.x - a.x) * kg;
a.y += (a.gravity.y - a.y) * kg;
nodes.slice(i + 1).forEach(function(b) {
// Check for collision
var dx = a.x - b.x,
dy = a.y - b.y,
d = a.r + b.r,
lx = Math.abs(dx),
ly = Math.abs(dy);
if (lx < d && ly < d) {
lx = (lx - d) / lx * k;
ly = (ly - d) / ly * k;
dx *= lx;
dy *= ly;
a.x -= dx;
a.y -= dy;
b.x += dx;
b.y += dy;
}
});
});
svg.selectAll("rect")
.attr("x", function(d) { return d.x - d.r; })
.attr("y", function(d) { return d.y - d.r; });
});
svg.selectAll("rect")
.data(nodes)
.enter().append("svg:rect")
.style("fill", function(d) { return color(d.value); })
.attr("x", function(d) { return d.x - d.r; })
.attr("y", function(d) { return d.y - d.r; })
.attr("width", function(d) { return d.r * 2; })
.attr("height", function(d) { return d.r * 2; });
});

Просмотреть файл

@ -0,0 +1,9 @@
#chart {
width: 960px;
height: 500px;
}
circle {
stroke: #000;
stroke-width: .5px;
}

Просмотреть файл

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>Dorling Cartogram</title>
<script type="text/javascript" src="../../d3.js"></script>
<script type="text/javascript" src="../../d3.geo.js"></script>
<script type="text/javascript" src="../../d3.geom.js"></script>
<script type="text/javascript" src="../../d3.layout.js"></script>
<link type="text/css" rel="stylesheet" href="dorling.css"/>
</head>
<body>
<div id="chart"></div>
<script type="text/javascript" src="dorling.js"></script>
</body>
</html>

Просмотреть файл

@ -0,0 +1,80 @@
// Ratio of Obese (BMI >= 30) in U.S. Adults, CDC 2008
var data = [
, .187, .198, , .133, .175, .151, , .1, .125, .171, , .172, .133, , .108,
.142, .167, .201, .175, .159, .169, .177, .141, .163, .117, .182, .153, .195,
.189, .134, .163, .133, .151, .145, .13, .139, .169, .164, .175, .135, .152,
.169, , .132, .167, .139, .184, .159, .14, .146, .157, , .139, .183, .16, .143
];
var color = d3.scale.linear()
.domain([d3.min(data), d3.max(data)])
.range(["#aad", "#556"]);
var force = d3.layout.force()
.charge(0)
.gravity(0)
.size([960, 500]);
var svg = d3.select("#chart").append("svg:svg")
.attr("width", 960 + 100)
.attr("height", 500 + 100)
.append("svg:g")
.attr("transform", "translate(50,50)");
d3.json("../data/us-state-centroids.json", function(states) {
var project = d3.geo.albersUsa(),
idToNode = {},
links = [],
nodes = states.features.map(function(d) {
var xy = project(d.geometry.coordinates);
return idToNode[d.id] = {
x: xy[0],
y: xy[1],
gravity: {x: xy[0], y: xy[1]},
r: Math.sqrt(data[+d.id] * 5000),
value: data[+d.id]
};
});
force
.nodes(nodes)
.links(links)
.start()
.on("tick", function(e) {
var k = e.alpha,
kg = k * .02;
nodes.forEach(function(a, i) {
// Apply gravity forces.
a.x += (a.gravity.x - a.x) * kg;
a.y += (a.gravity.y - a.y) * kg;
nodes.slice(i + 1).forEach(function(b) {
// Check for collisions.
var dx = a.x - b.x,
dy = a.y - b.y,
l = Math.sqrt(dx * dx + dy * dy),
d = a.r + b.r;
if (l < d) {
l = (l - d) / l * k;
dx *= l;
dy *= l;
a.x -= dx;
a.y -= dy;
b.x += dx;
b.y += dy;
}
});
});
svg.selectAll("circle")
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
});
svg.selectAll("circle")
.data(nodes)
.enter().append("svg:circle")
.style("fill", function(d) { return color(d.value); })
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.attr("r", function(d, i) { return d.r; });
});

Просмотреть файл

@ -0,0 +1 @@
{"30":["38","46","56","16"],"51":["24","37","47","21","54"],"45":["37","13"],"50":["33","25","36"],"19":["27","55","17","29","31","46"],"26":["39","18","55"],"35":["08","40","48","04"],"41":["53","16","32","06"],"04":["35","49","32","06"],"02":[],"25":["33","44","09","36"],"23":["33"],"01":["28","13","12","47"],"06":["41","32","04"],"21":["39","54","51","47","29","17","18"],"22":["05","28","48"],"05":["28","22","48","40","29","47"],"46":["38","27","19","31","56","30"],"47":["21","51","37","13","01","28","05","29"],"08":["35","49","56","31","20","40"],"09":["25","44","36"],"42":["36","34","10","24","54","39"],"29":["19","17","21","47","05","40","20","31"],"40":["20","29","05","48","35","08"],"18":["26","39","21","17"],"27":["55","19","46","38"],"28":["47","01","22","05"],"24":["10","42","54","51","11"],"39":["42","54","21","18","26"],"38":["68","46","30"],"20":["31","29","40","08"],"11":["24","51"],"10":["34","42","24"],"13":["12","01","47","37","45"],"12":["13","01"],"15":[],"48":["27","40","05","22"],"17":["18","21","29","19","55"],"16":["30","56","49","32","41","53"],"55":["26","17","19","27"],"54":["42","24","51","21","39"],"31":["46","19","29","20","08","56"],"56":["30","46","31","08","49","16"],"37":["51","45","13","47"],"36":["50","25","09","34","42"],"53":["16","41"],"34":["36","10","42"],"33":["23","25","50"],"32":["16","49","04","06","41"],"49":["16","56","08","04","32"],"44":["25","09"]}

Просмотреть файл

@ -192,7 +192,7 @@ function init() {
.nodes(net.nodes)
.links(net.links)
.size([w, h])
.distance(50)
.linkDistance(50)
.start();
hullg.selectAll("path.hull").remove();

Просмотреть файл

@ -0,0 +1,104 @@
<!DOCTYPE html>
<html>
<head>
<title>Force-Directed Map</title>
<script type="text/javascript" src="../../d3.js"></script>
<script type="text/javascript" src="../../d3.geo.js"></script>
<script type="text/javascript" src="../../d3.geom.js"></script>
<script type="text/javascript" src="../../d3.layout.js"></script>
<style type="text/css">
path {
fill: #ddd;
fill-opacity: .8;
stroke: #fff;
stroke-width: 1.5px;
}
line {
stroke: #999;
}
</style>
</head>
<body>
<script type="text/javascript">
var w = 960,
h = 500;
var path = d3.geo.path(),
force = d3.layout.force().size([w, h]);
var svg = d3.select("body").append("svg:svg")
.attr("width", w)
.attr("height", h);
d3.json("../data/us-states.json", function(states) {
var nodes = [],
links = [];
states.features.forEach(function(d, i) {
if (d.id == "02" || d.id == "15" || d.id == "72") return;
var centroid = path.centroid(d);
centroid.x = centroid[0];
centroid.y = centroid[1];
centroid.feature = d;
nodes.push(centroid);
});
d3.geom.delaunay(nodes).forEach(function(d) {
links.push(edge(d[0], d[1]));
links.push(edge(d[1], d[2]));
links.push(edge(d[2], d[0]));
});
force
.gravity(0)
.charge(0)
.nodes(nodes)
.links(links)
.linkDistance(function(d) { return d.distance; })
.start();
var link = svg.selectAll("line")
.data(links)
.enter().append("svg:line")
.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
var node = svg.selectAll("g")
.data(nodes)
.enter().append("svg:g")
.attr("transform", function(d) { return "translate(" + -d.x + "," + -d.y + ")"; })
.call(force.drag)
.append("svg:path")
.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; })
.attr("d", function(d) { return path(d.feature); });
force.on("tick", function(e) {
link.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
node.attr("transform", function(d) {
return "translate(" + d.x + "," + d.y + ")";
});
});
});
function edge(a, b) {
var dx = a[0] - b[0], dy = a[1] - b[1];
return {
source: a,
target: b,
distance: Math.sqrt(dx * dx + dy * dy)
};
}
</script>
</body>
</html>

Просмотреть файл

@ -10,7 +10,7 @@ var vis = d3.select("#chart")
d3.json("miserables.json", function(json) {
var force = d3.layout.force()
.charge(-120)
.distance(30)
.linkDistance(30)
.nodes(json.nodes)
.links(json.links)
.size([w, h])

Просмотреть файл

@ -7,7 +7,7 @@ d3.behavior.zoom = function() {
z = 0,
listeners = [],
pan,
zoom;
zooming;
function zoom() {
var container = this
@ -34,7 +34,7 @@ d3.behavior.zoom = function() {
}
function mousemove() {
zoom = null;
zooming = null;
if (pan) {
x = d3.event.clientX + pan.x0;
y = d3.event.clientY + pan.y0;
@ -67,9 +67,9 @@ d3.behavior.zoom = function() {
var e = d3.event;
// initialize the mouse location for zooming (to avoid drift)
if (!zoom) {
if (!zooming) {
var p = d3.svg.mouse(this.nearestViewportElement || this);
zoom = {
zooming = {
x0: x,
y0: y,
z0: z,
@ -97,9 +97,9 @@ d3.behavior.zoom = function() {
}
// adjust x and y to center around mouse location
var k = Math.pow(2, z - zoom.z0) - 1;
x = zoom.x0 + zoom.x1 * k;
y = zoom.y0 + zoom.y1 * k;
var k = Math.pow(2, z - zooming.z0) - 1;
x = zooming.x0 + zooming.x1 * k;
y = zooming.y0 + zooming.y1 * k;
// dispatch redraw
dispatch.call(this, d, i);

Просмотреть файл

@ -1 +1 @@
d3 = {version: "1.25.0"}; // semver
d3 = {version: "1.26.0"}; // semver

Просмотреть файл

@ -5,14 +5,16 @@ d3.layout.force = function() {
size = [1, 1],
alpha,
friction = .9,
distance = 20,
linkDistance = d3_layout_forceLinkDistance,
linkStrength = d3_layout_forceLinkStrength,
charge = -30,
gravity = .1,
theta = .8,
interval,
nodes = [],
links = [],
distances;
distances,
strengths;
function repulse(node, kc) {
return function(quad, x1, y1, x2, y2) {
@ -58,7 +60,7 @@ d3.layout.force = function() {
x = t.x - s.x;
y = t.y - s.y;
if (l = (x * x + y * y)) {
l = alpha * ((l = Math.sqrt(l)) - distance) / l;
l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;
x *= l;
y *= l;
t.x -= x;
@ -128,9 +130,18 @@ d3.layout.force = function() {
return force;
};
force.distance = function(x) {
if (!arguments.length) return distance;
distance = x;
force.linkDistance = function(x) {
if (!arguments.length) return linkDistance;
linkDistance = d3.functor(x);
return force;
};
// For backwards-compatibility.
force.distance = force.linkDistance;
force.linkStrength = function(x) {
if (!arguments.length) return linkStrength;
linkStrength = d3.functor(x);
return force;
};
@ -172,10 +183,14 @@ d3.layout.force = function() {
(o = nodes[i]).index = i;
}
distances = [];
strengths = [];
for (i = 0; i < m; ++i) {
o = links[i];
if (typeof o.source == "number") o.source = nodes[o.source];
if (typeof o.target == "number") o.target = nodes[o.target];
distances[i] = linkDistance.call(this, o, i);
strengths[i] = linkStrength.call(this, o, i);
}
for (i = 0; i < n; ++i) {
@ -249,14 +264,14 @@ d3.layout.force = function() {
// O NOES! The drag element was removed from the DOM.
if (!parent) {
d3_layout_forceDragNode.fixed = false;
d3_layout_forceDragNode = d3_layout_forceDragElement = null;
d3_layout_forceDragOffset = d3_layout_forceDragNode = d3_layout_forceDragElement = null;
return;
}
var m = d3.svg.mouse(parent);
d3_layout_forceDragMoved = true;
d3_layout_forceDragNode.px = m[0];
d3_layout_forceDragNode.py = m[1];
d3_layout_forceDragNode.px = m[0] - d3_layout_forceDragOffset[0];
d3_layout_forceDragNode.py = m[1] - d3_layout_forceDragOffset[1];
force.resume(); // restart annealing
}
@ -272,7 +287,7 @@ d3.layout.force = function() {
dragmove();
d3_layout_forceDragNode.fixed = false;
d3_layout_forceDragNode = d3_layout_forceDragElement = null;
d3_layout_forceDragOffset = d3_layout_forceDragNode = d3_layout_forceDragElement = null;
}
return force;
@ -280,6 +295,7 @@ d3.layout.force = function() {
var d3_layout_forceDragNode,
d3_layout_forceDragMoved,
d3_layout_forceDragOffset,
d3_layout_forceStopClick,
d3_layout_forceDragElement;
@ -294,9 +310,11 @@ function d3_layout_forceDragOut(d) {
}
function d3_layout_forceDragDown(d, i) {
var m = d3.svg.mouse(this.parentNode);
(d3_layout_forceDragNode = d).fixed = true;
d3_layout_forceDragMoved = false;
d3_layout_forceDragElement = this;
d3_layout_forceDragOffset = [m[0] - d.x, m[1] - d.y];
d3_layout_forceCancel();
}
@ -337,3 +355,11 @@ function d3_layout_forceAccumulate(quad) {
quad.cx = cx / quad.count;
quad.cy = cy / quad.count;
}
function d3_layout_forceLinkDistance(link) {
return 20;
}
function d3_layout_forceLinkStrength(link) {
return 1;
}