Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/QRangeTree.java @ 633:d08f77e7f7e8
WST value table: Qs are now stored in ranges for each column.
flys-artifacts/trunk@2006 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 25 May 2011 15:31:25 +0000 |
parents | 07640ab913fd |
children | a776afdf1ec5 |
comparison
equal
deleted
inserted
replaced
632:07640ab913fd | 633:d08f77e7f7e8 |
---|---|
1 package de.intevation.flys.artifacts.model; | 1 package de.intevation.flys.artifacts.model; |
2 | 2 |
3 import java.io.Serializable; | 3 import java.io.Serializable; |
4 | 4 |
5 import java.math.BigDecimal; | |
6 | |
7 import java.util.List; | 5 import java.util.List; |
8 | 6 |
9 import de.intevation.flys.model.WstQRange; | 7 import org.apache.log4j.Logger; |
10 import de.intevation.flys.model.Range; | |
11 | 8 |
12 public class QRangeTree | 9 public class QRangeTree |
13 implements Serializable | 10 implements Serializable |
14 { | 11 { |
12 private static Logger log = Logger.getLogger(QRangeTree.class); | |
13 | |
15 public static class Node | 14 public static class Node |
16 implements Serializable | 15 implements Serializable |
17 { | 16 { |
18 Node left; | 17 Node left; |
19 Node right; | 18 Node right; |
73 double n = q - m*b; | 72 double n = q - m*b; |
74 return m*pos + n; | 73 return m*pos + n; |
75 } | 74 } |
76 | 75 |
77 public double findQ(double pos) { | 76 public double findQ(double pos) { |
77 | |
78 Node current = this; | 78 Node current = this; |
79 for (;;) { | 79 for (;;) { |
80 if (pos < current.a) { | 80 if (pos < current.a) { |
81 if (current.left != null) { | 81 if (current.left != null) { |
82 current = current.left; | 82 current = current.left; |
83 continue; | 83 continue; |
84 } | 84 } |
85 return current.left != null | 85 return current.prev != null |
86 ? current.interpolatePrev(pos) | 86 ? current.interpolatePrev(pos) |
87 : Double.NaN; | 87 : Double.NaN; |
88 } | 88 } |
89 if (pos > current.b) { | 89 if (pos > current.b) { |
90 if (current.right != null) { | 90 if (current.right != null) { |
91 current = current.right; | 91 current = current.right; |
92 continue; | 92 continue; |
93 } | 93 } |
94 return current.right != null | 94 return current.next != null |
95 ? current.interpolateNext(pos) | 95 ? current.interpolateNext(pos) |
96 : Double.NaN; | 96 : Double.NaN; |
97 } | 97 } |
98 return current.q; | 98 return current.q; |
99 } | 99 } |
104 | 104 |
105 public QRangeTree() { | 105 public QRangeTree() { |
106 } | 106 } |
107 | 107 |
108 /** wstQRanges need to be sorted by range.a */ | 108 /** wstQRanges need to be sorted by range.a */ |
109 public QRangeTree(List<WstQRange> wstQRanges) { | |
110 | |
111 if (wstQRanges.isEmpty()) { | |
112 return; | |
113 } | |
114 | |
115 Node [] nodes = new Node[wstQRanges.size()]; | |
116 for (int i = 0; i < nodes.length; ++i) { | |
117 WstQRange wstQRange = wstQRanges.get(i); | |
118 Range range = wstQRange.getRange(); | |
119 BigDecimal a = range.getA(); | |
120 BigDecimal b = range.getB(); | |
121 nodes[i] = new Node( | |
122 a != null ? a.doubleValue() : -Double.MAX_VALUE, | |
123 b != null ? b.doubleValue() : Double.MAX_VALUE, | |
124 wstQRange.getQ().doubleValue()); | |
125 } | |
126 | |
127 root = wireTree(nodes); | |
128 } | |
129 | |
130 public QRangeTree(List<Object []> qRanges, int start, int stop) { | 109 public QRangeTree(List<Object []> qRanges, int start, int stop) { |
131 | 110 |
132 if (stop <= start) { | 111 if (stop <= start) { |
133 return; | 112 return; |
134 } | 113 } |