view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WQ.java @ 938:bd3683453928

Debugged the water fill algorithm. flys-artifacts/trunk@2330 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 14 Jul 2011 14:11:29 +0000
parents 659608128823
children 821aaceb2776
line wrap: on
line source
package de.intevation.flys.artifacts.model;

import gnu.trove.TDoubleArrayList;

import java.util.Random;

public class WQ
extends      NamedObjectImpl
{
    // TODO: s/w/ws/g
    protected TDoubleArrayList w;

    // TODO: s/q/qs/g
    protected TDoubleArrayList q;

    public WQ() {
        this("");
    }

    public WQ(String name) {
        w = new TDoubleArrayList();
        q = new TDoubleArrayList();
    }

    public WQ(int capacity) {
        this(capacity, "");
    }


    public WQ(int capacity, String name) {
        super(name);
        w = new TDoubleArrayList(capacity);
        q = new TDoubleArrayList(capacity);
    }

    public WQ(double [] qs, double [] ws) {
        this(qs, ws, "");
    }

    public WQ(double [] qs, double [] ws, String name) {
        super(name);
        w = new TDoubleArrayList(ws);
        q = new TDoubleArrayList(qs);
    }

    public void add(double w, double q) {
        this.w.add(w);
        this.q.add(q);
    }

    public int size() {
        return w.size();
    }

    public double getW(int idx) {
        return w.getQuick(idx);
    }

    public double getQ(int idx) {
        return q.getQuick(idx);
    }

    public double [] get(int idx) {
        return get(idx, new double [2]);
    }

    public double [] get(int idx, double [] dst) {
        dst[0] = w.getQuick(idx);
        dst[1] = q.getQuick(idx);
        return dst;
    }

    public double [] getWs() {
        return w.toNativeArray();
    }

    public double [] getQs() {
        return q.toNativeArray();
    }

    public static void removeNaNs(TDoubleArrayList [] arrays) {

        int dest = 0;

        int A = arrays.length;
        int N = arrays[0].size();

        OUTER: for (int i = 0; i < N; ++i) {
            for (int j = 0; j < A; ++j) {
                TDoubleArrayList a = arrays[j];
                double v = a.getQuick(i);
                if (Double.isNaN(v)) {
                    continue OUTER;
                }
                a.setQuick(dest, v);
            }
            ++dest;
        }

        if (dest < N) {
            for (int i = 0; i < A; ++i) {
                arrays[i].remove(dest, N-dest);
            }
        }
    }

    public void removeNaNs() {
        removeNaNs(new TDoubleArrayList [] { w, q });
    }

    public boolean guessWaterIncreasing() {
        return guessWaterIncreasing(0.05f);
    }

    public boolean guessWaterIncreasing(float factor) {

        int N = w.size();
        if (N < 2) return false;

        int samples = (int)(factor*N) + 1;

        int up = 0;

        Random rand = new Random();

        for (int i = 0; i < samples; ++i) {
            int    pos2 = rand.nextInt(N-1) + 1;
            if (pos2 == 0) continue;
            int    pos1 = rand.nextInt(pos2);
            double w1   = w.getQuick(pos1);
            double w2   = w.getQuick(pos2);
            if (w2 > w1) ++up;
        }

        return up > samples/2;
    }

}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org