[Dive4elements-commits] [PATCH] Added missing InfoldingColumns.java
Wald Commits
scm-commit at wald.intevation.org
Sun Jan 13 17:00:42 CET 2013
# HG changeset patch
# User Sascha L. Teichmann <teichmann at intevation.de>
# Date 1358092837 -3600
# Node ID c6814695c82cd984ddc04374b9b9dda6cdaf8f88
# Parent e3532c7850b9b2d53ce83a5acb26f840d8e99808
Added missing InfoldingColumns.java
diff -r e3532c7850b9 -r c6814695c82c flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/InfoldingColumns.java
--- /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 :
More information about the Dive4elements-commits
mailing list