@@ -2,7 +2,7 @@ import { DataPoint, NormalizedDataPoint } from "../types";
22import { normalizeDataPoints , calculateTriangleArea , calculateAverageDataPoint } from "../utils" ;
33
44// Largest triangle three buckets data downsampling algorithm implementation
5- export default function LTTB ( data : DataPoint [ ] , desiredLength : number ) : DataPoint [ ] {
5+ export default function LTTB < T extends DataPoint > ( data : T [ ] , desiredLength : number ) : T [ ] {
66 if ( desiredLength < 0 ) {
77 throw new Error ( `Supplied negative desiredLength parameter to LTTB: ${ desiredLength } ` ) ;
88 }
@@ -16,10 +16,9 @@ export default function LTTB(data: DataPoint[], desiredLength: number): DataPoin
1616 //
1717 // - length is [2, Infinity)
1818 // - threshold is (length, Inifnity)
19- const sampledLength : number = desiredLength - 2 ;
2019 const bucketSize : number = Math . ceil ( length / desiredLength ) ;
2120 const normalizedData : NormalizedDataPoint [ ] = normalizeDataPoints ( data ) ;
22- const sampledData : DataPoint [ ] = [ data [ 0 ] ] ;
21+ const sampledData : T [ ] = [ data [ 0 ] ] ;
2322
2423 let lastSelectedDataPoint : NormalizedDataPoint = normalizedData [ 0 ] ;
2524 for ( let bucket : number = 1 ; bucket < desiredLength - 1 ; bucket ++ ) {
@@ -49,55 +48,4 @@ export default function LTTB(data: DataPoint[], desiredLength: number): DataPoin
4948 sampledData . push ( data [ length - 1 ] ) ;
5049
5150 return sampledData ;
52-
53-
54-
55-
56-
57-
58-
59- let a : number = 0 ;
60- const sampled : DataPoint [ ] = [ data [ 0 ] ] ;
61- for ( let i : number = 0 ; i < sampledLength ; i ++ ) {
62- const averageXStartIndex : number = Math . floor ( ( i + 1 ) * bucketSize ) + 1 ;
63- const averageXEndIndex : number = Math . min ( length , Math . floor ( ( i + 2 ) * bucketSize ) + 1 ) ;
64-
65- let averageX : number = 0 ;
66- let averageY : number = 0 ;
67- for ( let j : number = averageXStartIndex ; j < averageXEndIndex ; j ++ ) {
68- averageX += normalizedData [ j ] [ 0 ] ;
69- averageY += normalizedData [ j ] [ 1 ] ;
70- }
71-
72- const averageXSpan : number = averageXEndIndex - averageXStartIndex ;
73- averageX /= averageXSpan ;
74- averageY /= averageXSpan ;
75- const averageDataPoint : NormalizedDataPoint = [ averageX , averageY ] ;
76-
77- const rangeXStart = Math . floor ( i * bucketSize ) + 1 ;
78- const rangeXEnd = Math . floor ( ( i + 1 ) * bucketSize ) + 1 ;
79-
80- const dataPointA : NormalizedDataPoint = normalizedData [ a ] ;
81- let maxArea : number = - 1 ;
82- let maxAreaIndex : number ;
83-
84- for ( let k : number = rangeXStart ; k < rangeXEnd ; k ++ ) {
85- const dataPointK = normalizedData [ k ] ;
86- const area = calculateTriangleArea ( dataPointA , dataPointK , averageDataPoint ) ;
87-
88- if ( area > maxArea ) {
89- maxArea = area ;
90- maxAreaIndex = k ;
91- }
92- }
93-
94- const maxAreaDataPoint : DataPoint = data [ maxAreaIndex ] ;
95-
96- a = maxAreaIndex ;
97- sampled . push ( maxAreaDataPoint ) ;
98- }
99-
100- sampled . push ( data [ length - 1 ] ) ;
101-
102- return sampled ;
10351}
0 commit comments