/// <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. Converter <TMath, double> toDoubleConverter = from => CastOperator <TMath, double> .Cast(from); double[] p0Values = Array.ConvertAll(typeProvider.GetDimensionValues(p0), toDoubleConverter); double[] p1Values = Array.ConvertAll(typeProvider.GetDimensionValues(p1), toDoubleConverter); double[] p2Values = Array.ConvertAll(typeProvider.GetDimensionValues(p2), toDoubleConverter); double[] p3Values = Array.ConvertAll(typeProvider.GetDimensionValues(p3), toDoubleConverter); 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. var 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)); }