changeset 4800:c6814695c82c

Added missing InfoldingColumns.java
author Sascha L. Teichmann <teichmann@intevation.de>
date Sun, 13 Jan 2013 17:00:37 +0100
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 :

http://dive4elements.wald.intevation.org