view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/InfoldingColumns.java @ 5496:23d8f2700b38

Add support for multiple floodplains and add them to the datacage accordingly
author Andre Heinecke <aheinecke@intevation.de>
date Thu, 28 Mar 2013 12:39:14 +0100
parents 243f1eb02b95
children
line wrap: on
line source
package de.intevation.flys.artifacts.model;

/** A pretty naive pointwise algorithm to find out the columns
 *  of a WSTValueTable which imfold ("umhuellen") a set of WQKMs
 *  in terms of Q.
 *  A better implemention would exploit the fact that the
 *  Qs normally are constant for a while along km. This would
 *  reduce the runtime complexity to only a few Q spans instead
 *  of the pointwise evaluation.
 */
public class InfoldingColumns
{
    private QRangeTree.QuickQFinder [] qFinders;

    private boolean [] infoldingColumns;

    public InfoldingColumns() {
    }

    public InfoldingColumns(WstValueTable.Column [] columns) {

        qFinders = new QRangeTree.QuickQFinder[columns.length];
        for (int i = 0; i < qFinders.length; ++i) {
            qFinders[i] = columns[i].getQRangeTree().new QuickQFinder();
        }

        infoldingColumns = new boolean[columns.length];
    }

    public boolean [] getInfoldingColumns() {
        return infoldingColumns;
    }

    public void markInfoldingColumns(QKms [] qkms) {
        for (QKms qk: qkms) {
            markInfoldingColumns(qk);
        }
    }

    public void markInfoldingColumns(QKms qkms) {
        int N = qkms.size();
        int C = qFinders.length-1;
        for (int i = 0; i < N; ++i) {
            double km       = qkms.getKm(i);
            double q        = qkms.getQ(i);
            double above    =  Double.MAX_VALUE;
            double below    = -Double.MAX_VALUE;
            int    aboveIdx = -1;
            int    belowIdx = -1;

            for (int j = C; j >= 0; --j) {
                double qc = qFinders[j].findQ(km);
                if (Double.isNaN(qc)) {
                    continue;
                }
                if (qc <= q) {
                    if (qc > below) {
                        below    = qc;
                        belowIdx = j;
                    }
                }
                else if (qc < above) { // qc > q
                    above    = qc;
                    aboveIdx = j;
                }
            }

            if (aboveIdx != -1) {
                infoldingColumns[aboveIdx] = true;
            }

            if (belowIdx != -1) {
                infoldingColumns[belowIdx] = true;
            }
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org