Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java @ 5445:3c7e7d47939f
WaterlevelFacet: Slight refactoring (more needed), fix flys/issue1149.
author | Felix Wolfsteller <felix.wolfsteller@intevation.de> |
---|---|
date | Wed, 27 Mar 2013 09:51:01 +0100 |
parents | 70e0732bd4dd |
children |
comparison
equal
deleted
inserted
replaced
5444:70e0732bd4dd | 5445:3c7e7d47939f |
---|---|
74 return null; | 74 return null; |
75 } | 75 } |
76 | 76 |
77 WQKms [] wqkms = getWQKms(res); | 77 WQKms [] wqkms = getWQKms(res); |
78 Object KM = context.getContextValue("currentKm"); | 78 Object KM = context.getContextValue("currentKm"); |
79 | |
80 // Interpolation. | |
79 if (KM != null) { | 81 if (KM != null) { |
80 logger.debug("interpolate at given km"); | 82 linearInterpolate(wqkms[index], (Double) KM); |
81 // TODO handle exact match. | 83 } |
84 else { | |
85 logger.debug("Do not interpolate."); | |
86 } | |
82 | 87 |
83 WQKms wqkmsI = wqkms[index]; | 88 return wqkms != null ? wqkms[index] : null; |
84 double km = (Double)KM; | 89 } |
85 | 90 |
86 // TODO employ DataUtils interface to TDoubleArraList | 91 |
87 int size = wqkmsI.size(); | 92 /** |
88 boolean kmIncreasing = wqkmsI.getKm(0) < wqkmsI.getKm(size-1); | 93 * Linear interpolation of WQKms. |
89 int mod = kmIncreasing ? +1 : -1; | 94 * TODO rewrite. |
90 int idx = 0; | 95 * @return [w, q, km] |
91 if (!kmIncreasing) { | 96 */ |
92 while (idx < size && wqkmsI.getKm(idx) < km) { | 97 public WQKms linearInterpolate(WQKms wqkms, double km) { |
93 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; | |
94 } | 111 } |
112 idx++; | |
95 } | 113 } |
96 else { | 114 } |
97 idx = size-1; | 115 else { |
98 while (idx > 0 && wqkmsI.getKm(idx) > km) { | 116 idx = size-1; |
99 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; | |
100 } | 121 } |
122 idx--; | |
101 } | 123 } |
102 | 124 } |
103 WQKms resultWQKms = new WQKms(); | 125 if (Math.abs(wqkms.getKm(idx) - km) < 0.01d) { |
104 if ((idx != -1) && (idx < size) && (idx - mod != -1) && (idx - mod < size)) { | 126 resultWQKms.add(wqkms.getW(idx), wqkms.getQ(idx), wqkms.getKm(idx)); |
105 double inW = Linear.linear( | |
106 km, | |
107 wqkmsI.getKm(idx), wqkmsI.getKm(idx - mod), | |
108 wqkmsI.getW(idx), wqkmsI.getW(idx - mod)); | |
109 double inQ = Linear.linear( | |
110 km, | |
111 wqkmsI.getKm(idx), wqkmsI.getKm(idx - mod), | |
112 wqkmsI.getQ(idx), wqkmsI.getQ(idx - mod)); | |
113 resultWQKms.add(inW, inQ, km); | |
114 } | |
115 | |
116 return resultWQKms; | 127 return resultWQKms; |
117 } | 128 } |
118 | 129 |
119 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; | |
120 } | 146 } |
121 | 147 |
122 | 148 |
123 /** Copy deeply. */ | 149 /** Copy deeply. */ |
124 @Override | 150 @Override |