namespace GFramework.Core.extensions;
///
/// 数值扩展方法
///
public static class NumericExtensions
{
///
/// 检查值是否在指定范围内
///
/// 实现 IComparable 的类型
/// 要检查的值
/// 最小值
/// 最大值
/// 是否包含边界值,默认为 true
/// 如果值在范围内则返回 true,否则返回 false
/// 当 value、min 或 max 为 null 时抛出
/// 当 min 大于 max 时抛出
///
///
/// var value = 50;
/// var inRange = value.Between(0, 100); // 返回 true
/// var inRangeExclusive = value.Between(50, 100, inclusive: false); // 返回 false
///
///
public static bool Between(this T value, T min, T max, bool inclusive = true) where T : IComparable
{
if (min.CompareTo(max) > 0)
throw new ArgumentException($"最小值 ({min}) 不能大于最大值 ({max})");
if (inclusive)
return value.CompareTo(min) >= 0 && value.CompareTo(max) <= 0;
return value.CompareTo(min) > 0 && value.CompareTo(max) < 0;
}
///
/// 在两个值之间进行线性插值
///
/// 起始值
/// 目标值
/// 插值参数(0 到 1 之间)
/// 插值结果
///
///
/// var result = 0f.Lerp(100f, 0.5f); // 返回 50
///
///
public static float Lerp(this float from, float to, float t)
{
return from + (to - from) * t;
}
///
/// 计算值在两个值之间的插值参数
///
/// 当前值
/// 起始值
/// 目标值
/// 插值参数(通常在 0 到 1 之间)
/// 当 from 等于 to 时抛出
///
///
/// var t = 50f.InverseLerp(0f, 100f); // 返回 0.5
///
///
public static float InverseLerp(this float value, float from, float to)
{
if (Math.Abs(to - from) < float.Epsilon)
throw new DivideByZeroException("起始值和目标值不能相等");
return (value - from) / (to - from);
}
}