@esengine/ecs-framework-math 1.0.3 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/LICENSE +21 -0
  2. package/bin/Animation/Easing.d.ts +150 -150
  3. package/bin/Animation/Easing.d.ts.map +1 -1
  4. package/bin/Animation/Easing.js +151 -151
  5. package/bin/Animation/Easing.js.map +1 -1
  6. package/bin/Animation/Interpolation.d.ts +102 -102
  7. package/bin/Animation/Interpolation.d.ts.map +1 -1
  8. package/bin/Animation/Interpolation.js +104 -104
  9. package/bin/Animation/Interpolation.js.map +1 -1
  10. package/bin/Animation/index.d.ts.map +1 -1
  11. package/bin/Animation/index.js.map +1 -1
  12. package/bin/Circle.d.ts +159 -159
  13. package/bin/Circle.d.ts.map +1 -1
  14. package/bin/Circle.js +159 -159
  15. package/bin/Circle.js.map +1 -1
  16. package/bin/Collision/CollisionDetector.d.ts +64 -64
  17. package/bin/Collision/CollisionDetector.d.ts.map +1 -1
  18. package/bin/Collision/CollisionDetector.js +66 -66
  19. package/bin/Collision/CollisionDetector.js.map +1 -1
  20. package/bin/Color.d.ts +277 -0
  21. package/bin/Color.d.ts.map +1 -0
  22. package/bin/Color.js +470 -0
  23. package/bin/Color.js.map +1 -0
  24. package/bin/Fixed32.d.ts +266 -0
  25. package/bin/Fixed32.d.ts.map +1 -0
  26. package/bin/Fixed32.js +381 -0
  27. package/bin/Fixed32.js.map +1 -0
  28. package/bin/FixedMath.d.ts +109 -0
  29. package/bin/FixedMath.d.ts.map +1 -0
  30. package/bin/FixedMath.js +264 -0
  31. package/bin/FixedMath.js.map +1 -0
  32. package/bin/FixedVector2.d.ts +293 -0
  33. package/bin/FixedVector2.d.ts.map +1 -0
  34. package/bin/FixedVector2.js +413 -0
  35. package/bin/FixedVector2.js.map +1 -0
  36. package/bin/MathUtils.d.ts +205 -205
  37. package/bin/MathUtils.d.ts.map +1 -1
  38. package/bin/MathUtils.js +206 -206
  39. package/bin/MathUtils.js.map +1 -1
  40. package/bin/Matrix3.d.ts +158 -139
  41. package/bin/Matrix3.d.ts.map +1 -1
  42. package/bin/Matrix3.js +179 -151
  43. package/bin/Matrix3.js.map +1 -1
  44. package/bin/Rectangle.d.ts +144 -144
  45. package/bin/Rectangle.d.ts.map +1 -1
  46. package/bin/Rectangle.js +144 -144
  47. package/bin/Rectangle.js.map +1 -1
  48. package/bin/Vector2.d.ts +202 -186
  49. package/bin/Vector2.d.ts.map +1 -1
  50. package/bin/Vector2.js +198 -188
  51. package/bin/Vector2.js.map +1 -1
  52. package/bin/Vector3.d.ts +257 -0
  53. package/bin/Vector3.d.ts.map +1 -0
  54. package/bin/Vector3.js +372 -0
  55. package/bin/Vector3.js.map +1 -0
  56. package/bin/index.d.ts +8 -1
  57. package/bin/index.d.ts.map +1 -1
  58. package/bin/index.js +9 -0
  59. package/bin/index.js.map +1 -1
  60. package/package.json +66 -67
package/bin/MathUtils.js CHANGED
@@ -7,26 +7,26 @@ import { Vector2 } from './Vector2';
7
7
  export class MathUtils {
8
8
  // 角度转换
9
9
  /**
10
- * 角度转弧度
11
- * @param degrees 角度值
12
- * @returns 弧度值
13
- */
10
+ * 角度转弧度
11
+ * @param degrees 角度值
12
+ * @returns 弧度值
13
+ */
14
14
  static degToRad(degrees) {
15
15
  return degrees * MathUtils.DEG_TO_RAD;
16
16
  }
17
17
  /**
18
- * 弧度转角度
19
- * @param radians 弧度值
20
- * @returns 角度值
21
- */
18
+ * 弧度转角度
19
+ * @param radians 弧度值
20
+ * @returns 角度值
21
+ */
22
22
  static radToDeg(radians) {
23
23
  return radians * MathUtils.RAD_TO_DEG;
24
24
  }
25
25
  /**
26
- * 规范化角度到[0, 2π)范围
27
- * @param radians 角度(弧度)
28
- * @returns 规范化后的角度
29
- */
26
+ * 规范化角度到[0, 2π)范围
27
+ * @param radians 角度(弧度)
28
+ * @returns 规范化后的角度
29
+ */
30
30
  static normalizeAngle(radians) {
31
31
  while (radians < 0)
32
32
  radians += MathUtils.TWO_PI;
@@ -35,10 +35,10 @@ export class MathUtils {
35
35
  return radians;
36
36
  }
37
37
  /**
38
- * 规范化角度到(-π, π]范围
39
- * @param radians 角度(弧度)
40
- * @returns 规范化后的角度
41
- */
38
+ * 规范化角度到(-π, π]范围
39
+ * @param radians 角度(弧度)
40
+ * @returns 规范化后的角度
41
+ */
42
42
  static normalizeAngleSigned(radians) {
43
43
  while (radians <= -Math.PI)
44
44
  radians += MathUtils.TWO_PI;
@@ -47,63 +47,63 @@ export class MathUtils {
47
47
  return radians;
48
48
  }
49
49
  /**
50
- * 计算两个角度之间的最短角度差
51
- * @param from 起始角度(弧度)
52
- * @param to 目标角度(弧度)
53
- * @returns 角度差(-π到π)
54
- */
50
+ * 计算两个角度之间的最短角度差
51
+ * @param from 起始角度(弧度)
52
+ * @param to 目标角度(弧度)
53
+ * @returns 角度差(-π到π)
54
+ */
55
55
  static angleDifference(from, to) {
56
56
  let diff = to - from;
57
57
  diff = MathUtils.normalizeAngleSigned(diff);
58
58
  return diff;
59
59
  }
60
60
  /**
61
- * 角度插值(处理角度环绕)
62
- * @param from 起始角度(弧度)
63
- * @param to 目标角度(弧度)
64
- * @param t 插值参数(0到1)
65
- * @returns 插值结果角度
66
- */
61
+ * 角度插值(处理角度环绕)
62
+ * @param from 起始角度(弧度)
63
+ * @param to 目标角度(弧度)
64
+ * @param t 插值参数(0到1)
65
+ * @returns 插值结果角度
66
+ */
67
67
  static lerpAngle(from, to, t) {
68
68
  const diff = MathUtils.angleDifference(from, to);
69
69
  return from + diff * t;
70
70
  }
71
71
  // 数值操作
72
72
  /**
73
- * 限制数值在指定范围内
74
- * @param value 待限制的值
75
- * @param min 最小值
76
- * @param max 最大值
77
- * @returns 限制后的值
78
- */
73
+ * 限制数值在指定范围内
74
+ * @param value 待限制的值
75
+ * @param min 最小值
76
+ * @param max 最大值
77
+ * @returns 限制后的值
78
+ */
79
79
  static clamp(value, min, max) {
80
80
  return Math.max(min, Math.min(max, value));
81
81
  }
82
82
  /**
83
- * 限制数值在0到1之间
84
- * @param value 待限制的值
85
- * @returns 限制后的值
86
- */
83
+ * 限制数值在0到1之间
84
+ * @param value 待限制的值
85
+ * @returns 限制后的值
86
+ */
87
87
  static clamp01(value) {
88
88
  return Math.max(0, Math.min(1, value));
89
89
  }
90
90
  /**
91
- * 线性插值
92
- * @param a 起始值
93
- * @param b 目标值
94
- * @param t 插值参数(0到1)
95
- * @returns 插值结果
96
- */
91
+ * 线性插值
92
+ * @param a 起始值
93
+ * @param b 目标值
94
+ * @param t 插值参数(0到1)
95
+ * @returns 插值结果
96
+ */
97
97
  static lerp(a, b, t) {
98
98
  return a + (b - a) * t;
99
99
  }
100
100
  /**
101
- * 反向线性插值(获取插值参数)
102
- * @param a 起始值
103
- * @param b 目标值
104
- * @param value 当前值
105
- * @returns 插值参数
106
- */
101
+ * 反向线性插值(获取插值参数)
102
+ * @param a 起始值
103
+ * @param b 目标值
104
+ * @param value 当前值
105
+ * @returns 插值参数
106
+ */
107
107
  static inverseLerp(a, b, value) {
108
108
  if (Math.abs(b - a) < MathUtils.EPSILON) {
109
109
  return 0;
@@ -111,132 +111,132 @@ export class MathUtils {
111
111
  return (value - a) / (b - a);
112
112
  }
113
113
  /**
114
- * 重映射数值从一个范围到另一个范围
115
- * @param value 输入值
116
- * @param inMin 输入范围最小值
117
- * @param inMax 输入范围最大值
118
- * @param outMin 输出范围最小值
119
- * @param outMax 输出范围最大值
120
- * @returns 重映射后的值
121
- */
114
+ * 重映射数值从一个范围到另一个范围
115
+ * @param value 输入值
116
+ * @param inMin 输入范围最小值
117
+ * @param inMax 输入范围最大值
118
+ * @param outMin 输出范围最小值
119
+ * @param outMax 输出范围最大值
120
+ * @returns 重映射后的值
121
+ */
122
122
  static remap(value, inMin, inMax, outMin, outMax) {
123
123
  const t = MathUtils.inverseLerp(inMin, inMax, value);
124
124
  return MathUtils.lerp(outMin, outMax, t);
125
125
  }
126
126
  /**
127
- * 平滑阶跃函数(Hermite插值)
128
- * @param t 输入参数(0到1)
129
- * @returns 平滑输出(0到1)
130
- */
127
+ * 平滑阶跃函数(Hermite插值)
128
+ * @param t 输入参数(0到1)
129
+ * @returns 平滑输出(0到1)
130
+ */
131
131
  static smoothStep(t) {
132
132
  t = MathUtils.clamp01(t);
133
133
  return t * t * (3 - 2 * t);
134
134
  }
135
135
  /**
136
- * 更平滑的阶跃函数
137
- * @param t 输入参数(0到1)
138
- * @returns 平滑输出(0到1)
139
- */
136
+ * 更平滑的阶跃函数
137
+ * @param t 输入参数(0到1)
138
+ * @returns 平滑输出(0到1)
139
+ */
140
140
  static smootherStep(t) {
141
141
  t = MathUtils.clamp01(t);
142
142
  return t * t * t * (t * (t * 6 - 15) + 10);
143
143
  }
144
144
  // 比较操作
145
145
  /**
146
- * 浮点数相等比较
147
- * @param a 数值a
148
- * @param b 数值b
149
- * @param epsilon 容差,默认为EPSILON
150
- * @returns 是否相等
151
- */
146
+ * 浮点数相等比较
147
+ * @param a 数值a
148
+ * @param b 数值b
149
+ * @param epsilon 容差,默认为EPSILON
150
+ * @returns 是否相等
151
+ */
152
152
  static approximately(a, b, epsilon = MathUtils.EPSILON) {
153
153
  return Math.abs(a - b) < epsilon;
154
154
  }
155
155
  /**
156
- * 检查数值是否为零
157
- * @param value 数值
158
- * @param epsilon 容差,默认为EPSILON
159
- * @returns 是否为零
160
- */
156
+ * 检查数值是否为零
157
+ * @param value 数值
158
+ * @param epsilon 容差,默认为EPSILON
159
+ * @returns 是否为零
160
+ */
161
161
  static isZero(value, epsilon = MathUtils.EPSILON) {
162
162
  return Math.abs(value) < epsilon;
163
163
  }
164
164
  /**
165
- * 获取数值的符号
166
- * @param value 数值
167
- * @returns 1、-1或0
168
- */
165
+ * 获取数值的符号
166
+ * @param value 数值
167
+ * @returns 1、-1或0
168
+ */
169
169
  static sign(value) {
170
170
  return value > 0 ? 1 : value < 0 ? -1 : 0;
171
171
  }
172
172
  // 随机数生成
173
173
  /**
174
- * 生成指定范围内的随机数
175
- * @param min 最小值(包含)
176
- * @param max 最大值(不包含)
177
- * @returns 随机数
178
- */
174
+ * 生成指定范围内的随机数
175
+ * @param min 最小值(包含)
176
+ * @param max 最大值(不包含)
177
+ * @returns 随机数
178
+ */
179
179
  static random(min = 0, max = 1) {
180
180
  return Math.random() * (max - min) + min;
181
181
  }
182
182
  /**
183
- * 生成指定范围内的随机整数
184
- * @param min 最小值(包含)
185
- * @param max 最大值(包含)
186
- * @returns 随机整数
187
- */
183
+ * 生成指定范围内的随机整数
184
+ * @param min 最小值(包含)
185
+ * @param max 最大值(包含)
186
+ * @returns 随机整数
187
+ */
188
188
  static randomInt(min, max) {
189
189
  return Math.floor(Math.random() * (max - min + 1)) + min;
190
190
  }
191
191
  /**
192
- * 随机选择数组中的一个元素
193
- * @param array 数组
194
- * @returns 随机元素
195
- */
192
+ * 随机选择数组中的一个元素
193
+ * @param array 数组
194
+ * @returns 随机元素
195
+ */
196
196
  static randomChoice(array) {
197
197
  return array[Math.floor(Math.random() * array.length)];
198
198
  }
199
199
  /**
200
- * 生成随机布尔值
201
- * @param probability 为true的概率(0到1),默认0.5
202
- * @returns 随机布尔值
203
- */
200
+ * 生成随机布尔值
201
+ * @param probability 为true的概率(0到1),默认0.5
202
+ * @returns 随机布尔值
203
+ */
204
204
  static randomBoolean(probability = 0.5) {
205
205
  return Math.random() < probability;
206
206
  }
207
207
  /**
208
- * 生成单位圆内的随机点
209
- * @returns 随机向量
210
- */
208
+ * 生成单位圆内的随机点
209
+ * @returns 随机向量
210
+ */
211
211
  static randomInUnitCircle() {
212
212
  const angle = Math.random() * MathUtils.TWO_PI;
213
213
  const radius = Math.sqrt(Math.random());
214
214
  return Vector2.fromPolar(radius, angle);
215
215
  }
216
216
  /**
217
- * 生成单位圆上的随机点
218
- * @returns 随机单位向量
219
- */
217
+ * 生成单位圆上的随机点
218
+ * @returns 随机单位向量
219
+ */
220
220
  static randomOnUnitCircle() {
221
221
  const angle = Math.random() * MathUtils.TWO_PI;
222
222
  return Vector2.fromAngle(angle);
223
223
  }
224
224
  // 数学函数
225
225
  /**
226
- * 快速平方根倒数(用于归一化)
227
- * @param value 输入值
228
- * @returns 平方根倒数
229
- */
226
+ * 快速平方根倒数(用于归一化)
227
+ * @param value 输入值
228
+ * @returns 平方根倒数
229
+ */
230
230
  static fastInverseSqrt(value) {
231
231
  // 简化版本,现代JavaScript引擎优化很好
232
232
  return 1 / Math.sqrt(value);
233
233
  }
234
234
  /**
235
- * 快速幂运算(整数指数)
236
- * @param base 底数
237
- * @param exponent 指数(整数)
238
- * @returns 幂运算结果
239
- */
235
+ * 快速幂运算(整数指数)
236
+ * @param base 底数
237
+ * @param exponent 指数(整数)
238
+ * @returns 幂运算结果
239
+ */
240
240
  static fastPow(base, exponent) {
241
241
  if (exponent === 0)
242
242
  return 1;
@@ -249,10 +249,10 @@ export class MathUtils {
249
249
  return Math.pow(base, exponent);
250
250
  }
251
251
  /**
252
- * 阶乘
253
- * @param n 非负整数
254
- * @returns 阶乘结果
255
- */
252
+ * 阶乘
253
+ * @param n 非负整数
254
+ * @returns 阶乘结果
255
+ */
256
256
  static factorial(n) {
257
257
  if (n < 0)
258
258
  return NaN;
@@ -265,11 +265,11 @@ export class MathUtils {
265
265
  return result;
266
266
  }
267
267
  /**
268
- * 最大公约数
269
- * @param a 整数a
270
- * @param b 整数b
271
- * @returns 最大公约数
272
- */
268
+ * 最大公约数
269
+ * @param a 整数a
270
+ * @param b 整数b
271
+ * @returns 最大公约数
272
+ */
273
273
  static gcd(a, b) {
274
274
  a = Math.abs(Math.floor(a));
275
275
  b = Math.abs(Math.floor(b));
@@ -281,20 +281,20 @@ export class MathUtils {
281
281
  return a;
282
282
  }
283
283
  /**
284
- * 最小公倍数
285
- * @param a 整数a
286
- * @param b 整数b
287
- * @returns 最小公倍数
288
- */
284
+ * 最小公倍数
285
+ * @param a 整数a
286
+ * @param b 整数b
287
+ * @returns 最小公倍数
288
+ */
289
289
  static lcm(a, b) {
290
290
  return Math.abs(a * b) / MathUtils.gcd(a, b);
291
291
  }
292
292
  // 序列和级数
293
293
  /**
294
- * 斐波那契数列
295
- * @param n 项数
296
- * @returns 第n项斐波那契数
297
- */
294
+ * 斐波那契数列
295
+ * @param n 项数
296
+ * @returns 第n项斐波那契数
297
+ */
298
298
  static fibonacci(n) {
299
299
  if (n <= 0)
300
300
  return 0;
@@ -309,22 +309,22 @@ export class MathUtils {
309
309
  return b;
310
310
  }
311
311
  /**
312
- * 等差数列求和
313
- * @param first 首项
314
- * @param last 末项
315
- * @param count 项数
316
- * @returns 等差数列和
317
- */
312
+ * 等差数列求和
313
+ * @param first 首项
314
+ * @param last 末项
315
+ * @param count 项数
316
+ * @returns 等差数列和
317
+ */
318
318
  static arithmeticSum(first, last, count) {
319
319
  return (first + last) * count * 0.5;
320
320
  }
321
321
  /**
322
- * 等比数列求和
323
- * @param first 首项
324
- * @param ratio 公比
325
- * @param count 项数
326
- * @returns 等比数列和
327
- */
322
+ * 等比数列求和
323
+ * @param first 首项
324
+ * @param ratio 公比
325
+ * @param count 项数
326
+ * @returns 等比数列和
327
+ */
328
328
  static geometricSum(first, ratio, count) {
329
329
  if (Math.abs(ratio - 1) < MathUtils.EPSILON) {
330
330
  return first * count;
@@ -333,13 +333,13 @@ export class MathUtils {
333
333
  }
334
334
  // 曲线和插值
335
335
  /**
336
- * 贝塞尔二次曲线
337
- * @param p0 控制点0
338
- * @param p1 控制点1
339
- * @param p2 控制点2
340
- * @param t 参数(0到1)
341
- * @returns 曲线上的点
342
- */
336
+ * 贝塞尔二次曲线
337
+ * @param p0 控制点0
338
+ * @param p1 控制点1
339
+ * @param p2 控制点2
340
+ * @param t 参数(0到1)
341
+ * @returns 曲线上的点
342
+ */
343
343
  static quadraticBezier(p0, p1, p2, t) {
344
344
  const u = 1 - t;
345
345
  const tt = t * t;
@@ -347,14 +347,14 @@ export class MathUtils {
347
347
  return new Vector2(uu * p0.x + 2 * u * t * p1.x + tt * p2.x, uu * p0.y + 2 * u * t * p1.y + tt * p2.y);
348
348
  }
349
349
  /**
350
- * 贝塞尔三次曲线
351
- * @param p0 控制点0
352
- * @param p1 控制点1
353
- * @param p2 控制点2
354
- * @param p3 控制点3
355
- * @param t 参数(0到1)
356
- * @returns 曲线上的点
357
- */
350
+ * 贝塞尔三次曲线
351
+ * @param p0 控制点0
352
+ * @param p1 控制点1
353
+ * @param p2 控制点2
354
+ * @param p3 控制点3
355
+ * @param t 参数(0到1)
356
+ * @returns 曲线上的点
357
+ */
358
358
  static cubicBezier(p0, p1, p2, p3, t) {
359
359
  const u = 1 - t;
360
360
  const tt = t * t;
@@ -364,14 +364,14 @@ export class MathUtils {
364
364
  return new Vector2(uuu * p0.x + 3 * uu * t * p1.x + 3 * u * tt * p2.x + ttt * p3.x, uuu * p0.y + 3 * uu * t * p1.y + 3 * u * tt * p2.y + ttt * p3.y);
365
365
  }
366
366
  /**
367
- * Catmull-Rom样条插值
368
- * @param p0 控制点0
369
- * @param p1 控制点1
370
- * @param p2 控制点2
371
- * @param p3 控制点3
372
- * @param t 参数(0到1)
373
- * @returns 插值结果点
374
- */
367
+ * Catmull-Rom样条插值
368
+ * @param p0 控制点0
369
+ * @param p1 控制点1
370
+ * @param p2 控制点2
371
+ * @param p3 控制点3
372
+ * @param t 参数(0到1)
373
+ * @returns 插值结果点
374
+ */
375
375
  static catmullRom(p0, p1, p2, p3, t) {
376
376
  const t2 = t * t;
377
377
  const t3 = t2 * t;
@@ -387,23 +387,23 @@ export class MathUtils {
387
387
  }
388
388
  // 噪声函数
389
389
  /**
390
- * 简单伪随机噪声(基于种子)
391
- * @param x 输入X
392
- * @param y 输入Y
393
- * @param seed 种子
394
- * @returns 噪声值(0到1)
395
- */
390
+ * 简单伪随机噪声(基于种子)
391
+ * @param x 输入X
392
+ * @param y 输入Y
393
+ * @param seed 种子
394
+ * @returns 噪声值(0到1)
395
+ */
396
396
  static noise(x, y = 0, seed = 0) {
397
- let n = Math.sin(x * 12.9898 + y * 78.233 + seed * 37.719) * 43758.5453;
397
+ const n = Math.sin(x * 12.9898 + y * 78.233 + seed * 37.719) * 43758.5453;
398
398
  return n - Math.floor(n);
399
399
  }
400
400
  /**
401
- * 平滑噪声
402
- * @param x 输入X
403
- * @param y 输入Y
404
- * @param seed 种子
405
- * @returns 平滑噪声值(0到1)
406
- */
401
+ * 平滑噪声
402
+ * @param x 输入X
403
+ * @param y 输入Y
404
+ * @param seed 种子
405
+ * @returns 平滑噪声值(0到1)
406
+ */
407
407
  static smoothNoise(x, y = 0, seed = 0) {
408
408
  const intX = Math.floor(x);
409
409
  const intY = Math.floor(y);
@@ -419,56 +419,56 @@ export class MathUtils {
419
419
  }
420
420
  // 实用工具
421
421
  /**
422
- * 将数值转换为指定精度
423
- * @param value 数值
424
- * @param precision 精度(小数位数)
425
- * @returns 转换后的数值
426
- */
422
+ * 将数值转换为指定精度
423
+ * @param value 数值
424
+ * @param precision 精度(小数位数)
425
+ * @returns 转换后的数值
426
+ */
427
427
  static toPrecision(value, precision) {
428
428
  const factor = Math.pow(10, precision);
429
429
  return Math.round(value * factor) / factor;
430
430
  }
431
431
  /**
432
- * 检查数值是否在指定范围内
433
- * @param value 数值
434
- * @param min 最小值
435
- * @param max 最大值
436
- * @returns 是否在范围内
437
- */
432
+ * 检查数值是否在指定范围内
433
+ * @param value 数值
434
+ * @param min 最小值
435
+ * @param max 最大值
436
+ * @returns 是否在范围内
437
+ */
438
438
  static inRange(value, min, max) {
439
439
  return value >= min && value <= max;
440
440
  }
441
441
  /**
442
- * 获取数组中的最小值
443
- * @param values 数值数组
444
- * @returns 最小值
445
- */
442
+ * 获取数组中的最小值
443
+ * @param values 数值数组
444
+ * @returns 最小值
445
+ */
446
446
  static min(...values) {
447
447
  return Math.min(...values);
448
448
  }
449
449
  /**
450
- * 获取数组中的最大值
451
- * @param values 数值数组
452
- * @returns 最大值
453
- */
450
+ * 获取数组中的最大值
451
+ * @param values 数值数组
452
+ * @returns 最大值
453
+ */
454
454
  static max(...values) {
455
455
  return Math.max(...values);
456
456
  }
457
457
  /**
458
- * 计算数组的平均值
459
- * @param values 数值数组
460
- * @returns 平均值
461
- */
458
+ * 计算数组的平均值
459
+ * @param values 数值数组
460
+ * @returns 平均值
461
+ */
462
462
  static average(values) {
463
463
  if (values.length === 0)
464
464
  return 0;
465
465
  return values.reduce((sum, val) => sum + val, 0) / values.length;
466
466
  }
467
467
  /**
468
- * 计算数组的中位数
469
- * @param values 数值数组
470
- * @returns 中位数
471
- */
468
+ * 计算数组的中位数
469
+ * @param values 数值数组
470
+ * @returns 中位数
471
+ */
472
472
  static median(values) {
473
473
  if (values.length === 0)
474
474
  return 0;