#region --- License --- /* Licensed under the MIT/X11 license. * Copyright (c) 2006-2008 the OpenTK Team. * This notice may not be removed from any source distribution. * See license.txt for licensing detailed licensing details. * * Contributions by Andy Gill, James Talton and Georg Wächter. */ #endregion --- License --- using System; using System.Diagnostics; namespace Robust.Shared.Maths { /// /// Contains common mathematical functions and constants. /// public static class MathHelper { #region Fields /// /// Defines the value of Pi as a . /// public const float Pi = 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930382f; /// /// Defines the value of Pi divided by two as a . /// public const float PiOver2 = Pi / 2; /// /// Defines the value of Pi divided by three as a . /// public const float PiOver3 = Pi / 3; /// /// Definesthe value of Pi divided by four as a . /// public const float PiOver4 = Pi / 4; /// /// Defines the value of Pi divided by six as a . /// public const float PiOver6 = Pi / 6; /// /// Defines the value of Pi multiplied by two as a . /// public const float TwoPi = 2 * Pi; /// /// Defines the value of Pi multiplied by 3 and divided by two as a . /// public const float ThreePiOver2 = 3 * Pi / 2; /// /// Defines the value of E as a . /// public const float E = 2.71828182845904523536f; /// /// Defines the base-10 logarithm of E. /// public const float Log10E = 0.434294482f; /// /// Defines the base-2 logarithm of E. /// public const float Log2E = 1.442695041f; #endregion Fields #region Public Members #region NextPowerOfTwo /// /// Returns the next power of two that is larger than the specified number. /// /// The specified number. /// The next power of two. public static long NextPowerOfTwo(long n) { if (n <= 0) throw new ArgumentOutOfRangeException(nameof(n), "Must be positive."); return (long)NextPowerOfTwo((double) n); } /// /// Returns the next power of two that is larger than the specified number. /// /// The specified number. /// The next power of two. public static int NextPowerOfTwo(int n) { if (n <= 0) throw new ArgumentOutOfRangeException(nameof(n), "Must be positive."); return (int)NextPowerOfTwo((double) n); } /// /// Returns the next power of two that is larger than the specified number. /// /// The specified number. /// The next power of two. public static float NextPowerOfTwo(float n) { if (float.IsNaN(n) || float.IsInfinity(n)) throw new ArgumentOutOfRangeException(nameof(n), "Must be a number."); if (n <= 0) throw new ArgumentOutOfRangeException(nameof(n), "Must be positive."); return (float)NextPowerOfTwo((double) n); } /// /// Returns the next power of two that is larger than the specified number. /// /// The specified number. /// The next power of two. public static double NextPowerOfTwo(double n) { if (double.IsNaN(n) || double.IsInfinity(n)) throw new ArgumentOutOfRangeException(nameof(n), "Must be a number."); if (n <= 0) throw new ArgumentOutOfRangeException(nameof(n), "Must be positive."); // Don't return negative powers of two, that's nonsense. if (n < 1) return 1.0; return Math.Pow(2, Math.Floor(Math.Log(n, 2)) + 1); } #endregion NextPowerOfTwo #region Factorial /// Calculates the factorial of a given natural number. /// /// The number. /// n! public static long Factorial(int n) { long result = 1; for (; n > 1; n--) result *= n; return result; } #endregion Factorial #region BinomialCoefficient /// /// Calculates the binomial coefficient above . /// /// The n. /// The k. /// n! / (k! * (n - k)!) public static long BinomialCoefficient(int n, int k) { return Factorial(n) / (Factorial(k) * Factorial(n - k)); } #endregion BinomialCoefficient #region DegreesToRadians /// /// Convert degrees to radians /// /// An angle in degrees /// The angle expressed in radians public static float DegreesToRadians(float degrees) { const float degToRad = (float) Math.PI / 180.0f; return degrees * degToRad; } /// /// Convert radians to degrees /// /// An angle in radians /// The angle expressed in degrees public static float RadiansToDegrees(float radians) { const float radToDeg = 180.0f / (float) Math.PI; return radians * radToDeg; } /// /// Convert degrees to radians /// /// An angle in degrees /// The angle expressed in radians public static double DegreesToRadians(double degrees) { const double degToRad = Math.PI / 180.0; return degrees * degToRad; } /// /// Convert radians to degrees /// /// An angle in radians /// The angle expressed in degrees public static double RadiansToDegrees(double radians) { const double radToDeg = 180.0 / Math.PI; return radians * radToDeg; } #endregion DegreesToRadians #region Swap /// /// Swaps two double values. /// /// The first value. /// The second value. public static void Swap(ref double a, ref double b) { var temp = a; a = b; b = temp; } /// /// Swaps two float values. /// /// The first value. /// The second value. public static void Swap(ref float a, ref float b) { var temp = a; a = b; b = temp; } #endregion Swap #region MinMax public static float Min(float a, float b, float c, float d) { return Math.Min(a, Math.Min(b, Math.Min(c, d))); } public static float Max(float a, float b, float c, float d) { return Math.Max(a, Math.Max(b, Math.Max(c, d))); } /// /// Returns the median value out of a, b and c. /// /// THe median. public static float Median(float a, float b, float c) { return Math.Max(Math.Min(a, b), Math.Min(Math.Max(a, b), c)); } #endregion MinMax /// /// This method provides floored modulus. /// C-like languages use truncated modulus for their '%' operator. /// /// The dividend. /// The divisor. /// The remainder. [DebuggerStepThrough] public static double Mod(double n, double d) { return n - Math.Floor(n / d) * d; } /// /// This method provides floored modulus. /// C-like languages use truncated modulus for their '%' operator. /// /// The dividend. /// The divisor. /// The remainder. [DebuggerStepThrough] public static int Mod(int n, int d) { var r = n % d; return r < 0 ? r + d : r; } #endregion Public Members } }