Mercurial > dive4elements > river
changeset 4800:c6814695c82c
Added missing InfoldingColumns.java
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Sun, 13 Jan 2013 17:00:37 +0100 (2013-01-13) |
parents | e3532c7850b9 |
children | 6aa1b8abe2d3 |
files | flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/InfoldingColumns.java |
diffstat | 1 files changed, 78 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/InfoldingColumns.java Sun Jan 13 17:00:37 2013 +0100 @@ -0,0 +1,78 @@ +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(WQKms [] wqkms) { + for (WQKms wqk: wqkms) { + markInfoldingColumns(wqk); + } + } + + public void markInfoldingColumns(WQKms wqkms) { + int N = wqkms.size(); + int C = qFinders.length-1; + for (int i = 0; i < N; ++i) { + double km = wqkms.getKm(i); + double q = wqkms.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 :