# HG changeset patch # User Sascha L. Teichmann # Date 1317741811 0 # Node ID da872168a899cadf929f71326b62d263173c70b0 # Parent fc9719cddbc6dd1565a7c0760cfcd69bbc4f1c11 Added code to interpolate double values in a sorted array flys-artifacts/trunk@2883 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r fc9719cddbc6 -r da872168a899 flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Tue Oct 04 15:14:09 2011 +0000 +++ b/flys-artifacts/ChangeLog Tue Oct 04 15:23:31 2011 +0000 @@ -1,3 +1,9 @@ +2011-10-04 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/utils/DoubleUtil.java (interpolateSorted): + Added code to linear interpolate double values in a sorted array. + Keys and values are given as double arrays. Keys need to be sorted. + 2011-10-04 Sascha L. Teichmann * src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java, diff -r fc9719cddbc6 -r da872168a899 flys-artifacts/src/main/java/de/intevation/flys/utils/DoubleUtil.java --- a/flys-artifacts/src/main/java/de/intevation/flys/utils/DoubleUtil.java Tue Oct 04 15:14:09 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/utils/DoubleUtil.java Tue Oct 04 15:23:31 2011 +0000 @@ -2,6 +2,8 @@ import java.util.Arrays; +import de.intevation.flys.artifacts.math.Linear; + public class DoubleUtil { @@ -53,5 +55,31 @@ return values; } + + public static final double interpolateSorted( + double [] xs, + double [] ys, + double x + ) { + int lo = 0, hi = xs.length-1; + + int mid = -1; + + while (lo <= hi) { + mid = (lo + hi) >> 1; + double mx = xs[mid]; + if (x < mx) hi = mid - 1; + else if (x > mx) lo = mid + 1; + else return ys[mid]; + } + if (mid < lo) { + return lo >= xs.length + ? Double.NaN + : Linear.linear(x, xs[mid], xs[mid+1], ys[mid], ys[mid+1]); + } + return hi < 0 + ? Double.NaN + : Linear.linear(x, xs[mid-1], xs[mid], ys[mid-1], ys[mid]); + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :