source: Dev/trunk/d3/examples/spline/spline.js @ 76

Last change on this file since 76 was 76, checked in by fpvanagthoven, 14 years ago

d3

File size: 2.5 KB
RevLine 
[76]1var w = 960,
2    h = 500,
3    line = d3.svg.line(),
4    points = d3.range(1, 5).map(function(i) { return [i * w / 5, 50 + Math.random() * (h - 100)]; }),
5    dragged = null,
6    selected = points[0];
7
8var vis = d3.select("#chart").append("svg:svg")
9    .attr("width", w)
10    .attr("height", h);
11
12vis.append("svg:rect")
13    .attr("width", w)
14    .attr("height", h)
15    .on("mousedown", function() {
16      points.push(selected = dragged = d3.svg.mouse(vis.node()));
17      update();
18    });
19
20vis.append("svg:path")
21    .data([points])
22    .attr("class", "line")
23    .call(update);
24
25d3.select(window)
26    .on("mousemove", mousemove)
27    .on("mouseup", mouseup)
28    .on("keydown", keydown);
29
30// Add interpolator dropdown
31d3.select("#interpolate")
32    .on("change", function() {
33      line.interpolate(this.value);
34      update();
35    })
36  .selectAll("option")
37    .data([
38      "linear",
39      "step-before",
40      "step-after",
41      "basis",
42      "basis-open",
43      "basis-closed",
44      "cardinal",
45      "cardinal-open",
46      "cardinal-closed",
47      "monotone"
48    ])
49  .enter().append("option")
50    .attr("value", String)
51    .text(String);
52
53function update() {
54  vis.select("path").attr("d", line);
55
56  var circle = vis.selectAll("circle")
57      .data(points, function(d) { return d; });
58
59  circle.enter().append("svg:circle")
60      .attr("class", function(d) { return d === selected ? "selected" : null; })
61      .attr("cx", function(d) { return d[0]; })
62      .attr("cy", function(d) { return d[1]; })
63      .attr("r", 1e-6)
64      .on("mousedown", function(d) {
65        selected = dragged = d;
66        update();
67      })
68    .transition()
69      .duration(750)
70      .ease("elastic")
71      .attr("r", 6.5);
72
73  circle
74      .attr("class", function(d) { return d === selected ? "selected" : null; })
75      .attr("cx", function(d) { return d[0]; })
76      .attr("cy", function(d) { return d[1]; });
77
78  circle.exit().remove();
79
80  if (d3.event) {
81    d3.event.preventDefault();
82    d3.event.stopPropagation();
83  }
84}
85
86
87function mousemove() {
88  if (!dragged) return;
89  var m = d3.svg.mouse(vis.node());
90  dragged[0] = Math.max(0, Math.min(w, m[0]));
91  dragged[1] = Math.max(0, Math.min(h, m[1]));
92  update();
93}
94
95function mouseup() {
96  if (!dragged) return;
97  mousemove();
98  dragged = null;
99}
100
101function keydown() {
102  if (!selected) return;
103  switch (d3.event.keyCode) {
104    case 8: // backspace
105    case 46: { // delete
106      var i = points.indexOf(selected);
107      points.splice(i, 1);
108      selected = points.length ? points[i > 0 ? i - 1 : 0] : null;
109      update();
110      break;
111    }
112  }
113}
Note: See TracBrowser for help on using the repository browser.