diff --git a/libs/nshmp-lib/calc/maths.util.ts b/libs/nshmp-lib/calc/maths.util.ts index bd67e9cdc4243cdb822f4b35323b3212f2a144af..1f5aa0b86fb0f6b5020b983e95f716d89cdd275a 100644 --- a/libs/nshmp-lib/calc/maths.util.ts +++ b/libs/nshmp-lib/calc/maths.util.ts @@ -36,14 +36,12 @@ const interpolate = (xySequence: XySequence, value: number): number => { const xValues = xySequence.xs; const yValues = xySequence.ys; - const indexBelow = yValues.findIndex(y => { - return y < value; - }); - - const x0 = xValues[indexBelow - 1]; - const x1 = xValues[indexBelow]; - const y0 = yValues[indexBelow - 1]; - const y1 = yValues[indexBelow]; + const index = closestIndex(yValues, value); + + const x0 = xValues[index - 1]; + const x1 = xValues[index]; + const y0 = yValues[index - 1]; + const y1 = yValues[index]; const x = interpolateValue(x0, x1, y0, y1, value); return isNaN(x) ? x : round(x, 6); }; @@ -90,6 +88,20 @@ const calculateResponseSpectrum = ( return interpolate(xySequence, 1 / returnPeriod); }; +/** + * Return index of closest value. + * + * @param values Array of values + * @param value Value to find + */ +const closestIndex = (values: number[], value: number): number => { + const closestValue = values.reduce((prev, curr) => + Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev + ); + + return values.findIndex(value => value === closestValue); +}; + /** * Interpolate. *