//http://isotopescreencapture.codeplex.com/ //The MIT License (MIT) namespace Isotope.Math { public static class MathUtil { /// <summary> /// This is a variant of mod that wraps the mod result to avoid negative results. this is what Python's mod operator does /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> private static double mod_wrap_angle(double x, double y) { if (y == 0) { throw new System.DivideByZeroException(); } double r = x%y; if (r > 0 && y < 0) { r = r + y; } else if (r < 0 && y > 0) { r = r + y; } return r; } /// <summary> /// wraps a number around so that it always fits between 0.0 and 1.0. negative numbers will wrap around to the correct positive number /// </summary> /// <remarks> /// if the input number is already in the range, no change will occur /// </remarks> /// <param name="v">input value </param> /// <returns>the wrapped number</returns> public static double WrapAngle_0_1(double v) { const double min = 0.0; const double max = 1.0; if (IsInRange(v, min, max)) { // the number is already in the range so do nothing return v; } return mod_wrap_angle(v, max); } /// <summary> /// Checks if a value is in a range (inclusive) /// </summary> /// <param name="val"></param> /// <param name="min"></param> /// <param name="max"></param> /// <returns></returns> public static bool IsInRange(double val, double min, double max) { return ((min <= val) && (val <= max)); } /// <summary> /// Checks if a value is in the range 0.0 to 1.0 inclusive /// </summary> /// <param name="val"></param> /// <returns></returns> public static bool IsInRange_0_1(double val) { return IsInRange(val, 0.0, 1.0); } } }