/// <summary> /// Retrieve values for all dimensions for all 4 control points. /// </summary> /// <returns> /// A 2 dimensional array with all the dimension values for all 4 control points. /// The first dimension of the array indicates the control point, the second the dimension. /// </returns> double[][] RetrieveValues(int smallerIndex, int biggerIndex, AbstractTypeInterpolationProvider <TValue, TMath> typeProvider) { // Retrieve required values. TValue p0 = KeyPoints[smallerIndex != 0 ? smallerIndex - 1 : smallerIndex]; TValue p1 = KeyPoints[smallerIndex]; TValue p2 = KeyPoints[biggerIndex]; TValue p3 = KeyPoints[biggerIndex != KeyPoints.Count - 1 ? biggerIndex + 1 : biggerIndex]; // Retrieve required dimension values. double[] p0Values = typeProvider.GetDimensionValues(p0).Cast <double>().ToArray(); double[] p1Values = typeProvider.GetDimensionValues(p1).Cast <double>().ToArray(); double[] p2Values = typeProvider.GetDimensionValues(p2).Cast <double>().ToArray(); double[] p3Values = typeProvider.GetDimensionValues(p3).Cast <double>().ToArray(); return(new[] { p0Values, p1Values, p2Values, p3Values }); }
protected override TValue Interpolate(int smallerIndex, int biggerIndex, TMath position, double percentage) { AbstractTypeInterpolationProvider <TValue, TMath> typeProvider = KeyPoints.TypeProvider; // Retrieve required values. TValue smaller = KeyPoints[smallerIndex]; TValue bigger = KeyPoints[biggerIndex]; // Retrieve required dimension values. TMath[] smallerValues = typeProvider.GetDimensionValues(smaller); TMath[] biggerValues = typeProvider.GetDimensionValues(bigger); // Linear interpolation. TMath[] interpolated = new TMath[typeProvider.AmountOfDimensions]; for (int i = 0; i < typeProvider.AmountOfDimensions; ++i) { var valueRange = new Interval <TMath>(smallerValues[i], biggerValues[i]); interpolated[i] = valueRange.GetValueAt(percentage); } return(typeProvider.CreateInstance(position, interpolated)); }