@lijuhong1981/jsmath 1.0.19 → 1.1.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/README.md +11 -0
- package/index.js +2 -2
- package/package.json +9 -15
- package/src/Interval.js +316 -0
- package/src/clamp.js +0 -5
- package/src/convertToLatitudeRange.js +0 -2
- package/src/convertToRange.js +0 -6
- package/src/degToRad.js +0 -3
- package/src/equalsEpsilon.js +0 -5
- package/src/extractFraction.js +0 -4
- package/src/isBetween.js +0 -6
- package/src/lerp.js +0 -4
- package/src/radToDeg.js +0 -3
- package/src/scalarInRange.js +0 -4
- package/src/toFixed.js +1 -5
- package/.gitattributes +0 -2
- package/src/Range.js +0 -366
package/README.md
ADDED
package/index.js
CHANGED
|
@@ -54,7 +54,7 @@ import parseNumber from "./src/parseNumber.js";
|
|
|
54
54
|
import randomNumber from "./src/randomNumber.js";
|
|
55
55
|
import randomInteger from "./src/randomInteger.js";
|
|
56
56
|
import toFixed from "./src/toFixed.js";
|
|
57
|
-
import
|
|
57
|
+
import Interval from "./src/Interval.js";
|
|
58
58
|
|
|
59
59
|
export {
|
|
60
60
|
PI,
|
|
@@ -111,5 +111,5 @@ export {
|
|
|
111
111
|
randomNumber,
|
|
112
112
|
randomInteger,
|
|
113
113
|
toFixed,
|
|
114
|
-
|
|
114
|
+
Interval,
|
|
115
115
|
};
|
package/package.json
CHANGED
|
@@ -1,24 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lijuhong1981/jsmath",
|
|
3
|
-
"version": "1.0
|
|
4
|
-
"description": "",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "> TODO: description",
|
|
5
|
+
"author": "lijuhong1981",
|
|
6
|
+
"homepage": "https://github.com/lijuhong1981/jslib#readme",
|
|
7
|
+
"license": "ISC",
|
|
8
|
+
"type": "module",
|
|
5
9
|
"main": "index.js",
|
|
6
10
|
"module": "index.js",
|
|
7
|
-
"type": "module",
|
|
8
|
-
"scripts": {
|
|
9
|
-
"test": "echo \"Error: no test specified\" && exit 1"
|
|
10
|
-
},
|
|
11
11
|
"repository": {
|
|
12
12
|
"type": "git",
|
|
13
|
-
"url": "git+https://github.com/lijuhong1981/
|
|
13
|
+
"url": "git+https://github.com/lijuhong1981/jslib.git"
|
|
14
14
|
},
|
|
15
|
-
"author": "lijuhong1981",
|
|
16
|
-
"license": "ISC",
|
|
17
15
|
"bugs": {
|
|
18
|
-
"url": "https://github.com/lijuhong1981/
|
|
19
|
-
},
|
|
20
|
-
"homepage": "https://github.com/lijuhong1981/jsmath#readme",
|
|
21
|
-
"dependencies": {
|
|
22
|
-
"@lijuhong1981/jscheck": "^1.0.4"
|
|
16
|
+
"url": "https://github.com/lijuhong1981/jslib/issues"
|
|
23
17
|
}
|
|
24
|
-
}
|
|
18
|
+
}
|
package/src/Interval.js
ADDED
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import isBetween from "./isBetween";
|
|
2
|
+
import lerp from "./lerp";
|
|
3
|
+
import scalarInRange from "./scalarInRange";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 数学上的区间对象
|
|
7
|
+
*/
|
|
8
|
+
class Interval {
|
|
9
|
+
/**
|
|
10
|
+
* 构造函数
|
|
11
|
+
* @param {Number} start 区间开始值,默认0
|
|
12
|
+
* @param {Number} end 区间结束值,默认1
|
|
13
|
+
* @param {Boolean} equalsStart 区间范围是否可等于开始值,默认true
|
|
14
|
+
* @param {Boolean} equalsEnd 区间范围是否可等于结束值,默认true
|
|
15
|
+
*/
|
|
16
|
+
constructor(start = 0, end = 1, equalsStart = true, equalsEnd = true) {
|
|
17
|
+
this.setValues(start, end, equalsStart, equalsEnd);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 设置区间参数值
|
|
22
|
+
* @param {Number} start 区间开始值,默认0
|
|
23
|
+
* @param {Number} end 区间结束值,默认1
|
|
24
|
+
* @param {Boolean} equalsStart 区间范围是否可等于开始值,默认true
|
|
25
|
+
* @param {Boolean} equalsEnd 区间范围是否可等于结束值,默认true
|
|
26
|
+
* @returns {Interval} 返回自身
|
|
27
|
+
*/
|
|
28
|
+
setValues(start = 0, end = 1, equalsStart = true, equalsEnd = true) {
|
|
29
|
+
if (start > end)
|
|
30
|
+
throw new Error('the start value must be less than or equals end value.');
|
|
31
|
+
|
|
32
|
+
this.start = start;
|
|
33
|
+
this.end = end;
|
|
34
|
+
this.equalsStart = equalsStart;
|
|
35
|
+
this.equalsEnd = equalsEnd;
|
|
36
|
+
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 判断该区间是否为空集
|
|
42
|
+
* @returns {Boolean}
|
|
43
|
+
*/
|
|
44
|
+
isEmpty() {
|
|
45
|
+
return this.start === this.end;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* 获取区间长度
|
|
50
|
+
* @returns {Number}
|
|
51
|
+
*/
|
|
52
|
+
get length() {
|
|
53
|
+
return this.end - this.start;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 判断一个数值是否处于该区间内
|
|
58
|
+
* @param {Number} 需要判断的数值
|
|
59
|
+
* @returns {Boolean} 判断结果
|
|
60
|
+
*/
|
|
61
|
+
isBetween(value) {
|
|
62
|
+
return isBetween(value, this.start, this.end, this.equalsStart, this.equalsEnd);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* 在该区间内线性插值
|
|
67
|
+
* @param {Number} scalar 插值标量,needClamp为true时约束在[0,1]区间内,为false时可超出[0,1]区间
|
|
68
|
+
* @param {Boolean} needClamp 是否需要约束插值,默认true
|
|
69
|
+
* @returns {Number} 插值结果
|
|
70
|
+
*/
|
|
71
|
+
lerp(scalar, needClamp = true) {
|
|
72
|
+
return lerp(this.start, this.end, scalar, needClamp);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* 计算一个数值在当前区间内的线性插值标量
|
|
77
|
+
* @param {Number} value 需要计算的数值
|
|
78
|
+
* @param {Boolean} needClamp 是否需要约束至0到1之间,默认true
|
|
79
|
+
* @returns {Number} 插值标量
|
|
80
|
+
*/
|
|
81
|
+
scalar(value, needClamp = true) {
|
|
82
|
+
return scalarInRange(value, this.start, this.end, needClamp);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* 判断两个区间对象是否相等
|
|
87
|
+
* @param {Interval} left
|
|
88
|
+
* @param {Interval} right
|
|
89
|
+
* @returns {Boolean}
|
|
90
|
+
*/
|
|
91
|
+
static equals(left, right) {
|
|
92
|
+
if (left === right)
|
|
93
|
+
return true;
|
|
94
|
+
if (left && right
|
|
95
|
+
&& left.start === right.start
|
|
96
|
+
&& left.end === right.end
|
|
97
|
+
&& left.equalsStart === right.equalsStart
|
|
98
|
+
&& left.equalsEnd === right.equalsEnd)
|
|
99
|
+
return true;
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* 判断当前区间是否与另一个区间相等
|
|
105
|
+
* @param {Interval} other
|
|
106
|
+
* @returns {Boolean}
|
|
107
|
+
*/
|
|
108
|
+
equals(other) {
|
|
109
|
+
return Interval.equals(this, other);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* 两个区间相加,left + right
|
|
114
|
+
* @param {Interval} left
|
|
115
|
+
* @param {Interval} right
|
|
116
|
+
* @param {Interval} result 结果区间对象,可不填
|
|
117
|
+
* @returns {Interval} 结果区间对象
|
|
118
|
+
*/
|
|
119
|
+
static add(left, right, result = new Interval()) {
|
|
120
|
+
result.start = left.start + right.start;
|
|
121
|
+
result.end = left.end + right.end;
|
|
122
|
+
result.equalsStart = left.equalsStart && right.equalsStart;
|
|
123
|
+
result.equalsEnd = left.equalsEnd && right.equalsEnd;
|
|
124
|
+
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* 当前区间与另一个区间相加
|
|
130
|
+
* @param {Interval} other
|
|
131
|
+
* @param {Interval} result 结果区间对象,不填时传入自身
|
|
132
|
+
* @returns {Interval} 结果区间对象
|
|
133
|
+
*/
|
|
134
|
+
add(other, result) {
|
|
135
|
+
return Interval.add(this, other, result || this);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* 两个区间相减,left - right
|
|
140
|
+
* @param {Interval} left
|
|
141
|
+
* @param {Interval} right
|
|
142
|
+
* @param {Interval} result 结果区间对象,可不填
|
|
143
|
+
* @returns {Interval} 结果区间对象
|
|
144
|
+
*/
|
|
145
|
+
static subtract(left, right, result = new Interval()) {
|
|
146
|
+
result.start = left.start - right.start;
|
|
147
|
+
result.end = left.end - right.end;
|
|
148
|
+
result.equalsStart = left.equalsStart && right.equalsStart;
|
|
149
|
+
result.equalsEnd = left.equalsEnd && right.equalsEnd;
|
|
150
|
+
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* 当前区间减去另一个区间
|
|
156
|
+
* @param {Interval} other
|
|
157
|
+
* @param {Interval} result 结果区间对象,不填时传入自身
|
|
158
|
+
* @returns {Interval} 结果区间对象
|
|
159
|
+
*/
|
|
160
|
+
subtract(other, result) {
|
|
161
|
+
return Interval.subtract(this, other, result || this);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* 两个区间相乘,left x right
|
|
166
|
+
* @param {Interval} left
|
|
167
|
+
* @param {Interval} right
|
|
168
|
+
* @param {Interval} result 结果区间对象,可不填
|
|
169
|
+
* @returns {Interval} 结果区间对象
|
|
170
|
+
*/
|
|
171
|
+
static multiply(left, right, result = new Interval()) {
|
|
172
|
+
const ac = left.start * right.start;
|
|
173
|
+
const ad = left.start * right.end;
|
|
174
|
+
const bc = left.end * right.start;
|
|
175
|
+
const bd = left.end * right.end;
|
|
176
|
+
result.start = Math.min(ac, ad, bc, bd);
|
|
177
|
+
result.end = Math.max(ac, ad, bc, bd);
|
|
178
|
+
result.equalsStart = left.equalsStart && right.equalsStart;
|
|
179
|
+
result.equalsEnd = left.equalsEnd && right.equalsEnd;
|
|
180
|
+
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* 当前区间乘以另一个区间
|
|
186
|
+
* @param {Interval} other
|
|
187
|
+
* @param {Interval} result 结果区间对象,不填时传入自身
|
|
188
|
+
* @returns {Interval} 结果区间对象
|
|
189
|
+
*/
|
|
190
|
+
multiply(other, result) {
|
|
191
|
+
return Interval.multiply(this, other, result || this);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* 两个区间相除,left / right
|
|
196
|
+
* @param {Interval} left
|
|
197
|
+
* @param {Interval} right
|
|
198
|
+
* @param {Interval} result 结果区间对象,可不填
|
|
199
|
+
* @returns {Interval} 结果区间对象
|
|
200
|
+
*/
|
|
201
|
+
static divide(left, right, result = new Interval()) {
|
|
202
|
+
const ac = left.start / right.start;
|
|
203
|
+
const ad = left.start / right.end;
|
|
204
|
+
const bc = left.end / right.start;
|
|
205
|
+
const bd = left.end / right.end;
|
|
206
|
+
result.start = Math.min(ac, ad, bc, bd);
|
|
207
|
+
result.end = Math.max(ac, ad, bc, bd);
|
|
208
|
+
result.equalsStart = left.equalsStart && right.equalsStart;
|
|
209
|
+
result.equalsEnd = left.equalsEnd && right.equalsEnd;
|
|
210
|
+
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* 当前区间除以另一个区间
|
|
216
|
+
* @param {Interval} other
|
|
217
|
+
* @param {Interval} result 结果区间对象,不填时传入自身
|
|
218
|
+
* @returns {Interval} 结果区间对象
|
|
219
|
+
*/
|
|
220
|
+
divide(other, result) {
|
|
221
|
+
return Interval.divide(this, other, result || this);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* 克隆一个区间对象
|
|
226
|
+
* @param {Interval} interval 需要克隆的区间对象
|
|
227
|
+
* @param {Interval} result 结果区间对象,可不设置
|
|
228
|
+
* @returns {Interval} 结果区间对象
|
|
229
|
+
*/
|
|
230
|
+
static clone(interval, result = new Interval()) {
|
|
231
|
+
result.start = interval.start;
|
|
232
|
+
result.end = interval.end;
|
|
233
|
+
result.equalsStart = interval.equalsStart;
|
|
234
|
+
result.equalsEnd = interval.equalsEnd;
|
|
235
|
+
|
|
236
|
+
return result;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* 克隆当前区间对象
|
|
241
|
+
* @param {Interval} result 结果区间对象,可不设置
|
|
242
|
+
* @returns {Interval} 结果区间对象
|
|
243
|
+
*/
|
|
244
|
+
clone(result) {
|
|
245
|
+
return Interval.clone(this, result);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* 将一个区间对象的所有属性打包到一个数组中
|
|
250
|
+
* @param {Interval} interval 需要打包的区间对象
|
|
251
|
+
* @param {Array} array 打包到的数组
|
|
252
|
+
* @param {Integer} startingIndex 数组起始索引,默认0
|
|
253
|
+
* @returns {Array} 打包后的数组
|
|
254
|
+
*/
|
|
255
|
+
static pack(interval, array = [], startingIndex = 0) {
|
|
256
|
+
array[startingIndex++] = interval.start;
|
|
257
|
+
array[startingIndex++] = interval.end;
|
|
258
|
+
array[startingIndex++] = interval.equalsStart;
|
|
259
|
+
array[startingIndex++] = interval.equalsEnd;
|
|
260
|
+
|
|
261
|
+
return array;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* 将当前区间对象属性打包至数组
|
|
266
|
+
* @param {Array} array 打包到的数组
|
|
267
|
+
* @param {Integer} startingIndex 数组起始索引,默认0
|
|
268
|
+
* @returns {Array} 打包后的数组
|
|
269
|
+
*/
|
|
270
|
+
toArray(array, startingIndex = 0) {
|
|
271
|
+
return Interval.pack(this, array, startingIndex);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* 从一个数组中提取一个区间对象的所有属性
|
|
276
|
+
* @param {Array} array 提取属性的数组
|
|
277
|
+
* @param {Integer} startingIndex 数组起始索引,默认0
|
|
278
|
+
* @param {Interval} result 结果区间对象,可不填
|
|
279
|
+
* @returns {Interval} 结果区间对象
|
|
280
|
+
*/
|
|
281
|
+
static unpack(array, startingIndex = 0, result = new Interval()) {
|
|
282
|
+
result.start = array[startingIndex++];
|
|
283
|
+
result.end = array[startingIndex++];
|
|
284
|
+
result.equalsStart = array[startingIndex++];
|
|
285
|
+
result.equalsEnd = array[startingIndex++];
|
|
286
|
+
|
|
287
|
+
return result;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* 等同于Interval.unpack
|
|
292
|
+
*
|
|
293
|
+
* @see Interval.unpack
|
|
294
|
+
*/
|
|
295
|
+
static fromArray(array, startingIndex, result) {
|
|
296
|
+
return Interval.unpack(array, startingIndex, result);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* 从一个数组给当前区间对象赋值
|
|
301
|
+
* @param {Array} array 提取属性的数组
|
|
302
|
+
* @param {Integer} startingIndex 数组起始索引,默认0
|
|
303
|
+
* @returns {Interval} 当前区间对象
|
|
304
|
+
*/
|
|
305
|
+
setFromArray(array, startingIndex = 0) {
|
|
306
|
+
return Interval.unpack(array, startingIndex, this);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
toString() {
|
|
310
|
+
return 'Interval:' + (this.equalsStart ? '[' : '(') + this.start + ', ' + this.end + (this.equalsEnd ? ']' : ')');
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
Interval.packedLength = 4;
|
|
315
|
+
|
|
316
|
+
export default Interval;
|
package/src/clamp.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import Check from "@lijuhong1981/jscheck";
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* 将一个数值约束在两个数值之间
|
|
5
3
|
* @param {Number} value 需要约束的数值
|
|
@@ -8,9 +6,6 @@ import Check from "@lijuhong1981/jscheck";
|
|
|
8
6
|
* @returns {Number} 约束后的数值
|
|
9
7
|
*/
|
|
10
8
|
function clamp(value, rangeMinimum, rangeMaximum) {
|
|
11
|
-
Check.typeOf.number('value', value);
|
|
12
|
-
Check.typeOf.number('rangeMinimum', rangeMinimum);
|
|
13
|
-
Check.typeOf.number('rangeMaximum', rangeMaximum);
|
|
14
9
|
return value < rangeMinimum ? rangeMinimum : value > rangeMaximum ? rangeMaximum : value;
|
|
15
10
|
};
|
|
16
11
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import Check from "@lijuhong1981/jscheck";
|
|
2
1
|
import { PI_OVER_TWO } from "./Constant.js";
|
|
3
2
|
|
|
4
3
|
/**
|
|
@@ -8,7 +7,6 @@ import { PI_OVER_TWO } from "./Constant.js";
|
|
|
8
7
|
* @returns {Number} 转换后的纬度
|
|
9
8
|
*/
|
|
10
9
|
function convertToLatitudeRange(latitude, degrees = true) {
|
|
11
|
-
Check.typeOf.number('latitude', latitude);
|
|
12
10
|
if (degrees) {
|
|
13
11
|
while (latitude > 90 || latitude < -90) {
|
|
14
12
|
if (latitude > 90) {
|
package/src/convertToRange.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import Check from "@lijuhong1981/jscheck";
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* 将一个数值转换至两个数值范围内
|
|
5
3
|
* 如不在范围内则累加或累减范围长度,直至落在范围内
|
|
@@ -9,10 +7,6 @@ import Check from "@lijuhong1981/jscheck";
|
|
|
9
7
|
* @returns {Number} 转换后的数值
|
|
10
8
|
*/
|
|
11
9
|
function convertToRange(value, rangeMinimum, rangeMaximum) {
|
|
12
|
-
Check.typeOf.number('value', value);
|
|
13
|
-
Check.typeOf.number('rangeMinimum', rangeMinimum);
|
|
14
|
-
Check.typeOf.number('rangeMaximum', rangeMaximum);
|
|
15
|
-
|
|
16
10
|
const length = rangeMaximum - rangeMinimum;
|
|
17
11
|
if (value < rangeMinimum) {
|
|
18
12
|
value += length;
|
package/src/degToRad.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import Check from "@lijuhong1981/jscheck";
|
|
2
1
|
import { RADIANS_PER_DEGREE } from "./Constant.js";
|
|
3
2
|
|
|
4
3
|
/**
|
|
@@ -7,8 +6,6 @@ import { RADIANS_PER_DEGREE } from "./Constant.js";
|
|
|
7
6
|
* @returns {Number} 弧度
|
|
8
7
|
*/
|
|
9
8
|
function degToRad(degrees) {
|
|
10
|
-
Check.typeOf.number('degrees', degrees);
|
|
11
|
-
|
|
12
9
|
return degrees * RADIANS_PER_DEGREE;
|
|
13
10
|
};
|
|
14
11
|
|
package/src/equalsEpsilon.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import Check from "@lijuhong1981/jscheck";
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* 比较两个数值是否近似相等
|
|
5
3
|
* @param {Number} left
|
|
@@ -8,9 +6,6 @@ import Check from "@lijuhong1981/jscheck";
|
|
|
8
6
|
* @returns {Boolean}
|
|
9
7
|
*/
|
|
10
8
|
function equalsEpsilon(left, right, epsilon = 0) {
|
|
11
|
-
Check.typeOf.number('left', left);
|
|
12
|
-
Check.typeOf.number('right', right)
|
|
13
|
-
|
|
14
9
|
return Math.abs(left - right) <= epsilon;
|
|
15
10
|
};
|
|
16
11
|
|
package/src/extractFraction.js
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
|
-
import Check from "@lijuhong1981/jscheck";
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* 从一个数值中提取小数部分
|
|
5
3
|
* @param {Number} value 传入的数值
|
|
6
4
|
* @returns {Number} 提取的小数
|
|
7
5
|
*/
|
|
8
6
|
function extractFraction(value) {
|
|
9
|
-
Check.typeOf.number('value', value);
|
|
10
|
-
|
|
11
7
|
value = value.toString();
|
|
12
8
|
const arr = value.split('.');
|
|
13
9
|
if (arr.length === 2)
|
package/src/isBetween.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import Check from "@lijuhong1981/jscheck";
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* 判断一个数值是否在两个数值之间
|
|
5
3
|
* @param {Number} value 需要判断的数值
|
|
@@ -10,10 +8,6 @@ import Check from "@lijuhong1981/jscheck";
|
|
|
10
8
|
* @returns {Boolean} 判断结果
|
|
11
9
|
*/
|
|
12
10
|
function isBetween(value, rangeMinimum, rangeMaximum, equalsMinimum = true, equalsMaximum = true) {
|
|
13
|
-
Check.typeOf.number('value', value);
|
|
14
|
-
Check.typeOf.number('rangeMinimum', rangeMinimum);
|
|
15
|
-
Check.typeOf.number('rangeMaximum', rangeMaximum);
|
|
16
|
-
|
|
17
11
|
if (equalsMinimum ? value < rangeMinimum : value <= rangeMinimum)
|
|
18
12
|
return false;
|
|
19
13
|
if (equalsMaximum ? value > rangeMaximum : value >= rangeMaximum)
|
package/src/lerp.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import Check from "@lijuhong1981/jscheck";
|
|
2
1
|
import clamp from "./clamp.js";
|
|
3
2
|
|
|
4
3
|
/**
|
|
@@ -10,9 +9,6 @@ import clamp from "./clamp.js";
|
|
|
10
9
|
* @returns {Number} 插值结果
|
|
11
10
|
*/
|
|
12
11
|
function lerp(start, end, scalar, needClamp = true) {
|
|
13
|
-
Check.typeOf.number('start', start);
|
|
14
|
-
Check.typeOf.number('end', end);
|
|
15
|
-
Check.typeOf.number('scalar', scalar);
|
|
16
12
|
if (needClamp)
|
|
17
13
|
scalar = clamp(scalar, 0, 1);
|
|
18
14
|
return start + (end - start) * scalar;
|
package/src/radToDeg.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import Check from "@lijuhong1981/jscheck";
|
|
2
1
|
import { DEGREES_PER_RADIAN } from "./Constant";
|
|
3
2
|
|
|
4
3
|
/**
|
|
@@ -7,8 +6,6 @@ import { DEGREES_PER_RADIAN } from "./Constant";
|
|
|
7
6
|
* @returns {Number} 角度
|
|
8
7
|
*/
|
|
9
8
|
function radToDeg(radians) {
|
|
10
|
-
Check.typeOf.number('radians', radians);
|
|
11
|
-
|
|
12
9
|
return radians * DEGREES_PER_RADIAN;
|
|
13
10
|
}
|
|
14
11
|
|
package/src/scalarInRange.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import Check from "@lijuhong1981/jscheck";
|
|
2
1
|
import clamp from "./clamp.js";
|
|
3
2
|
|
|
4
3
|
/**
|
|
@@ -10,9 +9,6 @@ import clamp from "./clamp.js";
|
|
|
10
9
|
* @returns {Number} 插值标量
|
|
11
10
|
*/
|
|
12
11
|
function scalarInRange(value, rangeMinimum, rangeMaximum, needClamp = false) {
|
|
13
|
-
Check.typeOf.number('value', value);
|
|
14
|
-
Check.typeOf.number('rangeMinimum', rangeMinimum);
|
|
15
|
-
Check.typeOf.number('rangeMaximum', rangeMaximum);
|
|
16
12
|
let scalar = (value - rangeMinimum) / (rangeMaximum - rangeMinimum);
|
|
17
13
|
if (needClamp)
|
|
18
14
|
scalar = clamp(scalar, 0, 1);
|
package/src/toFixed.js
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import Check from "@lijuhong1981/jscheck";
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* 四舍五入一个数值至指定的小数位数
|
|
5
3
|
* @param {Number} value 传入的数值
|
|
6
|
-
* @param {Number} decimalNumber
|
|
4
|
+
* @param {Number} decimalNumber 小数位数
|
|
7
5
|
* @returns {Number}
|
|
8
6
|
*/
|
|
9
7
|
function toFixed(value, decimalNumber = 2) {
|
|
10
|
-
Check.typeOf.number('value', value);
|
|
11
|
-
|
|
12
8
|
return parseFloat(value.toFixed(decimalNumber));
|
|
13
9
|
}
|
|
14
10
|
|
package/.gitattributes
DELETED
package/src/Range.js
DELETED
|
@@ -1,366 +0,0 @@
|
|
|
1
|
-
import Check, { isValid } from "@lijuhong1981/jscheck";
|
|
2
|
-
import isBetween from "./isBetween.js";
|
|
3
|
-
import lerp from "./lerp.js";
|
|
4
|
-
import scalarInRange from "./scalarInRange.js";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Range对象用来表示数学上的区间集合
|
|
8
|
-
*/
|
|
9
|
-
class Range {
|
|
10
|
-
/**
|
|
11
|
-
* 构造函数
|
|
12
|
-
* @param {Number} minimum 区间较小数,默认0
|
|
13
|
-
* @param {Number} maximum 区间较大数,默认1
|
|
14
|
-
* @param {Boolean} containsMinimum 区间是否包含较小数,默认true
|
|
15
|
-
* @param {Boolean} containsMaximum 区间是否包含较大数,默认true
|
|
16
|
-
*/
|
|
17
|
-
constructor(minimum = 0, maximum = 1, containsMinimum = true, containsMaximum = true) {
|
|
18
|
-
this.setValues(minimum, maximum, containsMinimum, containsMaximum);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
get isRange() {
|
|
22
|
-
return true;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
ensureMinMaxValue() {
|
|
26
|
-
if (this.minimum > this.maximum) {
|
|
27
|
-
const temp = this.minimum;
|
|
28
|
-
this.minimum = this.maximum;
|
|
29
|
-
this.maximum = temp;
|
|
30
|
-
}
|
|
31
|
-
return this;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
setValues(minimum, maximum, containsMinimum, containsMaximum) {
|
|
35
|
-
if (isValid(minimum))
|
|
36
|
-
this.minimum = minimum;
|
|
37
|
-
if (isValid(maximum))
|
|
38
|
-
this.maximum = maximum;
|
|
39
|
-
if (isValid(containsMinimum))
|
|
40
|
-
this.containsMinimum = containsMinimum;
|
|
41
|
-
if (isValid(containsMaximum))
|
|
42
|
-
this.containsMaximum = containsMaximum;
|
|
43
|
-
|
|
44
|
-
this.ensureMinMaxValue();
|
|
45
|
-
|
|
46
|
-
return this;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* @deprecated
|
|
51
|
-
*/
|
|
52
|
-
set min(value) {
|
|
53
|
-
this.minimum = value;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* @deprecated
|
|
58
|
-
*/
|
|
59
|
-
get min() {
|
|
60
|
-
return this.minimum;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* @deprecated
|
|
65
|
-
*/
|
|
66
|
-
set max(value) {
|
|
67
|
-
this.maximum = value;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* @deprecated
|
|
72
|
-
*/
|
|
73
|
-
get max() {
|
|
74
|
-
return this.maximum;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* 判断该区间是否为空集
|
|
79
|
-
* @returns {Boolean}
|
|
80
|
-
*/
|
|
81
|
-
isEmpty() {
|
|
82
|
-
if (this.minimum === this.maximum)
|
|
83
|
-
return true;
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* 获取区间长度
|
|
89
|
-
* @returns {Number}
|
|
90
|
-
*/
|
|
91
|
-
get length() {
|
|
92
|
-
return this.maximum - this.minimum;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* 判断一个数值是否处于该区间内
|
|
97
|
-
* @param {Number} 需要判断的数值
|
|
98
|
-
* @returns {Boolean}
|
|
99
|
-
*/
|
|
100
|
-
isBetween(value) {
|
|
101
|
-
return isBetween(value, this.minimum, this.maximum, this.containsMinimum, this.containsMaximum);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* 判断一个数值是否处于该区间内
|
|
106
|
-
* @param {Number} 需要判断的数值
|
|
107
|
-
* @returns {Boolean}
|
|
108
|
-
*/
|
|
109
|
-
between(value) {
|
|
110
|
-
return this.isBetween(value);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* 在该区间内线性插值
|
|
115
|
-
* @param {Number} percent 插值百分比,needClamp为true时约束在[0,1]区间内,为false时可超出[0,1]区间
|
|
116
|
-
* @param {Boolean} needClamp 是否需要约束插值,默认true
|
|
117
|
-
* @returns {Number} 插值结果
|
|
118
|
-
*/
|
|
119
|
-
lerp(percent, needClamp = true) {
|
|
120
|
-
return lerp(this.minimum, this.maximum, percent, needClamp);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* 计算一个数值在当前区间内的线性插值标量
|
|
125
|
-
* @param {Number} value 需要计算的数值
|
|
126
|
-
* @param {Boolean} needClamp 是否需要约束至0到1之间,默认true
|
|
127
|
-
* @returns {Number} 插值标量
|
|
128
|
-
*/
|
|
129
|
-
scalar(value, needClamp = true) {
|
|
130
|
-
return scalarInRange(value, this.minimum, this.maximum, needClamp);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* 判断两个区间对象是否相等
|
|
135
|
-
* @param {Range} left
|
|
136
|
-
* @param {Range} right
|
|
137
|
-
* @returns {Boolean}
|
|
138
|
-
*/
|
|
139
|
-
static equals(left, right) {
|
|
140
|
-
if (left === right)
|
|
141
|
-
return true;
|
|
142
|
-
if (left && right && left.minimum === right.minimum && left.maximum === right.maximum && left.containsMinimum === right.containsMinimum && left.containsMaximum === right.containsMaximum)
|
|
143
|
-
return true;
|
|
144
|
-
return false;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* 判断当前区间是否与另一个区间相等
|
|
149
|
-
* @param {Range} other
|
|
150
|
-
* @returns {Boolean}
|
|
151
|
-
*/
|
|
152
|
-
equals(other) {
|
|
153
|
-
return Range.equals(this, other);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* 两个区间相加,left + right
|
|
158
|
-
* @param {Range} left
|
|
159
|
-
* @param {Range} right
|
|
160
|
-
* @param {Range} result 结果区间对象,可不填
|
|
161
|
-
* @returns {Range} 结果区间对象
|
|
162
|
-
*/
|
|
163
|
-
static add(left, right, result = new Range()) {
|
|
164
|
-
Check.instanceOf('left', left, Range);
|
|
165
|
-
Check.instanceOf('right', right, Range);
|
|
166
|
-
|
|
167
|
-
result.minimum = left.minimum + right.minimum;
|
|
168
|
-
result.maximum = left.maximum + right.maximum;
|
|
169
|
-
result.containsMinimum = left.containsMinimum && right.containsMinimum;
|
|
170
|
-
result.containsMaximum = left.containsMaximum && right.containsMaximum;
|
|
171
|
-
|
|
172
|
-
return result;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* 当前区间与另一个区间相加
|
|
177
|
-
* @param {Range} other
|
|
178
|
-
* @returns {Range} 当前区间对象
|
|
179
|
-
*/
|
|
180
|
-
add(other) {
|
|
181
|
-
return Range.add(this, other, this);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* 两个区间相减,left - right
|
|
186
|
-
* @param {Range} left
|
|
187
|
-
* @param {Range} right
|
|
188
|
-
* @param {Range} result 结果区间对象,可不填
|
|
189
|
-
* @returns {Range} 结果区间对象
|
|
190
|
-
*/
|
|
191
|
-
static subtract(left, right, result = new Range()) {
|
|
192
|
-
Check.instanceOf('left', left, Range);
|
|
193
|
-
Check.instanceOf('right', right, Range);
|
|
194
|
-
|
|
195
|
-
result.minimum = left.minimum - right.minimum;
|
|
196
|
-
result.maximum = left.maximum - right.maximum;
|
|
197
|
-
result.containsMinimum = left.containsMinimum && right.containsMinimum;
|
|
198
|
-
result.containsMaximum = left.containsMaximum && right.containsMaximum;
|
|
199
|
-
|
|
200
|
-
return result;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* 当前区间减去另一个区间
|
|
205
|
-
* @param {Range} other
|
|
206
|
-
* @returns {Range} 当前区间对象
|
|
207
|
-
*/
|
|
208
|
-
subtract(other) {
|
|
209
|
-
return Range.subtract(this, other, this);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* 两个区间相乘,left x right
|
|
214
|
-
* @param {Range} left
|
|
215
|
-
* @param {Range} right
|
|
216
|
-
* @param {Range} result 结果区间对象,可不填
|
|
217
|
-
* @returns {Range} 结果区间对象
|
|
218
|
-
*/
|
|
219
|
-
static multiply(left, right, result = new Range()) {
|
|
220
|
-
Check.instanceOf('left', left, Range);
|
|
221
|
-
Check.instanceOf('right', right, Range);
|
|
222
|
-
|
|
223
|
-
const ac = left.minimum * right.minimum;
|
|
224
|
-
const ad = left.minimum * right.maximum;
|
|
225
|
-
const bc = left.maximum * right.minimum;
|
|
226
|
-
const bd = left.maximum * right.maximum;
|
|
227
|
-
result.minimum = Math.min(ac, ad, bc, bd);
|
|
228
|
-
result.maximum = Math.max(ac, ad, bc, bd);
|
|
229
|
-
result.containsMinimum = left.containsMinimum && right.containsMinimum;
|
|
230
|
-
result.containsMaximum = left.containsMaximum && right.containsMaximum;
|
|
231
|
-
|
|
232
|
-
return result;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* 当前区间乘以另一个区间
|
|
237
|
-
* @param {Range} other
|
|
238
|
-
* @returns {Range} 当前区间对象
|
|
239
|
-
*/
|
|
240
|
-
multiply(other) {
|
|
241
|
-
return Range.multiply(this, other, this);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* 两个区间相除,left / right
|
|
246
|
-
* @param {Range} left
|
|
247
|
-
* @param {Range} right
|
|
248
|
-
* @param {Range} result 结果区间对象,可不填
|
|
249
|
-
* @returns {Range} 结果区间对象
|
|
250
|
-
*/
|
|
251
|
-
static divide(left, right, result = new Range()) {
|
|
252
|
-
Check.instanceOf('left', left, Range);
|
|
253
|
-
Check.instanceOf('right', right, Range);
|
|
254
|
-
|
|
255
|
-
const ac = left.minimum / right.minimum;
|
|
256
|
-
const ad = left.minimum / right.maximum;
|
|
257
|
-
const bc = left.maximum / right.minimum;
|
|
258
|
-
const bd = left.maximum / right.maximum;
|
|
259
|
-
result.minimum = Math.min(ac, ad, bc, bd);
|
|
260
|
-
result.maximum = Math.max(ac, ad, bc, bd);
|
|
261
|
-
result.containsMinimum = left.containsMinimum && right.containsMinimum;
|
|
262
|
-
result.containsMaximum = left.containsMaximum && right.containsMaximum;
|
|
263
|
-
|
|
264
|
-
return result;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
/**
|
|
268
|
-
* 当前区间除以另一个区间
|
|
269
|
-
* @param {Range} other
|
|
270
|
-
* @returns {Range} 当前区间对象
|
|
271
|
-
*/
|
|
272
|
-
divide(other) {
|
|
273
|
-
return Range.divide(this, other, this);
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* 克隆一个区间对象
|
|
278
|
-
* @param {Range} range 需要克隆的区间对象
|
|
279
|
-
* @param {Range} result 结果区间对象,可不设置
|
|
280
|
-
* @returns {Range} 结果区间对象
|
|
281
|
-
*/
|
|
282
|
-
static clone(range, result = new Range()) {
|
|
283
|
-
Check.instanceOf('range', range, Range);
|
|
284
|
-
|
|
285
|
-
result.minimum = range.minimum;
|
|
286
|
-
result.maximum = range.maximum;
|
|
287
|
-
result.containsMinimum = range.containsMinimum;
|
|
288
|
-
result.containsMaximum = range.containsMaximum;
|
|
289
|
-
|
|
290
|
-
return result;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* 克隆当前区间对象
|
|
295
|
-
* @param {Range} result 结果区间对象,可不设置
|
|
296
|
-
* @returns {Range} 结果区间对象
|
|
297
|
-
*/
|
|
298
|
-
clone(result) {
|
|
299
|
-
return Range.clone(this, result);
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
/**
|
|
303
|
-
* 将一个区间对象的所有属性打包到一个数组中
|
|
304
|
-
* @param {Range} range 需要打包的区间对象
|
|
305
|
-
* @param {Array} array 打包到的数组
|
|
306
|
-
* @param {Integer} startingIndex 数组起始索引,默认0
|
|
307
|
-
* @returns {Array} 打包后的数组
|
|
308
|
-
*/
|
|
309
|
-
static pack(range, array = [], startingIndex = 0) {
|
|
310
|
-
Check.instanceOf('range', range, Range);
|
|
311
|
-
|
|
312
|
-
array[startingIndex++] = range.minimum;
|
|
313
|
-
array[startingIndex++] = range.maximum;
|
|
314
|
-
array[startingIndex++] = range.containsMinimum;
|
|
315
|
-
array[startingIndex++] = range.containsMaximum;
|
|
316
|
-
|
|
317
|
-
return array;
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
/**
|
|
321
|
-
* 将当前区间对象属性打包至数组
|
|
322
|
-
* @param {Array} array 打包到的数组
|
|
323
|
-
* @param {Integer} startingIndex 数组起始索引,默认0
|
|
324
|
-
* @returns {Array} 打包后的数组
|
|
325
|
-
*/
|
|
326
|
-
toArray(array, startingIndex = 0) {
|
|
327
|
-
return Range.pack(this, array, startingIndex);
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
/**
|
|
331
|
-
* 从一个数组中提取一个区间对象的所有属性
|
|
332
|
-
* @param {Array} array 提取属性的数组
|
|
333
|
-
* @param {Integer} startingIndex 数组起始索引,默认0
|
|
334
|
-
* @param {Range} result 结果区间对象,可不填
|
|
335
|
-
* @returns {Range} 结果区间对象
|
|
336
|
-
*/
|
|
337
|
-
static unpack(array, startingIndex = 0, result = new Range()) {
|
|
338
|
-
Check.typeOf.array("array", array);
|
|
339
|
-
//>>includeEnd('debug');
|
|
340
|
-
|
|
341
|
-
result.minimum = array[startingIndex++];
|
|
342
|
-
result.maximum = array[startingIndex++];
|
|
343
|
-
result.containsMinimum = array[startingIndex++];
|
|
344
|
-
result.containsMaximum = array[startingIndex++];
|
|
345
|
-
|
|
346
|
-
return result;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
/**
|
|
350
|
-
* 从一个数组给当前区间对象赋值
|
|
351
|
-
* @param {Array} array 提取属性的数组
|
|
352
|
-
* @param {Integer} startingIndex 数组起始索引,默认0
|
|
353
|
-
* @returns {Range} 当前区间对象
|
|
354
|
-
*/
|
|
355
|
-
fromArray(array, startingIndex = 0) {
|
|
356
|
-
return Range.unpack(array, startingIndex, this);
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
toString() {
|
|
360
|
-
return 'Range:' + this.containsMinimum ? '[' : '(' + this.minimum + ', ' + this.maximum + this.containsMaximum ? ']' : ')';
|
|
361
|
-
}
|
|
362
|
-
};
|
|
363
|
-
|
|
364
|
-
Range.packedLength = 4;
|
|
365
|
-
|
|
366
|
-
export default Range;
|