Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java @ 5540:25c2505df28f
Merged
author | Christian Lins <christian.lins@intevation.de> |
---|---|
date | Wed, 03 Apr 2013 16:00:21 +0200 |
parents | 3c7e7d47939f |
children |
comparison
equal
deleted
inserted
replaced
5539:8d0af912351c | 5540:25c2505df28f |
---|---|
36 } | 36 } |
37 | 37 |
38 protected WQKms [] getWQKms(CalculationResult res) { | 38 protected WQKms [] getWQKms(CalculationResult res) { |
39 if (res.getData() instanceof ExtremeResult) | 39 if (res.getData() instanceof ExtremeResult) |
40 return ((ExtremeResult) res.getData()).getWQKms(); | 40 return ((ExtremeResult) res.getData()).getWQKms(); |
41 return (WQKms []) res.getData(); | 41 else if (res.getData() instanceof WQKms[]) { |
42 return (WQKms []) res.getData(); | |
43 } | |
44 else { | |
45 logger.error("WaterlevelFacet got wrong data type " + res.getData()); | |
46 return null; | |
47 } | |
42 } | 48 } |
43 | 49 |
44 /** | 50 /** |
45 * Get waterlevel data. | 51 * Get waterlevel data. |
46 * @return a WQKms at given index. | 52 * @return a WQKms at given index. |
68 return null; | 74 return null; |
69 } | 75 } |
70 | 76 |
71 WQKms [] wqkms = getWQKms(res); | 77 WQKms [] wqkms = getWQKms(res); |
72 Object KM = context.getContextValue("currentKm"); | 78 Object KM = context.getContextValue("currentKm"); |
79 | |
80 // Interpolation. | |
73 if (KM != null) { | 81 if (KM != null) { |
74 logger.debug("interpolate at given km"); | 82 linearInterpolate(wqkms[index], (Double) KM); |
75 // TODO handle exact match. | 83 } |
84 else { | |
85 logger.debug("Do not interpolate."); | |
86 } | |
76 | 87 |
77 WQKms wqkmsI = wqkms[index]; | 88 return wqkms != null ? wqkms[index] : null; |
78 double km = (Double)KM; | 89 } |
79 | 90 |
80 // TODO employ DataUtils interface to TDoubleArraList | 91 |
81 int size = wqkmsI.size(); | 92 /** |
82 boolean kmIncreasing = wqkmsI.getKm(0) < wqkmsI.getKm(size-1); | 93 * Linear interpolation of WQKms. |
83 int mod = kmIncreasing ? +1 : -1; | 94 * TODO rewrite. |
84 int idx = 0; | 95 * @return [w, q, km] |
85 if (!kmIncreasing) { | 96 */ |
86 while (idx < size && wqkmsI.getKm(idx) < km) { | 97 public WQKms linearInterpolate(WQKms wqkms, double km) { |
87 idx++; | 98 logger.debug("interpolate at given km (" + km + ")"); |
99 | |
100 WQKms resultWQKms = new WQKms(); | |
101 int size = wqkms.size(); | |
102 boolean kmIncreasing = wqkms.getKm(0) < wqkms.getKm(size-1); | |
103 int mod = kmIncreasing ? +1 : -1; | |
104 int idx = 0; | |
105 // Move idx to closest from one direction, check for match. | |
106 if (!kmIncreasing) { | |
107 while (idx < size && wqkms.getKm(idx) < km) { | |
108 if (Math.abs(wqkms.getKm(idx) - km) < 0.01d) { | |
109 resultWQKms.add(wqkms.getW(idx), wqkms.getQ(idx), wqkms.getKm(idx)); | |
110 return resultWQKms; | |
88 } | 111 } |
112 idx++; | |
89 } | 113 } |
90 else { | 114 } |
91 idx = size-1; | 115 else { |
92 while (idx > 0 && wqkmsI.getKm(idx) > km) { | 116 idx = size-1; |
93 idx--; | 117 while (idx > 0 && wqkms.getKm(idx) > km) { |
118 if (Math.abs(wqkms.getKm(idx) - km) < 0.01d) { | |
119 resultWQKms.add(wqkms.getW(idx), wqkms.getQ(idx), wqkms.getKm(idx)); | |
120 return resultWQKms; | |
94 } | 121 } |
122 idx--; | |
95 } | 123 } |
96 | 124 } |
97 WQKms resultWQKms = new WQKms(); | 125 if (Math.abs(wqkms.getKm(idx) - km) < 0.01d) { |
98 if ((idx != -1) && (idx < size) && (idx - mod != -1) && (idx - mod < size)) { | 126 resultWQKms.add(wqkms.getW(idx), wqkms.getQ(idx), wqkms.getKm(idx)); |
99 double inW = Linear.linear( | |
100 km, | |
101 wqkmsI.getKm(idx), wqkmsI.getKm(idx - mod), | |
102 wqkmsI.getW(idx), wqkmsI.getW(idx - mod)); | |
103 double inQ = Linear.linear( | |
104 km, | |
105 wqkmsI.getKm(idx), wqkmsI.getKm(idx - mod), | |
106 wqkmsI.getQ(idx), wqkmsI.getQ(idx - mod)); | |
107 resultWQKms.add(inW, inQ, km); | |
108 } | |
109 | |
110 return resultWQKms; | 127 return resultWQKms; |
111 } | 128 } |
112 | 129 |
113 return wqkms != null ? wqkms[index] : null; | 130 if ((idx != -1) && (idx < size) && (idx - mod != -1) && (idx - mod < size)) { |
131 double inW = Linear.linear( | |
132 km, | |
133 wqkms.getKm(idx), wqkms.getKm(idx - mod), | |
134 wqkms.getW(idx), wqkms.getW(idx - mod)); | |
135 double inQ = Linear.linear( | |
136 km, | |
137 wqkms.getKm(idx), wqkms.getKm(idx - mod), | |
138 wqkms.getQ(idx), wqkms.getQ(idx - mod)); | |
139 resultWQKms.add(inW, inQ, km); | |
140 } | |
141 else { | |
142 logger.debug("waterlevelfacet stuff " + idx + " size " + size + " mod: " + mod); | |
143 } | |
144 | |
145 return resultWQKms; | |
114 } | 146 } |
115 | 147 |
116 | 148 |
117 /** Copy deeply. */ | 149 /** Copy deeply. */ |
118 @Override | 150 @Override |