Source: mathHelper.js

/*
 * kollavarsham
 * http://kollavarsham.org
 *
 * Copyright (c) 2014-2023 The Kollavarsham Team
 * Licensed under the MIT license.
 */
/**
 * @module mathHelper
 */
const _epsilon = 1e-8; // eslint-disable-line no-underscore-dangle
const _radianInDegrees = 180 / Math.PI; // eslint-disable-line no-underscore-dangle
/**
 *
 *  **INTERNAL/PRIVATE**
 *
 * @class MathHelper
 */
export class MathHelper {
    static get epsilon() {
        return _epsilon;
    }
    static get radianInDegrees() {
        return _radianInDegrees;
    }
    static isNumber(n) {
        return !isNaN(parseFloat(n)) && isFinite(n);
    }
    static isInt(n) {
        return MathHelper.isNumber(n) && n % 1 === 0;
    }
    static truncateDecimals(num, digits) {
        // Thanks Nick Knowlson! - http://stackoverflow.com/a/9232092/218882
        //     (The original from that answer has a bug though, where an integer was getting rounded to "".
        //      Caught it while getting calendar.gregorianDateToJulianDay to work. 2 hours... Phew!)
        const numS = num.toString();
        const decPos = numS.indexOf('.');
        const result = decPos === -1 ? num.toString() : numS.substr(0, 1 + decPos + digits);
        const resultAsNumber = parseFloat(result);
        return isNaN(resultAsNumber) ? 0 : resultAsNumber;
    }
    static truncate(n) {
        return MathHelper.truncateDecimals(n, 0);
    }
    static floor(n) {
        const result = Math.floor(n);
        return isNaN(result) ? 0 : result;
    }
    static fractional(n) {
        const result = n % 1;
        return isNaN(result) ? 0 : result;
    }
    static round(n) {
        return MathHelper.isNumber(n) ? MathHelper.floor(parseFloat(n) + 0.5) : 0;
    }
    static square(n) {
        return MathHelper.isNumber(n) ? Math.pow(parseFloat(n), 2) : 0;
    }
    static zero360(angleInDegrees) {
        const result = angleInDegrees - MathHelper.truncate(angleInDegrees / 360) * 360;
        return result < 0 ? 360 + result : result;
    }
}