@Override
public Double interpolate(final Interpolator1DDataBundle data, final Double value) {
Validate.notNull(value, "value");
Validate.notNull(data, "data bundle");
Validate.isTrue(data instanceof Interpolator1DQuadraticSplineDataBundle);
final Interpolator1DQuadraticSplineDataBundle quadraticData = (Interpolator1DQuadraticSplineDataBundle) data;
final int n = data.size() - 1;
final double[] xData = data.getKeys();
final double[] yData = data.getValues();
double h, dx, a, b;
if (value < data.firstKey()) {
h = 0;
dx = value;
a = quadraticData.getA(0);
b = quadraticData.getB(0);
} else if (value > data.lastKey()) {
h = yData[n];
dx = value - xData[n];
a = quadraticData.getA(n + 1);
b = quadraticData.getB(n + 1);
} else {
final int low = data.getLowerBoundIndex(value);
h = yData[low];
dx = value - xData[low];
a = quadraticData.getA(low + 1);
b = quadraticData.getB(low + 1);
}
return h + a * a * dx + a * b * dx * dx + b * b / 3 * dx * dx * dx;
}