@@ -181,49 +181,55 @@ public InterpolationMethod getInterpolationMethod() {
181
181
* @param x The abscissa at which the interpolation should be performed.
182
182
* @return The interpolated value (ordinate).
183
183
*/
184
- public double getValue (final double x )
185
- {
184
+ public double getValue (final double x ) {
186
185
synchronized (interpolatingRationalFunctionsLazyInitLock ) {
187
186
if (interpolatingRationalFunctions == null ) {
188
187
doCreateRationalFunctions ();
189
188
}
190
189
}
191
-
190
+
192
191
// Get interpolating rational function for the given point x
193
192
final int pointIndex = java .util .Arrays .binarySearch (points , x );
194
193
if (pointIndex >= 0 ) {
195
194
return values [pointIndex ];
196
195
}
197
-
196
+
198
197
int intervalIndex = -pointIndex -2 ;
199
-
198
+
200
199
// Check for extrapolation
200
+ Extrapolation extrapolation ;
201
201
if (intervalIndex < 0 ) {
202
202
// Extrapolation
203
- if (extrapolationMethod == ExtrapolationMethod .CONSTANT ) {
204
- return values [0 ];
205
- } else if (extrapolationMethod == ExtrapolationMethod .LINEAR ) {
206
- return values [0 ]+(values [1 ]-values [0 ])/(points [1 ]-points [0 ])*(x -points [0 ]);
207
- } else {
208
- intervalIndex = 0 ;
209
- }
210
- }
211
- else if (intervalIndex > points .length -2 ) {
203
+ extrapolation = getExtrapolationMethod ();
204
+ intervalIndex = 0 ;
205
+ } else if (intervalIndex > points .length -2 ) {
212
206
// Extrapolation
213
- if (extrapolationMethod == ExtrapolationMethod .CONSTANT ) {
214
- return values [points .length -1 ];
215
- } else if (extrapolationMethod == ExtrapolationMethod .LINEAR ) {
216
- return values [points .length -1 ]+(values [points .length -2 ]-values [points .length -1 ])/(points [points .length -2 ]-points [points .length -1 ])*(x -points [points .length -1 ]);
217
- } else {
218
- intervalIndex = points .length -2 ;
219
- }
207
+ extrapolation = getExtrapolationMethod ();
208
+ intervalIndex = points .length -2 ;
209
+ } else {
210
+ extrapolation = null ;
211
+ }
212
+
213
+ // Calculate interpolating value or use extrapolation
214
+ if (extrapolation == null ) {
215
+ final RationalFunction rationalFunction = interpolatingRationalFunctions [intervalIndex ];
216
+ return rationalFunction .getValue (x -points [intervalIndex ]);
217
+ } else {
218
+ return extrapolation .getValue (points , values , x );
219
+ }
220
+ }
221
+
222
+ public Extrapolation getExtrapolationMethod () {
223
+ if (extrapolationMethod == ExtrapolationMethod .CONSTANT ) {
224
+ return new ConstantExtrapolation ();
225
+ } else if (extrapolationMethod == ExtrapolationMethod .LINEAR ) {
226
+ return new LinearExtrapolation ();
227
+ } else {
228
+ return null ;
220
229
}
221
-
222
- final RationalFunction rationalFunction = interpolatingRationalFunctions [intervalIndex ];
223
-
224
- // Calculate interpolating value
225
- return rationalFunction .getValue (x -points [intervalIndex ]);
226
230
}
231
+
232
+
227
233
228
234
private void doCreateRationalFunctions ()
229
235
{
0 commit comments