Skip to content

Instantly share code, notes, and snippets.

@valex
Created November 8, 2017 21:47
Show Gist options
  • Save valex/1c6f648d0b035c6b2f2269c56d64e696 to your computer and use it in GitHub Desktop.
Save valex/1c6f648d0b035c6b2f2269c56d64e696 to your computer and use it in GitHub Desktop.
Curve interpolation comparison, d3.js version 4
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script src="http://d3js.org/d3.v4.min.js"></script>
<script src="https://d3js.org/d3-selection-multi.v1.min.js"></script>
<form>
<select id="interpolations"></select>
<select id="tensions"></select>
<br />
<svg id="graph"></svg>
</form>
<script>
var width = 400, height = 200, margin = 10;
var numpoints = 8;
var sine = d3.range(0, numpoints + 1).map(
function(i) {
return [
(2.0 / numpoints) * i * Math.PI,
Math.sin((2.0 / numpoints) * i * Math.PI)
];
});
var xScale = d3.scaleLinear()
.domain(d3.extent(sine, function(d) {
return d[0];
}))
.range([0, width - margin * 2]);
var yScale = d3.scaleLinear()
.domain([-1, 1])
.range([height - margin, 0]);
var interpolations = [
"d3.curveLinear",
"d3.curveLinearClosed",
"d3.curveStep",
"d3.curveStepBefore",
"d3.curveStepAfter",
"d3.curveBasis",
"d3.curveBasisOpen",
"d3.curveBasisClosed",
"d3.curveCardinal",
"d3.curveCardinalOpen",
"d3.curveCardinalClosed",
"d3.curveMonotoneX",
"d3.curveBundle",
"d3.curveCardinal",
"d3.curveCardinalClosed",
"d3.curveCardinalOpen",
];
d3.select("#interpolations")
.on("change", redraw)
.selectAll("option")
.data(interpolations)
.enter().append("option")
.attr("value", function(d) { return d; })
.text(function(d) { return d; });
var tensions = [1.0, 0.75, 0.5, 0.25, 0.0];
d3.select("#tensions")
.on("change", redraw)
.selectAll("option")
.data(tensions)
.enter().append("option")
.attr("value", function(d) { return d; })
.text(function(d) { return d; });
var svg = d3.select('body')
.append('svg')
.attr('width', width + 2 * margin)
.attr('height', height + 2 * margin);
var graphGroup = svg.append('g')
.attr('transform', 'translate(' + margin + ', ' +
margin + ')');
redraw();
function redraw() {
var interpolationSel = document.getElementById('interpolations');
var interpolation = interpolationSel.options[
interpolationSel.selectedIndex].value;
graphGroup.selectAll('path').remove();
var line = d3.line()
.x(function(d) { return xScale(d[0]); })
.y(function(d) { return yScale(d[1]); });
switch(interpolation){
case 'd3.curveBundle':
var tensionsSel = document.getElementById('tensions');
var tension = tensionsSel.options[
tensionsSel.selectedIndex].value;
line.curve(eval(interpolation).beta(tension));
break;
case "d3.curveCardinal":
case "d3.curveCardinalClosed":
case "d3.curveCardinalOpen":
var tensionsSel = document.getElementById('tensions');
var tension = tensionsSel.options[
tensionsSel.selectedIndex].value;
line.curve(eval(interpolation).tension(tension));
break;
default:
line.curve(eval(interpolation));
break;
}
graphGroup.append('path')
.datum(sine)
.attrs({
d: line,
stroke: 'steelblue',
'stroke-width': 2,
fill: 'none'
});
graphGroup.append("g").selectAll("circle")
.data(sine).enter().append("circle")
.attrs({
fill: '#fff',
stroke: 'steelblue',
cx: function(d) { return xScale(d[0]); },
cy: function(d) { return yScale(d[1]); },
r: 4.5
});
}
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment