Skip to content

Commit 5b27271

Browse files
committed
Fix polylinear descending domains or ranges.
Fixes d3#446.
1 parent ad76418 commit 5b27271

4 files changed

Lines changed: 34 additions & 8 deletions

File tree

d3.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2495,15 +2495,21 @@ function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {
24952495
var u = [],
24962496
i = [],
24972497
j = 0,
2498-
n = domain.length;
2498+
k = domain.length - 1;
24992499

2500-
while (++j < n) {
2500+
// Handle descending domains.
2501+
if (domain[k] < domain[0]) {
2502+
domain = domain.slice().reverse();
2503+
range = range.slice().reverse();
2504+
}
2505+
2506+
while (++j <= k) {
25012507
u.push(uninterpolate(domain[j - 1], domain[j]));
25022508
i.push(interpolate(range[j - 1], range[j]));
25032509
}
25042510

25052511
return function(x) {
2506-
var j = d3.bisect(domain, x, 1, domain.length - 1) - 1;
2512+
var j = d3.bisect(domain, x, 1, k) - 1;
25072513
return i[j](u[j](x));
25082514
};
25092515
}

d3.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/scale/polylinear.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,21 @@ function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {
22
var u = [],
33
i = [],
44
j = 0,
5-
n = domain.length;
5+
k = domain.length - 1;
66

7-
while (++j < n) {
7+
// Handle descending domains.
8+
if (domain[k] < domain[0]) {
9+
domain = domain.slice().reverse();
10+
range = range.slice().reverse();
11+
}
12+
13+
while (++j <= k) {
814
u.push(uninterpolate(domain[j - 1], domain[j]));
915
i.push(interpolate(range[j - 1], range[j]));
1016
}
1117

1218
return function(x) {
13-
var j = d3.bisect(domain, x, 1, domain.length - 1) - 1;
19+
var j = d3.bisect(domain, x, 1, k) - 1;
1420
return i[j](u[j](x));
1521
};
1622
}

test/scale/linear-test.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,20 @@ suite.addBatch({
148148
assert.inDelta(x.invert(new Date(1990, 6, 2, 13)), .5, 1e-6);
149149
var x = linear().range(["#000", "#fff"]);
150150
assert.isNaN(x.invert("#999"));
151+
},
152+
"can invert a polylinear descending domain": function(linear) {
153+
var x = linear().domain([4, 2, 1]).range([1, 2, 4]);
154+
assert.inDelta(x(1.5), 3, 1e-6);
155+
assert.inDelta(x(3), 1.5, 1e-6);
156+
assert.inDelta(x.invert(1.5), 3, 1e-6);
157+
assert.inDelta(x.invert(3), 1.5, 1e-6);
158+
},
159+
"can invert a polylinear descending range": function(linear) {
160+
var x = linear().domain([1, 2, 4]).range([4, 2, 1]);
161+
assert.inDelta(x(1.5), 3, 1e-6);
162+
assert.inDelta(x(3), 1.5, 1e-6);
163+
assert.inDelta(x.invert(1.5), 3, 1e-6);
164+
assert.inDelta(x.invert(3), 1.5, 1e-6);
151165
}
152166
},
153167

0 commit comments

Comments
 (0)