sclass CompressToInterpolatedDoubleArray { // raw data to compress (integers) int[] data; // output InterpolatedDoubleArray result; // internal new IntBuffer indices; new DoubleBuffer values; *(int[] *data) {} InterpolatedDoubleArray get() { int iData = 0; while (iData < data.length) { int startValue = data[iData]; // see how far the straight line goes from iData DoubleRange totalSlopeRange = null; int jData; // our straight line ends at jData-1 for (jData = iData+1; jData < data.length; jData++) { double x = data[jData], h = jData-iData; DoubleRange xRange = doubleRange(x-0.5, x+0.5); DoubleRange slopeRange = doubleRange(xRange.start/h, xRange.end/h); if (totalSlopeRange == null) totalSlopeRange = slopeRange; else { slopeRange = intersectRanges(slopeRange, totalSlopeRange); if (empty(slopeRange)) break; else totalSlopeRange = slopeRange; } } printVars(+iData, +jData, +totalSlopeRange); indices.add(iData); values.add(data[iData]); iData = jData; } ret result = new InterpolatedDoubleArray(indices.toArrayNonNull(), values.toArrayNonNull()); } }