view flys-artifacts/src/main/java/de/intevation/flys/artifacts/math/MovingAverage.java @ 5764:7ac111db8a07

Model, factory, facet and static artifact for morphologic width.
author Raimund Renkert <rrenkert@intevation.de>
date Thu, 18 Apr 2013 14:14:15 +0200
parents fb9892036bd6
children
line wrap: on
line source
package de.intevation.flys.artifacts.math;

import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;


public class MovingAverage
{

    public static double[][] simple(double[][] values, double radius) {
        TreeMap<Double, Double> map = toMap(values);
        int N = map.size();
        double [] xs = new double[N];
        double [] ys = new double[N];
        int ndx = 0;
        for (double x: map.keySet()) {
            SortedMap<Double, Double> range =
                map.subMap(x-radius, true, x+radius, true);
            double avg = 0d;
            for (double v: range.values()) {
                avg += v;
            }
            avg /= range.size();
            xs[ndx] = x;
            ys[ndx] = avg;
            ndx++;
        }
        return new double [][] { xs, ys };
    }

    public static double[][] weighted(double[][] values, double radius) {
        TreeMap<Double, Double> map = toMap(values);
        int N = map.size();
        double [] xs = new double[N];
        double [] ys = new double[N];
        int ndx = 0;
        double _1radius = 1d/radius;
        for (double x: map.keySet()) {
            double avg = 0d;
            double weights = 0d;
            for (Map.Entry<Double, Double> e:
                map.subMap(x-radius, false, x+radius, false).entrySet()
            ) {
                double weight = 1d - Math.abs(x - e.getKey())*_1radius;
                avg += weight*e.getValue();
                weights += weight;
            }
            avg /= weights;
            xs[ndx] = x;
            ys[ndx] = avg;
            ndx++;
        }
        return new double [][] { xs, ys };
    }

    private static TreeMap<Double, Double> toMap(double[][] values) {
        TreeMap<Double, Double> map = new TreeMap<Double, Double>();
        double [] xs = values[0];
        double [] ys = values[1];
        for (int i = 0; i < xs.length; i++) {
            map.put(xs[i], ys[i]);
        }
        return map;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org