4
<title>Force-Directed Layout (Dynamic)</title>
5
<script type="text/javascript" src="../../d3.v2.js"></script>
6
<style type="text/css">
29
<div id="chart"></div>
30
<script type="text/javascript">
34
fill = d3.scale.category20(),
38
var vis = d3.select("#chart").append("svg")
46
var force = d3.layout.force()
52
var cursor = vis.append("circle")
54
.attr("transform", "translate(-100,-100)")
55
.attr("class", "cursor");
57
force.on("tick", function() {
58
vis.selectAll("line.link")
59
.attr("x1", function(d) { return d.source.x; })
60
.attr("y1", function(d) { return d.source.y; })
61
.attr("x2", function(d) { return d.target.x; })
62
.attr("y2", function(d) { return d.target.y; });
64
vis.selectAll("circle.node")
65
.attr("cx", function(d) { return d.x; })
66
.attr("cy", function(d) { return d.y; });
69
vis.on("mousemove", function() {
70
cursor.attr("transform", "translate(" + d3.mouse(this) + ")");
73
vis.on("mousedown", function() {
74
var point = d3.mouse(this),
75
node = {x: point[0], y: point[1]},
78
// add links to any nearby nodes
79
nodes.forEach(function(target) {
80
var x = target.x - node.x,
81
y = target.y - node.y;
82
if (Math.sqrt(x * x + y * y) < 30) {
83
links.push({source: node, target: target});
95
vis.selectAll("line.link")
97
.enter().insert("line", "circle.node")
98
.attr("class", "link")
99
.attr("x1", function(d) { return d.source.x; })
100
.attr("y1", function(d) { return d.source.y; })
101
.attr("x2", function(d) { return d.target.x; })
102
.attr("y2", function(d) { return d.target.y; });
104
vis.selectAll("circle.node")
106
.enter().insert("circle", "circle.cursor")
107
.attr("class", "node")
108
.attr("cx", function(d) { return d.x; })
109
.attr("cy", function(d) { return d.y; })