@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.
- package/LICENSE +21 -0
- package/bin/Animation/Easing.d.ts +150 -150
- package/bin/Animation/Easing.d.ts.map +1 -1
- package/bin/Animation/Easing.js +151 -151
- package/bin/Animation/Easing.js.map +1 -1
- package/bin/Animation/Interpolation.d.ts +102 -102
- package/bin/Animation/Interpolation.d.ts.map +1 -1
- package/bin/Animation/Interpolation.js +104 -104
- package/bin/Animation/Interpolation.js.map +1 -1
- package/bin/Animation/index.d.ts.map +1 -1
- package/bin/Animation/index.js.map +1 -1
- package/bin/Circle.d.ts +159 -159
- package/bin/Circle.d.ts.map +1 -1
- package/bin/Circle.js +159 -159
- package/bin/Circle.js.map +1 -1
- package/bin/Collision/CollisionDetector.d.ts +64 -64
- package/bin/Collision/CollisionDetector.d.ts.map +1 -1
- package/bin/Collision/CollisionDetector.js +66 -66
- package/bin/Collision/CollisionDetector.js.map +1 -1
- package/bin/Color.d.ts +277 -0
- package/bin/Color.d.ts.map +1 -0
- package/bin/Color.js +470 -0
- package/bin/Color.js.map +1 -0
- package/bin/Fixed32.d.ts +266 -0
- package/bin/Fixed32.d.ts.map +1 -0
- package/bin/Fixed32.js +381 -0
- package/bin/Fixed32.js.map +1 -0
- package/bin/FixedMath.d.ts +109 -0
- package/bin/FixedMath.d.ts.map +1 -0
- package/bin/FixedMath.js +264 -0
- package/bin/FixedMath.js.map +1 -0
- package/bin/FixedVector2.d.ts +293 -0
- package/bin/FixedVector2.d.ts.map +1 -0
- package/bin/FixedVector2.js +413 -0
- package/bin/FixedVector2.js.map +1 -0
- package/bin/MathUtils.d.ts +205 -205
- package/bin/MathUtils.d.ts.map +1 -1
- package/bin/MathUtils.js +206 -206
- package/bin/MathUtils.js.map +1 -1
- package/bin/Matrix3.d.ts +158 -139
- package/bin/Matrix3.d.ts.map +1 -1
- package/bin/Matrix3.js +179 -151
- package/bin/Matrix3.js.map +1 -1
- package/bin/Rectangle.d.ts +144 -144
- package/bin/Rectangle.d.ts.map +1 -1
- package/bin/Rectangle.js +144 -144
- package/bin/Rectangle.js.map +1 -1
- package/bin/Vector2.d.ts +202 -186
- package/bin/Vector2.d.ts.map +1 -1
- package/bin/Vector2.js +198 -188
- package/bin/Vector2.js.map +1 -1
- package/bin/Vector3.d.ts +257 -0
- package/bin/Vector3.d.ts.map +1 -0
- package/bin/Vector3.js +372 -0
- package/bin/Vector3.js.map +1 -0
- package/bin/index.d.ts +8 -1
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +9 -0
- package/bin/index.js.map +1 -1
- 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
|
-
|
|
12
|
-
|
|
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
|
-
|
|
20
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
40
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
138
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
167
|
-
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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
|
-
|
|
194
|
-
|
|
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
|
-
|
|
202
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
228
|
-
|
|
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
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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
|
-
|
|
254
|
-
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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
|
-
|
|
286
|
-
|
|
287
|
-
|
|
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
|
-
|
|
296
|
-
|
|
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
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
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
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
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
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
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
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
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
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
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
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
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
|
-
|
|
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
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
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
|
-
|
|
424
|
-
|
|
425
|
-
|
|
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
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
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
|
-
|
|
444
|
-
|
|
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
|
-
|
|
452
|
-
|
|
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
|
-
|
|
460
|
-
|
|
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
|
-
|
|
470
|
-
|
|
471
|
-
|
|
468
|
+
* 计算数组的中位数
|
|
469
|
+
* @param values 数值数组
|
|
470
|
+
* @returns 中位数
|
|
471
|
+
*/
|
|
472
472
|
static median(values) {
|
|
473
473
|
if (values.length === 0)
|
|
474
474
|
return 0;
|