Mercurial > dive4elements > river
annotate 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 |
rev | line source |
---|---|
4800
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
1 package de.intevation.flys.artifacts.model; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
2 |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
3 /** A pretty naive pointwise algorithm to find out the columns |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
4 * of a WSTValueTable which imfold ("umhuellen") a set of WQKMs |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
5 * in terms of Q. |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
6 * A better implemention would exploit the fact that the |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
7 * Qs normally are constant for a while along km. This would |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
8 * reduce the runtime complexity to only a few Q spans instead |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
9 * of the pointwise evaluation. |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
10 */ |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
11 public class InfoldingColumns |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
12 { |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
13 private QRangeTree.QuickQFinder [] qFinders; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
14 |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
15 private boolean [] infoldingColumns; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
16 |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
17 public InfoldingColumns() { |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
18 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
19 |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
20 public InfoldingColumns(WstValueTable.Column [] columns) { |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
21 |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
22 qFinders = new QRangeTree.QuickQFinder[columns.length]; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
23 for (int i = 0; i < qFinders.length; ++i) { |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
24 qFinders[i] = columns[i].getQRangeTree().new QuickQFinder(); |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
25 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
26 |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
27 infoldingColumns = new boolean[columns.length]; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
28 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
29 |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
30 public boolean [] getInfoldingColumns() { |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
31 return infoldingColumns; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
32 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
33 |
4819
243f1eb02b95
Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4800
diff
changeset
|
34 public void markInfoldingColumns(QKms [] qkms) { |
243f1eb02b95
Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4800
diff
changeset
|
35 for (QKms qk: qkms) { |
243f1eb02b95
Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4800
diff
changeset
|
36 markInfoldingColumns(qk); |
4800
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
37 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
38 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
39 |
4819
243f1eb02b95
Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4800
diff
changeset
|
40 public void markInfoldingColumns(QKms qkms) { |
243f1eb02b95
Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4800
diff
changeset
|
41 int N = qkms.size(); |
4800
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
42 int C = qFinders.length-1; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
43 for (int i = 0; i < N; ++i) { |
4819
243f1eb02b95
Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4800
diff
changeset
|
44 double km = qkms.getKm(i); |
243f1eb02b95
Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4800
diff
changeset
|
45 double q = qkms.getQ(i); |
4800
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
46 double above = Double.MAX_VALUE; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
47 double below = -Double.MAX_VALUE; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
48 int aboveIdx = -1; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
49 int belowIdx = -1; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
50 |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
51 for (int j = C; j >= 0; --j) { |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
52 double qc = qFinders[j].findQ(km); |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
53 if (Double.isNaN(qc)) { |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
54 continue; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
55 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
56 if (qc <= q) { |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
57 if (qc > below) { |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
58 below = qc; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
59 belowIdx = j; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
60 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
61 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
62 else if (qc < above) { // qc > q |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
63 above = qc; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
64 aboveIdx = j; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
65 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
66 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
67 |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
68 if (aboveIdx != -1) { |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
69 infoldingColumns[aboveIdx] = true; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
70 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
71 |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
72 if (belowIdx != -1) { |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
73 infoldingColumns[belowIdx] = true; |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
74 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
75 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
76 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
77 } |
c6814695c82c
Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
78 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |