sascha@655: package de.intevation.flys.utils; sascha@655: ingo@1666: import java.util.Arrays; ingo@1666: sascha@1671: import de.intevation.flys.artifacts.math.Linear; sascha@1671: ingo@1666: sascha@655: public class DoubleUtil sascha@655: { sascha@655: public static final double DEFAULT_STEP_PRECISION = 1e6; sascha@655: sascha@655: private DoubleUtil() { sascha@655: } sascha@655: sascha@655: public static final double [] explode(double from, double to, double step) { sascha@655: return explode(from, to, step, DEFAULT_STEP_PRECISION); sascha@655: } sascha@655: sascha@655: public static final double round(double x, double precision) { sascha@655: return Math.round(x * precision)/precision; sascha@655: } sascha@655: sascha@655: public static final double round(double x) { sascha@655: return Math.round(x * DEFAULT_STEP_PRECISION)/DEFAULT_STEP_PRECISION; sascha@655: } sascha@655: sascha@655: public static final double [] explode( sascha@655: double from, sascha@655: double to, sascha@655: double step, sascha@655: double precision sascha@655: ) { sascha@655: double lower = from; sascha@655: sascha@655: double diff = to - from; sascha@655: double tmp = diff / step; sascha@655: int num = (int)Math.abs(Math.ceil(tmp)) + 1; sascha@655: sascha@655: double [] values = new double[num]; sascha@655: sascha@655: if (from > to) { sascha@655: step = -step; sascha@655: } sascha@655: ingo@1666: double max = Math.max(from, to); ingo@1666: sascha@655: for (int idx = 0; idx < num; idx++) { ingo@1666: if (lower > max) { ingo@1666: return Arrays.copyOfRange(values, 0, idx); ingo@1666: } ingo@1666: sascha@655: values[idx] = round(lower, precision); sascha@655: lower += step; sascha@655: } sascha@655: sascha@655: return values; sascha@655: } sascha@1671: sascha@1671: public static final double interpolateSorted( sascha@1671: double [] xs, sascha@1671: double [] ys, sascha@1671: double x sascha@1671: ) { sascha@1671: int lo = 0, hi = xs.length-1; sascha@1671: sascha@1671: int mid = -1; sascha@1671: sascha@1671: while (lo <= hi) { sascha@1671: mid = (lo + hi) >> 1; sascha@1671: double mx = xs[mid]; sascha@1671: if (x < mx) hi = mid - 1; sascha@1671: else if (x > mx) lo = mid + 1; sascha@1671: else return ys[mid]; sascha@1671: } sascha@1671: if (mid < lo) { sascha@1671: return lo >= xs.length sascha@1671: ? Double.NaN sascha@1671: : Linear.linear(x, xs[mid], xs[mid+1], ys[mid], ys[mid+1]); sascha@1671: } sascha@1671: return hi < 0 sascha@1671: ? Double.NaN sascha@1671: : Linear.linear(x, xs[mid-1], xs[mid], ys[mid-1], ys[mid]); sascha@1671: } sascha@655: } sascha@655: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :