Mercurial > silverbladetech
diff SilverlightGlimpse/SilverFlow.Controls/Extensions/MathExtensions.cs @ 63:536498832a79
Latest version before changing bindings to Listbox
author | Steven Hollidge <stevenhollidge@hotmail.com> |
---|---|
date | Sun, 22 Apr 2012 13:33:42 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SilverlightGlimpse/SilverFlow.Controls/Extensions/MathExtensions.cs Sun Apr 22 13:33:42 2012 +0100 @@ -0,0 +1,85 @@ +using System; + +namespace SilverFlow.Controls.Extensions +{ + /// <summary> + /// Math extensions + /// </summary> + public static class MathExtensions + { + /// <summary> + /// Determines whether the number is NaN. + /// </summary> + /// <param name="number">The number.</param> + /// <returns> + /// <c>true</c> if is NaN; otherwise, <c>false</c>. + /// </returns> + public static bool IsNotSet(this double number) + { + return double.IsNaN(number); + } + + /// <summary> + /// Determines whether the specified number is near the test number. + /// </summary> + /// <param name="number">The number.</param> + /// <param name="testNumber">The test number.</param> + /// <param name="accuracy">Accuracy.</param> + /// <returns> + /// <c>true</c> if the specified number is near the testing one; otherwise, <c>false</c>. + /// </returns> + public static bool IsNear(this double number, double testNumber, double accuracy) + { + return number >= (testNumber - accuracy) && number <= (testNumber + accuracy); + } + + /// <summary> + /// Compares two numbers without their signs and gets absolutely minimal value. + /// </summary> + /// <param name="num1">First number.</param> + /// <param name="num2">Second number.</param> + /// <returns>Absolutely minimal value.</returns> + public static double AbsMin(double num1, double num2) + { + if (num1.IsNotSet() && num2.IsNotSet()) + return double.NaN; + + if (num1.IsNotSet()) return num2; + if (num2.IsNotSet()) return num1; + + double abs1 = Math.Abs(num1); + double abs2 = Math.Abs(num2); + + if (abs1 < abs2) return num1; + if (abs2 < abs1) return num2; + + // Abs. values are equal. Return first number + return num1; + } + + /// <summary> + /// Ensures the given number is in the specified range. + /// </summary> + /// <param name="number">The number.</param> + /// <param name="low">The lower limit.</param> + /// <param name="high">The upper limit.</param> + /// <returns>A number in the specified range.</returns> + public static double EnsureInRange(this double number, double low, double high) + { + if (number.IsNotSet()) return double.NaN; + + double result = Math.Max(number, low); + return Math.Min(result, high); + } + + /// <summary> + /// Returns a double value if it is not a NAN, or zero. + /// </summary> + /// <param name="number">The number.</param> + /// <returns>Double value if it is not a NAN, or zero.</returns> + public static double ValueOrZero(this double number) + { + return double.IsNaN(number) ? 0 : number; + } + } +}