Skip to content

Commit d20b2c4

Browse files
FedericoNegrifinetjul
authored andcommitted
fix(dataarray): add loop to find to first non NaN value
1 parent 227e5d9 commit d20b2c4

File tree

2 files changed

+51
-7
lines changed

2 files changed

+51
-7
lines changed

Sources/Common/Core/DataArray/index.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,16 @@ function fastComputeRange(arr, offset, numberOfComponents) {
1818
let x;
1919
let i;
2020

21+
// find first non-NaN value
2122
for (i = offset; i < len; i += numberOfComponents) {
23+
if (!Number.isNaN(arr[i])) {
24+
min = arr[i];
25+
max = min;
26+
break;
27+
}
28+
}
29+
30+
for (; i < len; i += numberOfComponents) {
2231
x = arr[i];
2332
if (x < min) {
2433
min = x;

Sources/Common/Core/DataArray/test/testDataArray.js

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ test('Test vtkDataArray getRange function with single-channel data.', (t) => {
3131
});
3232

3333
test('Test vtkDataArray getRange function with NaN values.', (t) => {
34-
// a data array with a NaN value
34+
// a data array with a NaN value and max as first value
3535
const da = vtkDataArray.newInstance({
3636
numberOfComponents: 1,
37-
values: new Float64Array([2.0, 0, NaN, 3.0, 4.0, 1.0]),
37+
values: new Float64Array([4.0, 0, NaN, 3.0, 2.0, 1.0]),
3838
});
3939

4040
t.equal(da.getRange(0)[0], 0.0, 'getRange minimum value should be 0');
@@ -66,29 +66,64 @@ test('Test vtkDataArray getRange function with NaN values.', (t) => {
6666
'getRange maximum value should be -MAX_VALUE'
6767
);
6868

69-
// a data array with multiple components
69+
// a data array with all NaN values except one in the middle
7070
const da4 = vtkDataArray.newInstance({
71+
numberOfComponents: 1,
72+
values: new Float64Array([NaN, NaN, 2.0, NaN]),
73+
});
74+
75+
t.equal(da4.getRange(0)[0], 2.0, 'getRange minimum value should be 2');
76+
t.equal(da4.getRange(0)[1], 2.0, 'getRange maximum value should be 2');
77+
78+
// a data array with all NaN values except one at the end
79+
const da5 = vtkDataArray.newInstance({
80+
numberOfComponents: 1,
81+
values: new Float64Array([NaN, NaN, 2.0]),
82+
});
83+
84+
t.equal(da5.getRange(0)[0], 2.0, 'getRange minimum value should be 2');
85+
t.equal(da5.getRange(0)[1], 2.0, 'getRange maximum value should be 2');
86+
87+
// a data array with all NaN values
88+
const da6 = vtkDataArray.newInstance({
89+
numberOfComponents: 1,
90+
values: new Float64Array([NaN, NaN, NaN]),
91+
});
92+
93+
t.equal(
94+
da6.getRange(0)[0],
95+
Number.MAX_VALUE,
96+
'getRange minimum value should be MAX_VALUE'
97+
);
98+
t.equal(
99+
da6.getRange(0)[1],
100+
-Number.MAX_VALUE,
101+
'getRange maximum value should be -MAX_VALUE'
102+
);
103+
104+
// a data array with multiple components
105+
const da7 = vtkDataArray.newInstance({
71106
numberOfComponents: 2,
72107
values: new Float64Array([NaN, 1.0, 2.0, 3.0, 5.0, NaN]),
73108
});
74109

75110
t.equal(
76-
da4.getRange(0)[0],
111+
da7.getRange(0)[0],
77112
2.0,
78113
'component:0 getRange minimum value should be 2'
79114
);
80115
t.equal(
81-
da4.getRange(0)[1],
116+
da7.getRange(0)[1],
82117
5.0,
83118
'component:0 getRange maximum value should be 5'
84119
);
85120
t.equal(
86-
da4.getRange(1)[0],
121+
da7.getRange(1)[0],
87122
1.0,
88123
'component:1 getRange minimum value should be 1'
89124
);
90125
t.equal(
91-
da4.getRange(1)[1],
126+
da7.getRange(1)[1],
92127
3.0,
93128
'component:1 getRange maximum value should be 3'
94129
);

0 commit comments

Comments
 (0)