array-xy-max-merge
Version:
Merge abscissa values on similar ordinates and keeps the abscissa with bigger ordinate value
44 lines (39 loc) • 1.31 kB
JavaScript
/**
* Merge abscissas values on similar ordinates and weight the group of abscissas
* @param {object} points
* @param {Array<number>} points.x - sorted abscissas values
* @param {Array<number>} points.y - ordinates values
* @param {object} [options]
* @param {number} [options.groupWidth = 0.001] - window for abscissas to merge
* @return {{x: Array<number>, y: Array<number>}}
*/
export default function (points, options = {}) {
const {x, y} = points;
const {
groupWidth = 0.001
} = options;
var merged = {x: [], y: []};
var maxAbscissa = {x: [], y: []};
var size = 0;
var index = 0;
while (index < x.length) {
if ((size === 0) || (x[index] - merged.x[size - 1] > groupWidth)) {
maxAbscissa.x.push(x[index]);
maxAbscissa.y.push(y[index]);
merged.x.push(x[index]);
merged.y.push(y[index]);
index++;
size++;
} else {
if (y[index] > maxAbscissa.y[size - 1]) {
maxAbscissa.x[size - 1] = x[index];
maxAbscissa.y[size - 1] = y[index];
}
merged.x[size - 1] = x[index];
merged.y[size - 1] += y[index];
index++;
}
}
merged.x = maxAbscissa.x.slice();
return merged;
}