/// <summary>Initializes the step interpolator with a sample provider</summary> /// <param name="sampleProvider">Object through which to query for samples</param> /// <param name="affinity">Which sample to align steps to</param> public StepInterpolator( ISampleProvider <SampleType> sampleProvider, SampleAffinity affinity ) { this.sampleProvider = sampleProvider; this.affinity = affinity; }
/// <summary>Perform a stepped interpolation of the value at the given point in time</summary> /// <param name="left">Sample value at time 0.0</param> /// <param name="right">Sample value at time 1.0</param> /// <param name="time">Time index to be interpolated (0.0 to 1.0)</param> /// <param name="affinity">Which sample to align steps to</param> /// <returns>The interpolated value</returns> public static SampleType Interpolate( Number <SampleType, SampleMathType> left, Number <SampleType, SampleMathType> right, double time, SampleAffinity affinity ) { switch (affinity) { case SampleAffinity.Left: { return(left); } case SampleAffinity.Right: { return(right); } default: { if (time < 0.5) { return(left); } else { return(right); } } } }
/// <summary>Performs a stepped interpolation between two arbitrily spaced samples</summary> /// <param name="left">Sample value at the starting time</param> /// <param name="leftTime">Starting time</param> /// <param name="right">Sample value at the ending time</param> /// <param name="rightTime">Ending time</param> /// <param name="time">Time index to be interpolated</param> /// <param name="affinity">Which sample to align steps to</param> /// <returns>The interpolated value</returns> public static SampleType Interpolate( Number <SampleType, SampleMathType> left, double leftTime, Number <SampleType, SampleMathType> right, double rightTime, double time, SampleAffinity affinity ) { return(Interpolate(left, right, (time - leftTime) / (rightTime - leftTime), affinity)); }