Skip to content

Handle streamtube coordinates in string format and handle different data orders in isosurface and volume #4431

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Dec 30, 2019
14 changes: 12 additions & 2 deletions src/traces/isosurface/calc.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,19 @@

var colorscaleCalc = require('../../components/colorscale/calc');
var processGrid = require('../streamtube/calc').processGrid;
var filter = require('../streamtube/calc').filter;

module.exports = function calc(gd, trace) {
trace._len = Math.min(trace.x.length, trace.y.length, trace.z.length, trace.value.length);
trace._len = Math.min(
trace.x.length,
trace.y.length,
trace.z.length,
trace.value.length
);

['value', 'x', 'y', 'z'].forEach(function(e) {
trace['_' + e] = filter(trace[e], trace._len);
});

var grid = processGrid(trace);
trace._gridFill = grid.fill;
Expand All @@ -24,7 +34,7 @@ module.exports = function calc(gd, trace) {
var min = Infinity;
var max = -Infinity;
for(var i = 0; i < trace._len; i++) {
var v = trace.value[i];
var v = trace._value[i];
min = Math.min(min, v);
max = Math.max(max, v);
}
Expand Down
60 changes: 30 additions & 30 deletions src/traces/isosurface/convert.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ proto.handlePick = function(selection) {
if(selection.object === this.mesh) {
var rawId = selection.data.index;

var x = this.data._x[rawId];
var y = this.data._y[rawId];
var z = this.data._z[rawId];
var x = this.data._meshX[rawId];
var y = this.data._meshY[rawId];
var z = this.data._meshZ[rawId];

var height = this.data._Ys.length;
var depth = this.data._Zs.length;
Expand All @@ -60,10 +60,10 @@ proto.handlePick = function(selection) {
var selectIndex = selection.index = k + depth * j + depth * height * i;

selection.traceCoordinate = [
this.data._x[selectIndex],
this.data._y[selectIndex],
this.data._z[selectIndex],
this.data.value[selectIndex]
this.data._meshX[selectIndex],
this.data._meshY[selectIndex],
this.data._meshZ[selectIndex],
this.data._value[selectIndex]
];

var text = this.data.hovertext || this.data.text;
Expand Down Expand Up @@ -91,11 +91,11 @@ proto.update = function(data) {
}

var positions = zip3(
toDataCoords(layout.xaxis, data._x, scene.dataScale[0], data.xcalendar),
toDataCoords(layout.yaxis, data._y, scene.dataScale[1], data.ycalendar),
toDataCoords(layout.zaxis, data._z, scene.dataScale[2], data.zcalendar));
toDataCoords(layout.xaxis, data._meshX, scene.dataScale[0], data.xcalendar),
toDataCoords(layout.yaxis, data._meshY, scene.dataScale[1], data.ycalendar),
toDataCoords(layout.zaxis, data._meshZ, scene.dataScale[2], data.zcalendar));

var cells = zip3(data._i, data._j, data._k);
var cells = zip3(data._meshI, data._meshJ, data._meshK);

var config = {
positions: positions,
Expand All @@ -116,7 +116,7 @@ proto.update = function(data) {
};

var cOpts = extractOpts(data);
config.vertexIntensity = data._intensity;
config.vertexIntensity = data._meshIntensity;
config.vertexIntensityBounds = [cOpts.min, cOpts.max];
config.colormap = parseColorScale(data);

Expand All @@ -132,9 +132,9 @@ proto.dispose = function() {
var GRID_TYPES = ['xyz', 'xzy', 'yxz', 'yzx', 'zxy', 'zyx'];

function generateIsoMeshes(data) {
data._i = [];
data._j = [];
data._k = [];
data._meshI = [];
data._meshJ = [];
data._meshK = [];

var showSurface = data.surface.show;
var showSpaceframe = data.spaceframe.show;
Expand Down Expand Up @@ -228,9 +228,9 @@ function generateIsoMeshes(data) {
}

function addFace(a, b, c) {
data._i.push(a);
data._j.push(b);
data._k.push(c);
data._meshI.push(a);
data._meshJ.push(b);
data._meshK.push(c);
numFaces++;

return numFaces - 1;
Expand Down Expand Up @@ -389,10 +389,10 @@ function generateIsoMeshes(data) {
var index = indecies[q];
xyzv.push(
[
data.x[index],
data.y[index],
data.z[index],
data.value[index]
data._x[index],
data._y[index],
data._z[index],
data._value[index]
]
);
}
Expand Down Expand Up @@ -880,10 +880,10 @@ function generateIsoMeshes(data) {
for(var k = 0; k < depth; k++) {
var index = getIndex(i, j, k);
addVertex(
data.x[index],
data.y[index],
data.z[index],
data.value[index]
data._x[index],
data._y[index],
data._z[index],
data._value[index]
);
}
}
Expand Down Expand Up @@ -1021,10 +1021,10 @@ function generateIsoMeshes(data) {
emptyVertices();
}

data._x = allXs;
data._y = allYs;
data._z = allZs;
data._intensity = allVs;
data._meshX = allXs;
data._meshY = allYs;
data._meshZ = allZs;
data._meshIntensity = allVs;

data._Xs = Xs;
data._Ys = Ys;
Expand Down
39 changes: 20 additions & 19 deletions src/traces/streamtube/calc.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ function calc(gd, trace) {
trace.w.length
);

['u', 'v', 'w', 'x', 'y', 'z'].forEach(function(e) {
trace['_' + e] = filter(trace[e], trace._len);
});

var grid = processGrid(trace);
trace._gridFill = grid.fill;
trace._Xs = grid.Xs;
Expand All @@ -44,9 +48,9 @@ function calc(gd, trace) {
var normMin = Infinity;
var i;
for(i = 0; i < trace._len; i++) {
var u = trace.u[i];
var v = trace.v[i];
var w = trace.w[i];
var u = trace._u[i];
var v = trace._v[i];
var w = trace._w[i];
var norm = Math.sqrt(u * u + v * v + w * w);

normMax = Math.max(normMax, norm);
Expand Down Expand Up @@ -81,9 +85,9 @@ function calc(gd, trace) {
}

function processGrid(trace) {
var x = trace.x;
var y = trace.y;
var z = trace.z;
var x = trace._x;
var y = trace._y;
var z = trace._z;
var len = trace._len;

var i, j, k;
Expand Down Expand Up @@ -141,9 +145,9 @@ function processGrid(trace) {
if(!filledY) gridFill += 'y';
if(!filledZ) gridFill += 'z';

var Xs = distinctVals(trace.x, len);
var Ys = distinctVals(trace.y, len);
var Zs = distinctVals(trace.z, len);
var Xs = distinctVals(trace._x);
var Ys = distinctVals(trace._y);
var Zs = distinctVals(trace._z);

gridFill = gridFill.replace('x', (firstX > lastX ? '-' : '+') + 'x');
gridFill = gridFill.replace('y', (firstY > lastY ? '-' : '+') + 'y');
Expand All @@ -161,7 +165,7 @@ function processGrid(trace) {

var getArray = function(c) { return c === 'x' ? x : c === 'y' ? y : z; };
var getVals = function(c) { return c === 'x' ? Xs : c === 'y' ? Ys : Zs; };
var getDir = function(c) { return lessThan(c[len - 1], c[0]) ? -1 : 1; };
var getDir = function(c) { return c[len - 1] < c[0] ? -1 : 1; };

var arrK = getArray(gridFill[1]);
var arrJ = getArray(gridFill[3]);
Expand Down Expand Up @@ -189,9 +193,9 @@ function processGrid(trace) {
var q100 = getIndex(i + 1, j, k);

if(
!lessThan(arrK[q000] * dirK, arrK[q001] * dirK) ||
!lessThan(arrJ[q000] * dirJ, arrJ[q010] * dirJ) ||
!lessThan(arrI[q000] * dirI, arrI[q100] * dirI)
!(arrK[q000] * dirK < arrK[q001] * dirK) ||
!(arrJ[q000] * dirJ < arrJ[q010] * dirJ) ||
!(arrI[q000] * dirI < arrI[q100] * dirI)
) {
arbitrary = true;
}
Expand Down Expand Up @@ -223,8 +227,8 @@ function processGrid(trace) {
};
}

function distinctVals(col, len) {
return Lib.distinctVals(filter(col, len)).vals;
function distinctVals(col) {
return Lib.distinctVals(col).vals;
}

function filter(arr, len) {
Expand All @@ -240,11 +244,8 @@ function filter(arr, len) {
return values;
}

function lessThan(a, b) {
return +a < +b;
}

module.exports = {
calc: calc,
filter: filter,
processGrid: processGrid
};
6 changes: 3 additions & 3 deletions src/traces/streamtube/convert.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,9 @@ function convert(scene, trace) {
}

tubeOpts.vectors = zip3(
toDataCoords(trace.u, 'xaxis'),
toDataCoords(trace.v, 'yaxis'),
toDataCoords(trace.w, 'zaxis'),
toDataCoords(trace._u, 'xaxis'),
toDataCoords(trace._v, 'yaxis'),
toDataCoords(trace._w, 'zaxis'),
len
);

Expand Down
24 changes: 12 additions & 12 deletions src/traces/volume/convert.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ proto.handlePick = function(selection) {
if(selection.object === this.mesh) {
var rawId = selection.data.index;

var x = this.data._x[rawId];
var y = this.data._y[rawId];
var z = this.data._z[rawId];
var x = this.data._meshX[rawId];
var y = this.data._meshY[rawId];
var z = this.data._meshZ[rawId];

var height = this.data._Ys.length;
var depth = this.data._Zs.length;
Expand All @@ -47,10 +47,10 @@ proto.handlePick = function(selection) {
var selectIndex = selection.index = k + depth * j + depth * height * i;

selection.traceCoordinate = [
this.data._x[selectIndex],
this.data._y[selectIndex],
this.data._z[selectIndex],
this.data.value[selectIndex]
this.data._meshX[selectIndex],
this.data._meshY[selectIndex],
this.data._meshZ[selectIndex],
this.data._value[selectIndex]
];

var text = this.data.hovertext || this.data.text;
Expand Down Expand Up @@ -78,11 +78,11 @@ proto.update = function(data) {
}

var positions = zip3(
toDataCoords(layout.xaxis, data._x, scene.dataScale[0], data.xcalendar),
toDataCoords(layout.yaxis, data._y, scene.dataScale[1], data.ycalendar),
toDataCoords(layout.zaxis, data._z, scene.dataScale[2], data.zcalendar));
toDataCoords(layout.xaxis, data._meshX, scene.dataScale[0], data.xcalendar),
toDataCoords(layout.yaxis, data._meshY, scene.dataScale[1], data.ycalendar),
toDataCoords(layout.zaxis, data._meshZ, scene.dataScale[2], data.zcalendar));

var cells = zip3(data._i, data._j, data._k);
var cells = zip3(data._meshI, data._meshJ, data._meshK);

var config = {
positions: positions,
Expand All @@ -104,7 +104,7 @@ proto.update = function(data) {
};

var cOpts = extractOpts(data);
config.vertexIntensity = data._intensity;
config.vertexIntensity = data._meshIntensity;
config.vertexIntensityBounds = [cOpts.min, cOpts.max];
config.colormap = parseColorScale(data);

Expand Down