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;