diff --git a/README.md b/README.md index 963420f..a7e7232 100644 --- a/README.md +++ b/README.md @@ -247,10 +247,12 @@ Returns a uniform nonrational B-spline interpolator through the specified array ### Piecewise -# d3.piecewise(interpolate, values) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/piecewise.js), [Examples](https://observablehq.com/@d3/d3-piecewise) +# d3.piecewise([interpolate, ]values) · [Source](https://github.com/d3/d3-interpolate/blob/master/src/piecewise.js), [Examples](https://observablehq.com/@d3/d3-piecewise) Returns a piecewise interpolator, composing interpolators for each adjacent pair of *values*. The returned interpolator maps *t* in [0, 1 / (*n* - 1)] to *interpolate*(*values*[0], *values*[1]), *t* in [1 / (*n* - 1), 2 / (*n* - 1)] to *interpolate*(*values*[1], *values*[2]), and so on, where *n* = *values*.length. In effect, this is a lightweight [linear scale](https://github.com/d3/d3-scale/blob/master/README.md#linear-scales). For example, to blend through red, green and blue: ```js var interpolate = d3.piecewise(d3.interpolateRgb.gamma(2.2), ["red", "green", "blue"]); ``` + +If *interpolate* is not specified, defaults to [d3.interpolate](#interpolate). diff --git a/src/piecewise.js b/src/piecewise.js index 41f76ae..8b568c5 100644 --- a/src/piecewise.js +++ b/src/piecewise.js @@ -1,4 +1,7 @@ +import {default as value} from "./value.js"; + export default function piecewise(interpolate, values) { + if (values === undefined) values = interpolate, interpolate = value; var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n); while (i < n) I[i] = interpolate(v, v = values[++i]); return function(t) { diff --git a/test/piecewise-test.js b/test/piecewise-test.js new file mode 100644 index 0000000..5b149d8 --- /dev/null +++ b/test/piecewise-test.js @@ -0,0 +1,38 @@ +var tape = require("tape"), + interpolate = require("../"); + +tape("piecewise(interpolate, values)(t) returns the expected values", function(test) { + var i = interpolate.piecewise(interpolate.interpolate, [0,2,10]); + test.strictEqual(i(-1), -4); + test.strictEqual(i(0), 0); + test.strictEqual(i(0.19), 0.76); + test.strictEqual(i(0.21), 0.84); + test.strictEqual(i(0.5), 2); + test.strictEqual(i(0.75), 6); + test.strictEqual(i(1), 10); + test.end(); +}); + +tape("piecewise(values) uses the default interpolator", function(test) { + var i = interpolate.piecewise([0,2,10]); + test.strictEqual(i(-1), -4); + test.strictEqual(i(0), 0); + test.strictEqual(i(0.19), 0.76); + test.strictEqual(i(0.21), 0.84); + test.strictEqual(i(0.5), 2); + test.strictEqual(i(0.75), 6); + test.strictEqual(i(1), 10); + test.end(); +}); + +tape("piecewise(values) uses the default interpolator/2", function(test) { + var i = interpolate.piecewise(["a0","a2","a10"]); + test.strictEqual(i(-1), "a-4"); + test.strictEqual(i(0), "a0"); + test.strictEqual(i(0.19), "a0.76"); + test.strictEqual(i(0.21), "a0.84"); + test.strictEqual(i(0.5), "a2"); + test.strictEqual(i(0.75), "a6"); + test.strictEqual(i(1), "a10"); + test.end(); +});