Source: utils/math.js

/**
 * Math utility functions and constant variables.
 *
 * @module engine/utils/math
 */

const math = {
  /**
   * PI * 2
   * @type {number}
   */
  PI_2: Math.PI * 2,
  /**
   * Half PI
   * @type {number}
   */
  HALF_PI: Math.PI * 0.5,

  /**
   * Force a value within the boundaries by clamping `x` to the range `[a, b]`.
   *
   * @param {number} x Target value to clamp
   * @param {number} a Min value
   * @param {number} b Max value
   * @return {number} Clamped value
   */
  clamp: function(x, a, b) {
    return (x < a) ? a : ((x > b) ? b : x);
  },

  /**
   * Bring the value between min and max.
   *
   * Values larger than `max` are wrapped back to `min`
   * and vice-versa.
   *
   * @param {number}  value value to process
   * @param {number}  min lowest valid value
   * @param {number}  max largest valid value
   * @return {number} result
   */
  wrap: function(value, min, max) {
    if (value < min) {return max + (value % max);}
    if (value >= max) {return value % max;}
    return value;
  },

  /**
   * Bring the value between 0 and 2*PI.
   *
   * Valid values for the length of a circle in radians is
   * 2*PI.
   *
   * @param {number}  val value to process
   * @return {number} a value in 0..2*PI interval
   */
  circWrap: function(val) {
    return math.wrap(val, 0, math.PI_2);
  },
};

module.exports = math;