Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/utils/DoubleUtil.java @ 2089:0da8874bd378
Added initial state to map artifact to be able to advance and step back.
The map artifact overrides describe() to have the complete UI information in the
describe response document.
flys-artifacts/trunk@3613 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Raimund Renkert <raimund.renkert@intevation.de> |
---|---|
date | Fri, 06 Jan 2012 12:02:10 +0000 |
parents | 0b6dac664bbb |
children | 0dd58ab7e118 |
line wrap: on
line source
package de.intevation.flys.utils; import java.util.Arrays; import de.intevation.flys.artifacts.math.Linear; public class DoubleUtil { public static final double DEFAULT_STEP_PRECISION = 1e6; private DoubleUtil() { } public static final double [] explode(double from, double to, double step) { return explode(from, to, step, DEFAULT_STEP_PRECISION); } public static final double round(double x, double precision) { return Math.round(x * precision)/precision; } public static final double round(double x) { return Math.round(x * DEFAULT_STEP_PRECISION)/DEFAULT_STEP_PRECISION; } public static final double [] explode( double from, double to, double step, double precision ) { double lower = from; double diff = to - from; double tmp = diff / step; int num = (int)Math.abs(Math.ceil(tmp)) + 1; double [] values = new double[num]; if (from > to) { step = -step; } double max = Math.max(from, to); for (int idx = 0; idx < num; idx++) { if (lower > max) { return Arrays.copyOfRange(values, 0, idx); } values[idx] = round(lower, precision); lower += step; } 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]); } public static final boolean isIncreasing(double [] array) { int inc = 0; int dec = 0; int sweet = (array.length-1)/2; for (int i = 1; i < array.length; ++i) { if (array[i] > array[i-1]) { if (++inc > sweet) { return true; } } else if (++dec > sweet) { return false; } } return inc > sweet; } public static final double [] swap(double [] array) { int lo = 0; int hi = array.length-1; while (hi > lo) { double t = array[lo]; array[lo] = array[hi]; array[hi] = t; ++lo; --hi; } return array; } public static final double [] swapClone(double [] in) { double [] out = new double[in.length]; for (int j = out.length-1, i = 0; j >= 0;) { out[j--] = in[i++]; } return out; } public static final double [] sumDiffs(double [] in) { double [] out = new double[in.length]; for (int i = 1; i < out.length; ++i) { out[i] = out[i-1] + Math.abs(in[i-1] - in[i]); } return out; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :