| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.lttb = void 0;
- /**
- * Sample data with lttb(Largest-Triangle-Three-Buckets) algo (https://github.com/pingec/downsample-lttb).
- * Return the sampled index array.
- */
- function lttb(I, X, Y, thresholds) {
- const length = I.length;
- if (thresholds >= length || thresholds === 0) {
- return I;
- }
- const x = (i) => X[I[i]] * 1;
- const y = (i) => Y[I[i]] * 1;
- const sampled = [];
- // Bucket size. Leave room for start and end data points.
- const every = (length - 2) / (thresholds - 2);
- let a = 0; // Initially a is the first point in the triangle.
- let maxArea;
- let area;
- let nextA;
- sampled.push(a); // Always add the first point.
- for (let i = 0; i < thresholds - 2; i++) {
- // Calculate point average for next bucket (containing c).
- let avgX = 0;
- let avgY = 0;
- let start = Math.floor((i + 1) * every) + 1;
- let end = Math.floor((i + 2) * every) + 1;
- end = Math.min(end, length);
- const size = end - start;
- for (; start < end; start++) {
- avgX += x(start);
- avgY += y(start);
- }
- avgX /= size;
- avgY /= size;
- // Get the range for this bucket.
- let frameStart = Math.floor((i + 0) * every) + 1;
- const frameEnd = Math.floor((i + 1) * every) + 1;
- // Point a.
- const pointA = [x(a), y(a)];
- maxArea = area = -1;
- for (; frameStart < frameEnd; frameStart++) {
- // Calculate triangle area over three buckets.
- area =
- Math.abs((pointA[0] - avgX) * (x(frameStart) - pointA[1]) -
- (pointA[0] - y(frameStart)) * (avgY - pointA[0])) * 0.5;
- if (area > maxArea) {
- maxArea = area;
- nextA = frameStart; // Next a is this b.
- }
- }
- sampled.push(nextA); // Pick this point from the bucket.
- a = nextA; // This a is the next a (chosen b).
- }
- sampled.push(length - 1); // Always add last.
- return sampled.map((a) => I[a]);
- }
- exports.lttb = lttb;
- //# sourceMappingURL=lttb.js.map
|