Ejemplo n.º 1
0
        /// <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));
        }