Skip to content

Commit d015b57

Browse files
committed
create a reusable process grid function
- computed trace._len and process grid at the start of calc - apply subarray instead of slice for typed arrays - improve streamtube jasmine test
1 parent 942f92f commit d015b57

File tree

3 files changed

+87
-48
lines changed

3 files changed

+87
-48
lines changed

src/traces/streamtube/calc.js

Lines changed: 75 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,22 @@
1111
var Lib = require('../../lib');
1212
var colorscaleCalc = require('../../components/colorscale/calc');
1313

14-
module.exports = function calc(gd, trace) {
15-
var i, j, k;
16-
17-
var u = trace.u;
18-
var v = trace.v;
19-
var w = trace.w;
20-
var x = trace.x;
21-
var y = trace.y;
22-
var z = trace.z;
23-
var len = Math.min(x.length, y.length, z.length, u.length, v.length, w.length);
14+
function calc(gd, trace) {
15+
trace._len = Math.min(
16+
trace.x.length,
17+
trace.y.length,
18+
trace.z.length,
19+
trace.u.length,
20+
trace.v.length,
21+
trace.w.length
22+
);
23+
24+
var grid = processGrid(trace);
25+
trace._gridFill = grid.fill;
26+
trace._Xs = grid.Xs;
27+
trace._Ys = grid.Ys;
28+
trace._Zs = grid.Zs;
29+
trace._len = grid.len;
2430

2531
var slen = 0;
2632
var startx, starty, startz;
@@ -36,12 +42,12 @@ module.exports = function calc(gd, trace) {
3642

3743
var normMax = 0;
3844
var normMin = Infinity;
39-
40-
for(i = 0; i < len; i++) {
41-
var uu = u[i];
42-
var vv = v[i];
43-
var ww = w[i];
44-
var norm = Math.sqrt(uu * uu + vv * vv + ww * ww);
45+
var i;
46+
for(i = 0; i < trace._len; i++) {
47+
var u = trace.u[i];
48+
var v = trace.v[i];
49+
var w = trace.w[i];
50+
var norm = Math.sqrt(u * u + v * v + w * w);
4551

4652
normMax = Math.max(normMax, norm);
4753
normMin = Math.min(normMin, norm);
@@ -53,6 +59,35 @@ module.exports = function calc(gd, trace) {
5359
cLetter: 'c'
5460
});
5561

62+
for(i = 0; i < slen; i++) {
63+
var sx = startx[i];
64+
grid.xMax = Math.max(grid.xMax, sx);
65+
grid.xMin = Math.min(grid.xMin, sx);
66+
67+
var sy = starty[i];
68+
grid.yMax = Math.max(grid.yMax, sy);
69+
grid.yMin = Math.min(grid.yMin, sy);
70+
71+
var sz = startz[i];
72+
grid.zMax = Math.max(grid.zMax, sz);
73+
grid.zMin = Math.min(grid.zMin, sz);
74+
}
75+
76+
trace._slen = slen;
77+
trace._normMax = normMax;
78+
trace._xbnds = [grid.xMin, grid.xMax];
79+
trace._ybnds = [grid.yMin, grid.yMax];
80+
trace._zbnds = [grid.zMin, grid.zMax];
81+
}
82+
83+
function processGrid(trace) {
84+
var x = trace.x;
85+
var y = trace.y;
86+
var z = trace.z;
87+
var len = trace._len;
88+
89+
var i, j, k;
90+
5691
var xMax = -Infinity;
5792
var xMin = Infinity;
5893
var yMax = -Infinity;
@@ -106,9 +141,9 @@ module.exports = function calc(gd, trace) {
106141
if(!filledY) gridFill += 'y';
107142
if(!filledZ) gridFill += 'z';
108143

109-
var Xs = distinctVals(filter(trace.x, len));
110-
var Ys = distinctVals(filter(trace.y, len));
111-
var Zs = distinctVals(filter(trace.z, len));
144+
var Xs = distinctVals(trace.x, len);
145+
var Ys = distinctVals(trace.y, len);
146+
var Zs = distinctVals(trace.z, len);
112147

113148
gridFill = gridFill.replace('x', (firstX > lastX ? '-' : '+') + 'x');
114149
gridFill = gridFill.replace('y', (firstY > lastY ? '-' : '+') + 'y');
@@ -173,41 +208,30 @@ module.exports = function calc(gd, trace) {
173208
empty();
174209
}
175210

176-
for(i = 0; i < slen; i++) {
177-
var sx = startx[i];
178-
xMax = Math.max(xMax, sx);
179-
xMin = Math.min(xMin, sx);
180-
181-
var sy = starty[i];
182-
yMax = Math.max(yMax, sy);
183-
yMin = Math.min(yMin, sy);
184-
185-
var sz = startz[i];
186-
zMax = Math.max(zMax, sz);
187-
zMin = Math.min(zMin, sz);
188-
}
189-
190-
trace._len = len;
191-
trace._slen = slen;
192-
trace._normMax = normMax;
193-
trace._xbnds = [xMin, xMax];
194-
trace._ybnds = [yMin, yMax];
195-
trace._zbnds = [zMin, zMax];
196-
trace._Xs = Xs;
197-
trace._Ys = Ys;
198-
trace._Zs = Zs;
199-
trace._gridFill = gridFill;
200-
};
211+
return {
212+
xMin: xMin,
213+
yMin: yMin,
214+
zMin: zMin,
215+
xMax: xMax,
216+
yMax: yMax,
217+
zMax: zMax,
218+
Xs: Xs,
219+
Ys: Ys,
220+
Zs: Zs,
221+
len: len,
222+
fill: gridFill
223+
};
224+
}
201225

202226
function distinctVals(col) {
203-
return Lib.distinctVals(col).vals;
227+
return Lib.distinctVals(filter(col)).vals;
204228
}
205229

206230
function filter(arr, len) {
207231
if(len === undefined) len = arr.length;
208232

209233
// no need for casting typed arrays to numbers
210-
if(Lib.isTypedArray(arr)) return arr.slice(0, len);
234+
if(Lib.isTypedArray(arr)) return arr.subarray(0, len);
211235

212236
var values = [];
213237
for(var i = 0; i < len; i++) {
@@ -219,3 +243,8 @@ function filter(arr, len) {
219243
function lessThan(a, b) {
220244
return +a < +b;
221245
}
246+
247+
module.exports = {
248+
calc: calc,
249+
processGrid: processGrid
250+
};

src/traces/streamtube/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ module.exports = {
2020
min: 'cmin',
2121
max: 'cmax'
2222
},
23-
calc: require('./calc'),
23+
calc: require('./calc').calc,
2424
plot: require('./convert'),
2525
eventData: function(out, pt) {
2626
out.tubex = out.x;

test/jasmine/tests/streamtube_test.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,8 @@ describe('Test streamtube interactions', function() {
248248

249249
[ // list of directions
250250
'number',
251-
'string'
251+
'string',
252+
'typedArray'
252253
].forEach(function(format) {
253254
[ // list of directions
254255
[-1, -1, -1],
@@ -297,6 +298,15 @@ describe('Test streamtube interactions', function() {
297298
}
298299
}
299300

301+
if(format === 'typedArray') {
302+
u = new Int16Array(u);
303+
v = new Int32Array(v);
304+
w = new Int32Array(w);
305+
x = new Float32Array(x);
306+
y = new Float32Array(y);
307+
z = new Float64Array(z);
308+
}
309+
300310
var fig = {
301311
data: [{
302312
type: 'streamtube',

0 commit comments

Comments
 (0)