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 }

http://dive4elements.wald.intevation.org