Skip to content

Source: lib/util/math.js

/**
 * Conversion factor for degrees to radians.
 * @constant {number}
 * @memberof module:lib/util/math
 * @default
 */
export const deg2rad = Math.PI / 180;

/**
 * Conversion factor for radians to degrees.
 * @constant {number}
 * @memberof module:lib/util/math
 * @default
 */
export const rad2deg = 180 / Math.PI;

/**
 * Utility module for common mathematical operations.
 * Includes functions for clamping, linear interpolation, damping, and range conversions.
 * @module lib/util/math
 * @author Frank Kudermann - alphanull
 * @version 1.0.0
 * @license MIT
 */

/**
 * Clamps a number between a minimum and maximum value.
 * @memberof module:lib/util/math
 * @param   {number} num  The number to clamp.
 * @param   {number} min  The minimum value.
 * @param   {number} max  The maximum value.
 * @returns {number}      The clamped number.
 */
export function clamp(num, min, max) {
    return Math.min(Math.max(num, min), max);
}

/**
 * Linearly interpolates between two values.
 * @memberof module:lib/util/math
 * @param   {number} start  The starting value.
 * @param   {number} end    The ending value.
 * @param   {number} amt    The interpolation factor (0-1).
 * @returns {number}        The interpolated value.
 */
export function lerp(start, end, amt) {
    return (1 - amt) * start + amt * end;
}

/**
 * Exponentially damps a value towards a target over time.
 * @memberof module:lib/util/math
 * @param   {number} x       The current value.
 * @param   {number} y       The target value.
 * @param   {number} lambda  The damping factor.
 * @param   {number} dt      The time delta.
 * @returns {number}         The damped value.
 */
export function damp(x, y, lambda, dt) {
    return lerp(x, y, 1 - Math.exp(-lambda * dt));
}

/**
 * Converts a value from one range to another.
 * @memberof module:lib/util/math
 * @param   {number}   value  The value to convert.
 * @param   {number[]} r1     The source range [min, max].
 * @param   {number[]} r2     The target range [min, max].
 * @returns {number}          The converted value in the target range.
 */
export function convertRange(value, r1, r2) {
    return (value - r1[0]) * (r2[1] - r2[0]) / (r1[1] - r1[0]) + r2[0];
}

/**
 * Converts a value from one range to another, clamping the result.
 * @memberof module:lib/util/math
 * @param   {number}   value  The value to convert.
 * @param   {number[]} r1     The source range [min, max].
 * @param   {number[]} r2     The target range [min, max].
 * @returns {number}          The clamped value in the target range.
 */
export function convertRangeClamp(value, r1, r2) {
    return clamp((value - r1[0]) * (r2[1] - r2[0]) / (r1[1] - r1[0]) + r2[0], r2[0], r2[1]);
}