Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/utils/DoubleUtil.java @ 1671:da872168a899
Added code to interpolate double values in a sorted array
flys-artifacts/trunk@2883 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Tue, 04 Oct 2011 15:23:31 +0000 |
parents | 09c1292cf36d |
children | 0b6dac664bbb |
comparison
equal
deleted
inserted
replaced
1670:fc9719cddbc6 | 1671:da872168a899 |
---|---|
1 package de.intevation.flys.utils; | 1 package de.intevation.flys.utils; |
2 | 2 |
3 import java.util.Arrays; | 3 import java.util.Arrays; |
4 | |
5 import de.intevation.flys.artifacts.math.Linear; | |
4 | 6 |
5 | 7 |
6 public class DoubleUtil | 8 public class DoubleUtil |
7 { | 9 { |
8 public static final double DEFAULT_STEP_PRECISION = 1e6; | 10 public static final double DEFAULT_STEP_PRECISION = 1e6; |
51 lower += step; | 53 lower += step; |
52 } | 54 } |
53 | 55 |
54 return values; | 56 return values; |
55 } | 57 } |
58 | |
59 public static final double interpolateSorted( | |
60 double [] xs, | |
61 double [] ys, | |
62 double x | |
63 ) { | |
64 int lo = 0, hi = xs.length-1; | |
65 | |
66 int mid = -1; | |
67 | |
68 while (lo <= hi) { | |
69 mid = (lo + hi) >> 1; | |
70 double mx = xs[mid]; | |
71 if (x < mx) hi = mid - 1; | |
72 else if (x > mx) lo = mid + 1; | |
73 else return ys[mid]; | |
74 } | |
75 if (mid < lo) { | |
76 return lo >= xs.length | |
77 ? Double.NaN | |
78 : Linear.linear(x, xs[mid], xs[mid+1], ys[mid], ys[mid+1]); | |
79 } | |
80 return hi < 0 | |
81 ? Double.NaN | |
82 : Linear.linear(x, xs[mid-1], xs[mid], ys[mid-1], ys[mid]); | |
83 } | |
56 } | 84 } |
57 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : | 85 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |