@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 ADDED
@@ -0,0 +1,11 @@
1
+ # `@lijuhong1981/jsmath`
2
+
3
+ > TODO: description
4
+
5
+ ## Usage
6
+
7
+ ```
8
+ const jsmath = require('@lijuhong1981/jsmath');
9
+
10
+ // TODO: DEMONSTRATE API
11
+ ```
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 Range from "./src/Range.js";
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
- Range,
114
+ Interval,
115
115
  };
package/package.json CHANGED
@@ -1,24 +1,18 @@
1
1
  {
2
2
  "name": "@lijuhong1981/jsmath",
3
- "version": "1.0.19",
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/jsmath.git"
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/jsmath/issues"
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
+ }
@@ -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) {
@@ -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
 
@@ -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
 
@@ -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
 
@@ -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=2 小数位数
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
@@ -1,2 +0,0 @@
1
- # Auto detect text files and perform LF normalization
2
- * text=auto
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;