diff --git a/X10D/src/DoubleExtensions/DoubleExtensions.cs b/X10D/src/DoubleExtensions/DoubleExtensions.cs index 94bcfa3..c859e58 100644 --- a/X10D/src/DoubleExtensions/DoubleExtensions.cs +++ b/X10D/src/DoubleExtensions/DoubleExtensions.cs @@ -53,6 +53,51 @@ namespace X10D.DoubleExtensions return !number.IsEven(); } + /// + /// Linearly interpolates to the current value from a specified source using a specified alpha. + /// + /// The interpolation target. + /// The interpolation source. + /// The interpolation alpha. + /// + /// The interpolation result as determined by (1 - ) * + + /// * . + /// + public static double LerpFrom(this double target, double value, double alpha) + { + return LerpInternal(value, target, alpha); + } + + /// + /// Linearly interpolates from the current value to a specified target using a specified alpha. + /// + /// The interpolation source. + /// The interpolation target. + /// The interpolation alpha. + /// + /// The interpolation result as determined by (1 - ) * + + /// * . + /// + public static double LerpTo(this double value, double target, double alpha) + { + return LerpInternal(value, target, alpha); + } + + /// + /// Linearly interpolates to a specified target from a specified source, using the current value as the alpha value. + /// + /// The interpolation alpha. + /// The interpolation source. + /// The interpolation target. + /// + /// The interpolation result as determined by (1 - ) * + + /// * . + /// + public static double LerpWith(this double alpha, double value, double target) + { + return LerpInternal(value, target, alpha); + } + /// /// Converts an angle from radians to degrees. /// @@ -73,5 +118,13 @@ namespace X10D.DoubleExtensions { return Math.Round(v / nearest) * nearest; } + + private static double LerpInternal(double a, double b, double t) + { + // rookie mistake: a + t * (b - a) + + // "precise" method: (1 - t) * a + t * b + return (1 - t) * a + t * b; + } } } diff --git a/X10D/src/SingleExtensions/SingleExtensions.cs b/X10D/src/SingleExtensions/SingleExtensions.cs index 89be04f..45d092d 100644 --- a/X10D/src/SingleExtensions/SingleExtensions.cs +++ b/X10D/src/SingleExtensions/SingleExtensions.cs @@ -54,6 +54,51 @@ namespace X10D.SingleExtensions return !number.IsEven(); } + /// + /// Linearly interpolates to the current value from a specified source using a specified alpha. + /// + /// The interpolation target. + /// The interpolation source. + /// The interpolation alpha. + /// + /// The interpolation result as determined by (1 - ) * + + /// * . + /// + public static float LerpFrom(this float target, float value, float alpha) + { + return (float)((double)target).LerpFrom(value, alpha); + } + + /// + /// Linearly interpolates from the current value to a specified target using a specified alpha. + /// + /// The interpolation source. + /// The interpolation target. + /// The interpolation alpha. + /// + /// The interpolation result as determined by (1 - ) * + + /// * . + /// + public static float LerpTo(this float value, float target, float alpha) + { + return (float)((double)value).LerpTo(target, alpha); + } + + /// + /// Linearly interpolates to a specified target from a specified source, using the current value as the alpha value. + /// + /// The interpolation alpha. + /// The interpolation source. + /// The interpolation target. + /// + /// The interpolation result as determined by (1 - ) * + + /// * . + /// + public static float LerpWith(this float alpha, float value, float target) + { + return (float)((double)alpha).LerpWith(value, target); + } + /// /// Converts an angle from radians to degrees. ///