/// <summary> /// 分三阶段的插值 /// </summary> /// <param name="t"> 单位化的时间, 即取值范围为 [0, 1] </param> /// <param name="t1"> 第一个时间点 </param> /// <param name="t2"> 第二个时间点 </param> /// <param name="interpolate"> 一个在 [0, 1] 上的插值方法 </param> /// <returns> [0, t1) 返回插值方法前一半,(t2, 1] 返回插值方法后一半,[t1, t2] 返回 0.5 处的值 </returns> public static float InterpolateInThreePhases( float t, float t1, float t2, Func<float, float> interpolate) { if (t2 < t1) Kit.Swap(ref t1, ref t2); if (t < t1) return interpolate(t / t1 * 0.5f); if (t > t2) return interpolate((t - t2) / (1.0f - t2) * 0.5f + 0.5f); return interpolate(0.5f); }
/// <summary> /// 返回一个指定范围内的随机整数 /// </summary> /// <param name="minValue"> 返回的随机数的下界(包含) </param> /// <param name="maxValue"> 返回的随机数的上界(不包含) </param> /// <returns> [minValue, maxValue) 范围的均匀分布随机数 </returns> public int Range(int minValue, int maxValue) { if (minValue > maxValue) Kit.Swap(ref minValue, ref maxValue); return minValue + (int)((maxValue - minValue) * Range01()); }
/// <summary> /// 确保最小最大值关系正确 /// </summary> public void OrderMinMax() { if (min > max) Kit.Swap(ref min, ref max); }
/// <summary> /// 返回一个指定范围内的随机浮点数 /// </summary> /// <param name="minValue"> 返回的随机数的下界(包含) </param> /// <param name="maxValue"> 返回的随机数的上界(不包含) </param> /// <returns> [minValue, maxValue) 范围的均匀分布随机数 </returns> public float Range(float minValue, float maxValue) { if (minValue > maxValue) Kit.Swap(ref minValue, ref maxValue); return minValue + (maxValue - minValue) * (float)Range01(); }