StructureJS
0.15.2A class based utility library for building modular and scalable web platform applications. Features opt-in classes and utilities which provide a solid foundation and toolset to build your next project.
- /**
- * A helper class to do calculations and conversions.
- *
- * @class MathUtil
- * @module StructureJS
- * @submodule util
- * @author Robert S. (www.codeBelt.com)
- * @static
- */
- class MathUtil
- {
- constructor()
- {
- throw new Error('[MathUtil] Do not instantiate the MathUtil class because it is a static class.');
- }
- /**
- * Returns a number constrained between min and max.
- *
- * @method constrain
- * @param num {number}
- * @param min {number}
- * @param max {number}
- * @return {number}
- * @example
- * MathUtil.constrain(12, 3, 20);
- * // 12
- *
- * MathUtil.constrain(22, 3, 20);
- * // 20
- *
- * MathUtil.constrain(0, 3, 20);
- * // 3
- */
- public static constrain(num:number, min:number = 0, max:number = 1):number
- {
- if (num < min)
- {
- return min;
- }
- if (num > max)
- {
- return max;
- }
- return num;
- }
- /**
- * Returns a random number between min and max.
- *
- * @method randomRange
- * @param min {number}
- * @param max {number}
- * @param [wholeNumber=true] {number}
- * @return {number}
- * @example
- *
- */
- public static randomRange(min:number, max:number, wholeNumber:boolean = true):number
- {
- const num:number = (min + Math.random() * (max - min));
- if (wholeNumber)
- {
- return Math.round(num);
- }
- return num;
- }
- /**
- * Returns the percentage of a number in a given range.
- * Example: num = 15 range 10 to 20 // outputs 0.5
- *
- * @method rangeToPercent
- * @param num {number}
- * @param min {number}
- * @param max {number}
- * @param constrainMin {boolean} Returns 0 if num < min.
- * @param constrainMax {boolean} Returns 1 if num > max.
- * @return {number}
- * @example
- * MathUtil.rangeToPercent(15, 10, 20);
- * // 0.5
- */
- public static rangeToPercent(num:number, min:number, max:number, constrainMin:boolean = false, constrainMax:boolean = false):number
- {
- if (constrainMin && num < min)
- {
- return 0;
- }
- if (constrainMax && num > max)
- {
- return 1;
- }
- return (num - min) / (max - min);
- }
- /**
- * Returns the number that corresponds to the percentage in a given range.
- * Example: percent = 0.5 range 10 to 20 // outputs 15
- *
- * @method percentToRange
- * @param percent {number}
- * @param min {number}
- * @param max {number}
- * @return {number}
- * @example
- * MathUtil.percentToRange(0.5, 10, 20);
- * // 15
- */
- public static percentToRange(percent:number, min:number, max:number):number
- {
- return (percent * (max - min)) + min;
- }
- /**
- * Re-maps a number from one range to another. The output is the same as inputing the result of rangeToPercent() numbero percentToRange().
- * Example: num = 10, min1 = 0, max1 = 100, min2 = 0, max2 = 50 // outputs 5
- *
- * @method map
- * @param num {number}
- * @param min1 {number}
- * @param max1 {number}
- * @param min2 {number}
- * @param max2 {number}
- * @return {number}
- * @example
- * MathUtil.map(10, 0, 100, 0, 50);
- * // 5
- */
- public static map(num:number, min1:number, max1:number, min2:number, max2:number, round:boolean = true, constrainMin:boolean = true, constrainMax:boolean = true):number
- {
- if (constrainMin && num < min1)
- {
- return min2;
- }
- if (constrainMax && num > max1)
- {
- return max2;
- }
- const num1:number = (num - min1) / (max1 - min1);
- const num2:number = (num1 * (max2 - min2)) + min2;
- if (round)
- {
- return Math.round(num2);
- }
- return num2;
- }
- /**
- * Converts radians to degrees.
- *
- * @method radiansToDegrees
- * @param radians {number}
- * @return {number}
- * @example
- * MathUtil.radiansToDegrees(1.5707963267948966);
- * // 90
- *
- * MathUtil.radiansToDegrees(3.141592653589793);
- * // 180
- */
- public static radiansToDegrees(radians:number):number
- {
- return radians * (180 / Math.PI);
- }
- /**
- * Converts degrees to radians.
- *
- * @method degreesToRadians
- * @param degrees {number}
- * @return {number}
- * @example
- * MathUtil.degreesToRadians(90);
- * // 1.5707963267948966
- *
- * MathUtil.degreesToRadians(180);
- * // 3.141592653589793
- */
- public static degreesToRadians(degrees:number):number
- {
- return (degrees * Math.PI / 180);
- }
- /**
- * Returns 1 if the value is >= 0. Returns -1 if the value is < 0.
- *
- * @method sign
- * @param num {number}
- * @return {number}
- * @example
- * MathUtil.sign(23);
- * // 1
- *
- * MathUtil.sign(-23);
- * // -1
- */
- public static sign(num:number):number
- {
- if (num < 0)
- {
- return -1
- }
- return 1;
- }
- /**
- * Check if number is positive (zero is positive).
- *
- * @method isPositive
- * @param num {number} The number.
- * @return {boolean}
- * @example
- * MathUtil.isPositive(23);
- * // true
- *
- * MathUtil.isPositive(-23);
- * // false
- */
- public static isPositive(num:number):boolean
- {
- return (num >= 0);
- }
- /**
- * Check if number is negative.
- *
- * @method isNegative
- * @param num {number} The
- * @return {boolean}
- * @example
- * MathUtil.isNegative(23);
- * // false
- *
- * MathUtil.isNegative(-23);
- * // true
- */
- public static isNegative(num:number):boolean
- {
- return (num < 0);
- }
- /**
- * Check if number is odd (convert to Integer if necessary).
- *
- * @method isOdd
- * @param num {number} The number.
- * @return {boolean}
- * @example
- * MathUtil.isOdd(2);
- * // false
- *
- * MathUtil.isOdd(3);
- * // true
- */
- public static isOdd(num:number):boolean
- {
- const i:number = num;
- const e:number = 2;
- return Boolean(i % e);
- }
- /**
- * Check if number is even (convert to Integer if necessary).
- *
- * @method isEven
- * @param num {number} The number.
- * @return {boolean}
- * @example
- * MathUtil.isEven(2);
- * // true
- *
- * MathUtil.isEven(3);
- * // false
- */
- public static isEven(num:number):boolean
- {
- const int:number = num;
- const e:number = 2;
- return (int % e == 0);
- }
- /**
- * Check if number is Prime (divisible only by itself and one).
- *
- * @method isPrime
- * @param num {number} The number.
- * @return {boolean}
- * @example
- * MathUtil.isPrime(4);
- * // false
- *
- * MathUtil.isPrime(5);
- * // true
- */
- public static isPrime(num:number):boolean
- {
- if (num > 2 && num % 2 == 0)
- {
- return false;
- }
- const l:number = Math.sqrt(num);
- let i:number = 3;
- for (i; i <= l; i += 2)
- {
- if (num % i == 0)
- {
- return false;
- }
- }
- return true;
- }
- /**
- * Calculate the factorial of the integer.
- *
- * @method factorial
- * @param num {number} The number.
- * @return {number}
- * @example
- * MathUtil.factorial(5);
- * // 120
- *
- * MathUtil.factorial(9);
- * // 362880
- */
- public static factorial(num:number):number
- {
- if (num == 0)
- {
- return 1;
- }
- let d:number = <number>num.valueOf();
- let i:number = d - 1;
- while (i)
- {
- d = d * i;
- i--;
- }
- return d;
- }
- /**
- * Return an array of divisors of the integer.
- *
- * @method getDivisors
- * @param num {number} The number.
- * @return {Array.<number>}
- * @example
- *
- */
- public static getDivisors(num:number):Array<number>
- {
- const r:Array<number> = [];
- for (let i:number = 1, e:number = num / 2; i <= e; i++)
- {
- if (num % i == 0)
- {
- r.push(i);
- }
- }
- if (num != 0)
- {
- r.push(<number>num.valueOf());
- }
- return r;
- }
- }
- export default MathUtil;