Skip to content

Commit ce290ae

Browse files
committed
Fix tons of interpolation bugs
1 parent 2016ae2 commit ce290ae

File tree

6 files changed

+183
-110
lines changed

6 files changed

+183
-110
lines changed

src/traces/carpet/calc.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ var map2dArray = require('./map_2d_array');
1717
var createSplineEvaluator = require('./create_spline_evaluator');
1818
var setConvert = require('./set_convert');
1919
var calcGridlines = require('./calc_gridlines');
20+
var calcLabels = require('./calc_labels');
2021

2122
module.exports = function calc(gd, trace) {
2223
var xa = Axes.getFromId(gd, trace.xaxis || 'x'),
@@ -66,8 +67,11 @@ module.exports = function calc(gd, trace) {
6667
// Create conversions from one coordinate system to another:
6768
setConvert(trace, xa, ya);
6869

69-
calcGridlines(trace, 'a', 'b', xa, ya);
70-
calcGridlines(trace, 'b', 'a', xa, ya);
70+
calcGridlines(trace, 'a', 'b');
71+
calcGridlines(trace, 'b', 'a');
72+
73+
calcLabels(trace, aax);
74+
calcLabels(trace, bax);
7175

7276
return [{
7377
x: x,

src/traces/carpet/calc_gridlines.js

+87-39
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ var map1dArray = require('./map_1d_array');
2121
var makepath = require('./makepath');
2222
var extendFlat = require('../../lib/extend').extendFlat;
2323

24-
module.exports = function calcGridlines (trace, axisLetter, crossAxisLetter, xaxis, yaxis) {
24+
module.exports = function calcGridlines (trace, axisLetter, crossAxisLetter) {
2525
var i, j, gridline, j0, i0;
2626

2727
var data = trace[axisLetter];
@@ -53,11 +53,24 @@ module.exports = function calcGridlines (trace, axisLetter, crossAxisLetter, xax
5353
var j, j0, tj, pxy, i0, ti, xy, dxydi0, dxydi1, i, dxydj0, dxydj1;
5454
var xpoints = [];
5555
var ypoints = [];
56+
var ret = {};
5657
// Search for the fractional grid index giving this line:
5758
if (axisLetter === 'b') {
5859
j = trace.b2j(value);
5960
j0 = Math.floor(Math.max(0, Math.min(nb - 2, j)));
6061
tj = j - j0;
62+
ret.length = nb;
63+
ret.crossLength = na;
64+
65+
ret.xy = function (i) {
66+
var i0 = Math.max(0, Math.min(crossData.length - 2, Math.floor(i)));
67+
var ti = i - i0;
68+
return trace._evalxy([], i0, j0, ti, tj);
69+
}
70+
71+
ret.dxy = function (i0, ti) {
72+
return trace.dxydi([], i0, j0, ti, tj);
73+
};
6174

6275
for (var i = 0; i < na; i++) {
6376
i0 = Math.min(na - 2, i);
@@ -85,6 +98,18 @@ module.exports = function calcGridlines (trace, axisLetter, crossAxisLetter, xax
8598
i = trace.a2i(value);
8699
i0 = Math.floor(Math.max(0, Math.min(na - 2, i)));
87100
ti = i - i0;
101+
ret.length = na;
102+
ret.crossLength = nb;
103+
104+
ret.xy = function (j) {
105+
var j0 = Math.max(0, Math.min(crossData.length - 2, Math.floor(j)));
106+
var tj = j - j0;
107+
return trace._evalxy([], i0, j0, ti, tj);
108+
}
109+
110+
ret.dxy = function (j0, tj) {
111+
return trace.dxydj([], i0, j0, ti, tj);
112+
};
88113

89114
for (var j = 0; j < nb; j++) {
90115
j0 = Math.min(nb - 2, j);
@@ -110,61 +135,84 @@ module.exports = function calcGridlines (trace, axisLetter, crossAxisLetter, xax
110135
}
111136
}
112137

113-
return {
114-
axisLetter: axisLetter,
115-
axis: trace[axisLetter + 'axis'],
116-
value: value,
117-
constvar: crossAxisLetter,
118-
index: n,
119-
x: xpoints,
120-
y: ypoints,
121-
//dxy_0: dxy_0,
122-
//dxy_1: dxy_1,
123-
smoothing: crossAxis.smoothing,
124-
};
138+
ret.axisLetter = axisLetter;
139+
ret.axis = axis;
140+
ret.crossAxis = crossAxis;
141+
ret.value = value;
142+
ret.constvar = crossAxisLetter;
143+
ret.index = n;
144+
ret.x = xpoints;
145+
ret.y = ypoints;
146+
ret.smoothing = crossAxis.smoothing;
147+
148+
return ret;
125149
}
126150

127-
function constructArrayGridline (j) {
128-
var dxy_0, dxy_1;
151+
function constructArrayGridline (idx) {
129152
var xpoints = [];
130153
var ypoints = [];
154+
var ret = {};
155+
ret.length = data.length;
156+
ret.crossLength = crossData.length;
131157

132158
if (axisLetter === 'b') {
159+
var j0 = Math.max(0, Math.min(nb - 2, idx));
160+
var tj = Math.min(1, Math.max(0, idx - j0));
161+
162+
ret.xy = function (i) {
163+
var i0 = Math.max(0, Math.min(na - 2, Math.floor(i)));
164+
var ti = Math.min(1, Math.max(0, i - i0));
165+
return trace._evalxy([], i0, j0, ti, tj);
166+
};
167+
168+
ret.dxy = function (i) {
169+
var i0 = Math.max(0, Math.min(na - 2, Math.floor(i)));
170+
var ti = Math.min(1, Math.max(0, i - i0));
171+
return trace.dxydi([], i0, j0, ti, tj);
172+
};
173+
133174
// In the tickmode: array case, this operation is a simple
134175
// transfer of data:
135176
for (i = 0; i < nea; i++) {
136-
xpoints[i] = xcp[i][j * stride];
137-
ypoints[i] = ycp[i][j * stride];
177+
xpoints[i] = xcp[i][idx * stride];
178+
ypoints[i] = ycp[i][idx * stride];
138179
}
139-
140-
j0 = Math.min(j, nb - 2);
141-
dxy_0 = trace.dxydi(null, 0, j0, 0, j - j0);
142-
dxy_1 = trace.dxydi(null, na - 2, j0, 1, j - j0);
143180
} else {
181+
var i0 = Math.max(0, Math.min(na - 2, idx));
182+
var ti = Math.min(1, Math.max(0, idx - i0));
183+
184+
ret.xy = function (j) {
185+
var j0 = Math.max(0, Math.min(nb - 2, Math.floor(j)));
186+
var tj = Math.min(1, Math.max(0, j - j0));
187+
return trace._evalxy([], i0, j0, ti, tj);
188+
}
189+
190+
191+
ret.dxy = function (j) {
192+
var j0 = Math.max(0, Math.min(nb - 2, Math.floor(j)));
193+
var tj = Math.min(1, Math.max(0, j - j0));
194+
return trace.dxydj([], i0, j0, ti, tj);
195+
};
196+
144197
// In the tickmode: array case, this operation is a simple
145198
// transfer of data:
146199
for (i = 0; i < neb; i++) {
147-
xpoints[i] = xcp[j * stride][i];
148-
ypoints[i] = ycp[j * stride][i];
200+
xpoints[i] = xcp[idx * stride][i];
201+
ypoints[i] = ycp[idx * stride][i];
149202
}
150-
151-
i0 = Math.min(i, na - 2);
152-
dxy_0 = trace.dxydj(null, i0, 0, i - i0, 0);
153-
dxy_1 = trace.dxydj(null, i0, nb - 2, i - i0, 1);
154203
}
155204

156-
return {
157-
axisLetter: axisLetter,
158-
axis: trace[axisLetter + 'axis'],
159-
value: data[j],
160-
constvar: crossAxisLetter,
161-
index: j,
162-
x: xpoints,
163-
y: ypoints,
164-
dxy_0: dxy_0,
165-
dxy_1: dxy_1,
166-
smoothing: crossAxis.smoothing,
167-
};
205+
ret.axisLetter = axisLetter;
206+
ret.axis = axis;
207+
ret.crossAxis = crossAxis;
208+
ret.value = data[idx];
209+
ret.constvar = crossAxisLetter;
210+
ret.index = idx;
211+
ret.x = xpoints;
212+
ret.y = ypoints;
213+
ret.smoothing = crossAxis.smoothing;
214+
215+
return ret;
168216
};
169217

170218

src/traces/carpet/calc_labels.js

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/**
2+
* Copyright 2012-2016, Plotly, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the MIT license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
'use strict';
10+
11+
var Axes = require('../../plots/cartesian/axes');
12+
var cheaterBasis = require('./cheater_basis');
13+
var arrayMinmax = require('./array_minmax');
14+
var search = require('../../lib/search').findBin;
15+
var computeControlPoints = require('./compute_control_points');
16+
var map2dArray = require('./map_2d_array');
17+
var createSplineEvaluator = require('./create_spline_evaluator');
18+
var setConvert = require('./set_convert');
19+
var map2dArray = require('./map_2d_array');
20+
var map1dArray = require('./map_1d_array');
21+
var makepath = require('./makepath');
22+
var extendFlat = require('../../lib/extend').extendFlat;
23+
24+
function normalize (x) {
25+
var x
26+
}
27+
28+
module.exports = function calcLabels (trace, axis) {
29+
var i;
30+
31+
var labels = axis._labels = [];
32+
var gridlines = axis._gridlines;
33+
34+
for (i = 0; i < gridlines.length; i++) {
35+
var gridline = gridlines[i];
36+
37+
labels.push({
38+
text: gridline.value.toFixed(3),
39+
endAnchor: true,
40+
xy: gridline.xy(0),
41+
dxy: gridline.dxy(0, 0),
42+
axis: gridline.axis,
43+
length: gridline.crossAxis.length
44+
});
45+
46+
labels.push({
47+
text: gridline.value.toFixed(3),
48+
endAnchor: false,
49+
xy: gridline.xy(gridline.crossLength - 1),
50+
dxy: gridline.dxy(gridline.crossLength - 2, 1),
51+
axis: gridline.axis,
52+
length: gridline.crossAxis.length
53+
});
54+
}
55+
};

src/traces/carpet/create_j_derivative_evaluator.js

+13-5
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,18 @@ module.exports = function (arrays, asmoothing, bsmoothing) {
6161
var ov = 1 - v;
6262
for (k = 0; k < arrays.length; k++) {
6363
ak = arrays[k];
64-
f0 = 3 * ((u2 - 1) * ak[i0][j0 ] + ou2 * ak[i0][j0 ] + u * (2 - 3 * u) * ak[i0][j0 ] + u2 * ak[i0][j0 ]);
65-
f1 = 3 * ((u2 - 1) * ak[i0][j0 + 1] + ou2 * ak[i0][j0 + 1] + u * (2 - 3 * u) * ak[i0][j0 + 1] + u2 * ak[i0][j0 + 1]);
6664

67-
out[k] = ov * f0 + v * f1;
65+
f0 = ak[i0 ][j0 + 1] - ak[i0 ][j0];
66+
f1 = ak[i0 + 1][j0 + 1] - ak[i0 + 1][j0];
67+
f2 = ak[i0 + 2][j0 + 1] - ak[i0 + 2][j0];
68+
f3 = ak[i0 + 3][j0 + 1] - ak[i0 + 3][j0];
69+
70+
out[k] = ou3 * f0 + 3 * (ou2 * u * f1 + ou * u2 * f2) + u3 * f3;
71+
72+
// mathematically equivalent:
73+
//f0 = ou3 * ak[i0][j0 ] + 3 * (ou2 * u * ak[i0 + 1][j0 ] + ou * u2 * ak[i0 + 2][j0 ]) + u3 * ak[i0 + 3][j0 ];
74+
//f1 = ou3 * ak[i0][j0 + 1] + 3 * (ou2 * u * ak[i0 + 1][j0 + 1] + ou * u2 * ak[i0 + 2][j0 + 1]) + u3 * ak[i0 + 3][j0 + 1];
75+
//out[k] = f1 - f0;
6876
}
6977
return out;
7078
};
@@ -95,8 +103,8 @@ module.exports = function (arrays, asmoothing, bsmoothing) {
95103
var ov = 1 - v;
96104
for (k = 0; k < arrays.length; k++) {
97105
ak = arrays[k];
98-
f0 = ak[i0 + 1][j0] - ak[i0][j0];
99-
f1 = ak[i0 + 1][j0 + 1] - ak[i0][j0 + 1];
106+
f0 = ak[i0][j0 + 1] - ak[i0][j0];
107+
f1 = ak[i0 + 1][j0 + 1] - ak[i0 + 1][j0];
100108

101109
out[k] = ov * f0 + v * f1;
102110
}

0 commit comments

Comments
 (0)