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

http://dive4elements.wald.intevation.org