private function calculateGrowth($progress) {// 使用多個增長階段模擬不均勻性if ($progress < 0.3) {// 前30%時間:緩慢增長 30 %return pow($progress / 0.3, 0.7) * 0.3;} elseif ($progress < 0.7) {// 中間40%時間:快速增長 50%return 0.3 + (($progress - 0.3) / 0.4) * 0.5;} else {// 后30%時間:減速增長 20%return 0.8 + pow(($progress - 0.7) / 0.3, 1.5) * 0.2;}}
函數的核心作用
接收一個 $progress
(進度)參數(范圍應該是 0 到 1 之間的數值),返回一個對應的"增長值"(同樣是 0 到 1 之間)。通過分段計算,模擬現實中常見的"先慢、中快、后緩"的非線性增長過程。
三個增長階段的詳細解析
-
第一階段:前30%進度(緩慢增長)
if ($progress < 0.3) {return pow($progress / 0.3, 0.7) * 0.3; }
- 適用范圍:當進度小于 30%(0 ~ 0.3)時
- 計算邏輯:
- 先將進度歸一化:
$progress / 0.3
(把 0~0.3 的范圍映射到 0~1) - 用指數函數
pow(x, 0.7)
處理:因為指數 0.7 小于 1,會產生"增長越來越慢"的效果 - 最后乘以 0.3:將結果限制在 0~0.3 范圍內(占總增長的 30%)
- 先將進度歸一化:
- 效果:前期增長緩慢,進度推進很多但實際增長值增加較少
-
第二階段:中間40%進度(快速增長)
elseif ($progress < 0.7) {return 0.3 + (($progress - 0.3) / 0.4) * 0.5; }
- 適用范圍:當進度在 30%~70%(0.3 ~ 0.7)時
- 計算邏輯:
- 基礎值 0.3:承接第一階段的終點
- 歸一化處理:
($progress - 0.3) / 0.4
(把 0.3~0.7 的范圍映射到 0~1) - 線性增長:直接乘以 0.5(這部分貢獻總增長的 50%)
- 效果:這一階段是線性增長,也是整個過程中增長最快的階段(用 40% 的進度完成 50% 的增長)
-
第三階段:后30%進度(減速增長)
else {return 0.8 + pow(($progress - 0.7) / 0.3, 1.5) * 0.2; }
- 適用范圍:當進度在 70%~100%(0.7 ~ 1.0)時
- 計算邏輯:
- 基礎值 0.8:承接前兩階段的總和(30% + 50%)
- 歸一化處理:
($progress - 0.7) / 0.3
(把 0.7~1.0 的范圍映射到 0~1) - 用指數函數
pow(x, 1.5)
處理:因為指數 1.5 大于 1,會產生"先慢后快但整體增長減速"的效果 - 最后乘以 0.2:將結果限制在 0~0.2 范圍內(占總增長的 20%)
- 效果:后期增長放緩,需要推進較多進度才能完成最后的增長
整體增長曲線特點
- 總增長分配:30%(第一階段) + 50%(第二階段) + 20%(第三階段) = 100%
- 增長節奏:慢 → 快 → 慢,符合很多自然和人工過程的增長規律(如學習曲線、項目進度、產品 adoption 等)
- 非線性特征:通過指數函數(0.7 和 1.5)實現了階段內的非線性增長,比單純的三段線性更貼近真實情況
這個函數可以用于模擬各種需要非線性增長的場景,如進度條動畫、技能熟練度提升、任務完成度計算等。