/*** 数学计算工具函数
 */

/*** 将数值限制在指定范围内
 * @paramvalue 要限制的值
 * @parammin 最小值
 * @parammax 最大值
 */export const clamp = (value: number, min: number, max: number): number => {
    return Math.min(Math.max(value, min), max);
};

/**
 * 将数值四舍五入到指定小数位
 * @param value要四舍五入的值* @param decimals 保留的小数位数
 */export const round = (value: number, decimals: number = 0): number => {
    const multiplier = Math.pow(10, decimals);
    return Math.round(value * multiplier) / multiplier;
};/**
 * 生成指定范围内的随机数* @param min 最小值* @param max 最大值* @param isInteger 是否为整数,默认false
 */
export const random = (min: number, max: number, isInteger: boolean = false): number => {
    const value = Math.random() * (max - min) + min;
    return isInteger ? Math.floor(value) : value;
};

/*** 计算数组的平均值* @param numbers 数字数组
 */export const average = (numbers: number[]): number => {
    if (numbers.length === 0) return 0;
    return numbers.reduce((sum, num) => sum + num, 0) / numbers.length;
};

/**
 * 计算数组的总和
 * @param numbers 数字数组
 */export const sum = (numbers: number[]): number => {
    return numbers.reduce((sum, num) => sum + num, 0);
};

/**
 *角度转弧度
 * @paramdegrees 角度
 */
export const degreesToRadians = (degrees: number): number => {
    return degrees * (Math.PI / 180);
};/**
 * 弧度转角度
 * @param radians弧度
 */
export const radiansToDegrees = (radians: number): number => {
    return radians * (180 / Math.PI);
};/**
 * 格式化数字为千分位表示
 * @param value 要格式化的数值*/
export const formatThousands = (value: number): string => {
    return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
};

/*** 计算百分比* @param value 当前值
 *@param total 总值
 *@param decimals 保留小数位数
 */
export const percentage = (value: number, total: number, decimals: number = 2): number => {
    if (total === 0) return 0; return round((value / total) * 100, decimals);
};

/*** 判断两个数值是否近似相等
 * @param a第一个数值
 * @paramb 第二个数值
 *@param epsilon 误差范围,默认0.000001
 */
export const approximatelyEqual = (a: number, b: number, epsilon: number = 0.000001): boolean => {
    return Math.abs(a - b) < epsilon;
};

/**
 * 将数值转换为带单位的字符串(K, M, B等)
 * @param value 要转换的数值
 */
export const formatUnit = (value: number): string => {
    const units = ["", "K", "M", "B", "T"];
    const order = Math.floor(Math.log10(Math.abs(value)) / 3); if (order < 0) return value.toString();
    const unit = units[order]; const scaled = value / Math.pow(10, order * 3);
    return `${round(scaled, 1)}${unit}`;
};

/**
 * 计算两点之间的距离* @param x1 第一个点的x坐标
 *@param y1 第一个点的y坐标
 * @param x2 第二个点的x坐标
 * @param y2 第二个点的y坐标*/
export const distance = (x1: number, y1: number, x2: number, y2: number): number => {
    return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
};/**
 * 线性插值* @param start 起始值
 * @param end 结束值
 * @param t 插值系数(0-1)*/
export const lerp = (start: number, end: number, t: number): number => {
    return start + (end - start) * clamp(t, 0, 1);
};