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

http://dive4elements.wald.intevation.org