int[] inputPrev = new int[numberOfInputValues];
int[] inputNext = new int[numberOfInputValues];
for (int i = 0; i < numberOfInputValues; i++)
{
PDRange domain = getDomainForInput(i);
PDRange encodeValues = getEncodeForParameter(i);
input[i] = clipToRange(input[i], domain.getMin(), domain.getMax());
input[i] = interpolate(input[i], domain.getMin(), domain.getMax(),
encodeValues.getMin(), encodeValues.getMax());
input[i] = clipToRange(input[i], 0, sizeValues[i] - 1);
inputPrev[i] = (int) Math.floor(input[i]);
inputNext[i] = (int) Math.ceil(input[i]);
}
// old code for N=1 and N=2, don't delete in case one uses this for optimization
//
// if (numberOfInputValues == 1)
// {
// int[] sample1 = getSamples()[calcSampleIndex(new int[]
// {
// inputPrev[0]
// })];
// int[] sample2 = getSamples()[calcSampleIndex(new int[]
// {
// inputNext[0]
// })];
// for (int i = 0; i < numberOfOutputValues; ++i)
// {
// outputValues[i] = inputPrev[0] == inputNext[0] ? sample1[i] : interpolate(input[0], inputPrev[0], inputNext[0], sample1[i], sample2[i]);
// }
// //TODO optimize so that sample is collected only when needed
// }
// if (numberOfInputValues == 2)
// {
// int[] sample1 = getSamples()[calcSampleIndex(new int[]
// {
// inputPrev[0], inputPrev[1]
// })];
// int[] sample2 = getSamples()[calcSampleIndex(new int[]
// {
// inputPrev[0], inputNext[1]
// })];
// int[] sample3 = getSamples()[calcSampleIndex(new int[]
// {
// inputNext[0], inputPrev[1]
// })];
// int[] sample4 = getSamples()[calcSampleIndex(new int[]
// {
// inputNext[0], inputNext[1]
// })];
//
// for (int i = 0; i < numberOfOutputValues; ++i)
// {
// // bilinear color interpolation, see e.g.
// // http://harmoniccode.blogspot.de/2011/04/bilinear-color-interpolation.html
// // interpolate the color at top and bottom edges (x-axis)
// // then interpolate the color between these two results (y-axis)
// double lowerVal = inputPrev[0] == inputNext[0] ? sample1[i] : interpolate(input[0], inputPrev[0], inputNext[0], sample1[i], sample3[i]);
// double upperVal = inputPrev[0] == inputNext[0] ? sample2[i] : interpolate(input[0], inputPrev[0], inputNext[0], sample2[i], sample4[i]);
// outputValues[i] = (float) (inputPrev[1] == inputNext[1] ? lowerVal : interpolate(input[1], inputPrev[1], inputNext[1], (float) lowerVal, (float) upperVal));
// //TODO optimize so that sample is collected only when needed
// }
// }
//
float[] outputValues = new Rinterpol(input, inputPrev, inputNext).rinterpolate();
for (int i = 0; i < numberOfOutputValues; i++)
{
PDRange range = getRangeForOutput(i);
PDRange decodeValues = getDecodeForParameter(i);
outputValues[i] = interpolate(outputValues[i], 0, maxSample, decodeValues.getMin(), decodeValues.getMax());
outputValues[i] = clipToRange(outputValues[i], range.getMin(), range.getMax());
}
return outputValues;
}