namespace GFramework.Core.extensions; /// /// 数值扩展方法 /// public static class NumericExtensions { /// /// 将值限制在指定的范围内 /// /// 实现 IComparable 的类型 /// 要限制的值 /// 最小值 /// 最大值 /// 限制后的值 /// 当 value、min 或 max 为 null 时抛出 /// 当 min 大于 max 时抛出 /// /// /// var value = 150; /// var clamped = value.Clamp(0, 100); // 返回 100 /// /// public static T Clamp(this T value, T min, T max) where T : IComparable { ArgumentNullException.ThrowIfNull(value); ArgumentNullException.ThrowIfNull(min); ArgumentNullException.ThrowIfNull(max); if (min.CompareTo(max) > 0) throw new ArgumentException($"最小值 ({min}) 不能大于最大值 ({max})"); if (value.CompareTo(min) < 0) return min; if (value.CompareTo(max) > 0) return max; return value; } /// /// 检查值是否在指定范围内 /// /// 实现 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 { ArgumentNullException.ThrowIfNull(value); ArgumentNullException.ThrowIfNull(min); ArgumentNullException.ThrowIfNull(max); 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); } }