Skip to content

Commit 3564c02

Browse files
committed
fix(DataArray): Add magnitude range computation
1 parent 2deb74a commit 3564c02

File tree

1 file changed

+44
-16
lines changed

1 file changed

+44
-16
lines changed

Sources/Common/Core/DataArray/index.js

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,61 @@ import macro from 'vtk.js/Sources/macro';
22
import Constants from 'vtk.js/Sources/Common/Core/DataArray/Constants';
33

44
const { DefaultDataType } = Constants;
5-
const { vtkErrorMacro } = macro;
65
const TUPLE_HOLDER = [];
76

87
// ----------------------------------------------------------------------------
98
// Global methods
109
// ----------------------------------------------------------------------------
1110

12-
function computeRange(values, component = 0, tuple = 1) {
13-
const range = { min: Number.MAX_VALUE, max: -Number.MAX_VALUE };
11+
function createRangeHelper() {
12+
let min = Number.MAX_VALUE;
13+
let max = -Number.MAX_VALUE;
14+
let count = 0;
15+
let sum = 0;
16+
17+
return {
18+
add(value) {
19+
if (min > value) {
20+
min = value;
21+
}
22+
if (max < value) {
23+
max = value;
24+
}
25+
count++;
26+
sum += value;
27+
},
28+
get() {
29+
return { min, max, count, sum, mean: sum / count };
30+
},
31+
getRange() {
32+
return { min, max };
33+
},
34+
};
35+
}
36+
37+
function computeRange(values, component = 0, numberOfComponents = 1) {
38+
const helper = createRangeHelper();
39+
const size = values.length;
40+
let value = 0;
1441

1542
if (component < 0) {
1643
// Compute magnitude
17-
vtkErrorMacro('vtkDataArray: Compute magnitude - NOT IMPLEMENTED');
18-
return range;
44+
for (let i = 0; i < size; i += numberOfComponents) {
45+
value = 0;
46+
for (let j = 0; j < numberOfComponents; j++) {
47+
value += values[i + j] * values[i + j];
48+
}
49+
value **= 0.5;
50+
helper.add(value);
51+
}
52+
return helper.getRange();
1953
}
2054

21-
const size = values.length;
22-
for (let i = component; i < size; i += tuple) {
23-
const value = values[i];
24-
if (range.min > value) {
25-
range.min = value;
26-
}
27-
if (range.max < value) {
28-
range.max = value;
29-
}
55+
for (let i = component; i < size; i += numberOfComponents) {
56+
helper.add(values[i]);
3057
}
3158

32-
return range;
59+
return helper.getRange();
3360
}
3461

3562
function ensureRangeSize(rangeArray, size = 0) {
@@ -55,6 +82,7 @@ function getDataType(typedArray) {
5582
export const STATIC = {
5683
computeRange,
5784
getDataType,
85+
createRangeHelper,
5886
};
5987

6088
// ----------------------------------------------------------------------------
@@ -93,7 +121,7 @@ function vtkDataArray(publicAPI, model) {
93121

94122
publicAPI.getData = () => model.values;
95123

96-
publicAPI.getRange = (componentIndex = 0) => {
124+
publicAPI.getRange = (componentIndex = -1) => {
97125
const rangeIdx =
98126
componentIndex < 0 ? model.numberOfComponents : componentIndex;
99127
let range = null;

0 commit comments

Comments
 (0)