@lijuhong1981/jsmath 1.0.4 → 1.0.5
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/index.js +4 -2
- package/package.json +1 -1
- package/src/Interval.js +319 -0
- package/src/clampLatitude.js +2 -1
- package/src/clampLongitude.js +1 -1
- package/src/convertToLatitudeRange.js +9 -1
- package/src/convertToLongitudeRange.js +7 -1
- package/src/lerp.js +21 -0
- package/src/percentInRange.js +1 -1
- package/src/percentToRange.js +0 -21
package/index.js
CHANGED
|
@@ -21,10 +21,11 @@ import convertToRadiansCircular from "./src/convertToRadiansCircular.js";
|
|
|
21
21
|
import convertToLatitudeRange from "./src/convertToLatitudeRange.js";
|
|
22
22
|
import convertToLongitudeRange from "./src/convertToLongitudeRange.js";
|
|
23
23
|
import isBetween from "./src/isBetween.js";
|
|
24
|
+
import lerp from "./src/lerp.js";
|
|
24
25
|
import percentInRange from "./src/percentInRange.js";
|
|
25
|
-
import percentToRange from "./src/percentToRange.js";
|
|
26
26
|
import randomInteger from "./src/randomInteger.js";
|
|
27
27
|
import randomNumber from "./src/randomNumber.js";
|
|
28
|
+
import Interval from "./src/Interval.js";
|
|
28
29
|
|
|
29
30
|
export {
|
|
30
31
|
PI,
|
|
@@ -48,8 +49,9 @@ export {
|
|
|
48
49
|
convertToLatitudeRange,
|
|
49
50
|
convertToLongitudeRange,
|
|
50
51
|
isBetween,
|
|
52
|
+
lerp,
|
|
51
53
|
percentInRange,
|
|
52
|
-
percentToRange,
|
|
53
54
|
randomInteger,
|
|
54
55
|
randomNumber,
|
|
56
|
+
Interval,
|
|
55
57
|
};
|
package/package.json
CHANGED
package/src/Interval.js
ADDED
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import Check from "@lijuhong1981/jscheck";
|
|
2
|
+
import isBetween from "./isBetween.js";
|
|
3
|
+
import lerp from "./lerp.js";
|
|
4
|
+
import percentInRange from "./percentInRange.js";
|
|
5
|
+
|
|
6
|
+
function checkMinMaxValue(interval) {
|
|
7
|
+
if (interval.minimum > interval.maximum) {
|
|
8
|
+
const temp = interval.minimum;
|
|
9
|
+
interval.minimum = interval.maximum;
|
|
10
|
+
interval.maximum = temp;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Interval对象用来表示数学上的区间集合
|
|
16
|
+
*/
|
|
17
|
+
class Interval {
|
|
18
|
+
/**
|
|
19
|
+
* 构造函数
|
|
20
|
+
* @param {Number} minimum 区间较小数,默认0
|
|
21
|
+
* @param {Number} maximum 区间较大数,默认1
|
|
22
|
+
* @param {Boolean} containsMinimum 区间是否包含较小数,默认true
|
|
23
|
+
* @param {Boolean} containsMaximum 区间是否包含较大数,默认true
|
|
24
|
+
*/
|
|
25
|
+
constructor(minimum = 0, maximum = 1, containsMinimum = true, containsMaximum = true) {
|
|
26
|
+
this.minimum = minimum;
|
|
27
|
+
this.maximum = maximum;
|
|
28
|
+
this.containsMinimum = containsMinimum;
|
|
29
|
+
this.containsMaximum = containsMaximum;
|
|
30
|
+
checkMinMaxValue(this);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
get isInterval() {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 判断该区间是否为空集
|
|
39
|
+
* @returns {Boolean}
|
|
40
|
+
*/
|
|
41
|
+
isEmpty() {
|
|
42
|
+
if (this.minimum === this.maximum)
|
|
43
|
+
return true;
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 获取区间长度
|
|
49
|
+
* @returns {Number}
|
|
50
|
+
*/
|
|
51
|
+
get length() {
|
|
52
|
+
return this.maximum - this.minimum;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* 判断一个数值是否处于该区间内
|
|
57
|
+
* @param {Number} 需要判断的数值
|
|
58
|
+
* @returns {Boolean}
|
|
59
|
+
*/
|
|
60
|
+
isBetween(value) {
|
|
61
|
+
return isBetween(value, this.minimum, this.maximum, this.containsMinimum, this.containsMaximum);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 在该区间内线性插值
|
|
66
|
+
* @param {Number} percent 插值百分比,needClamp为true时约束在[0,1]区间内,为false时可超出[0,1]区间
|
|
67
|
+
* @param {Boolean} needClamp 是否需要约束插值,默认true
|
|
68
|
+
* @returns {Number} 插值结果
|
|
69
|
+
*/
|
|
70
|
+
lerp(percent, needClamp = true) {
|
|
71
|
+
return lerp(this.minimum, this.maximum, percent, needClamp);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* 计算一个数值在当前区间内的线性插值百分比
|
|
76
|
+
* @param {Number} value 需要计算的数值
|
|
77
|
+
* @param {Boolean} needClamp 是否需要约束至0到1之间,默认true
|
|
78
|
+
* @returns {Number} 百分比
|
|
79
|
+
*/
|
|
80
|
+
percent(value, needClamp = true) {
|
|
81
|
+
return percentInRange(value, this.minimum, this.maximum, needClamp);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* 判断两个区间对象是否相等
|
|
86
|
+
* @param {Interval} left
|
|
87
|
+
* @param {Interval} right
|
|
88
|
+
* @returns {Boolean}
|
|
89
|
+
*/
|
|
90
|
+
static equals(left, right) {
|
|
91
|
+
Check.instanceOf('left', left, Interval);
|
|
92
|
+
Check.instanceOf('right', right, Interval);
|
|
93
|
+
if (left === right)
|
|
94
|
+
return true;
|
|
95
|
+
if (left && right && left.minimum === right.minimum && left.maximum === right.maximum && left.containsMinimum === right.containsMinimum && left.containsMaximum === right.containsMaximum)
|
|
96
|
+
return true;
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* 判断当前区间是否与另一个区间相等
|
|
102
|
+
* @param {Interval} other
|
|
103
|
+
* @returns {Boolean}
|
|
104
|
+
*/
|
|
105
|
+
equals(other) {
|
|
106
|
+
return Interval.equals(this, other);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* 两个区间相加,left + right
|
|
111
|
+
* @param {Interval} left
|
|
112
|
+
* @param {Interval} right
|
|
113
|
+
* @param {Interval} result 结果区间对象,可不填
|
|
114
|
+
* @returns {Interval} 结果区间对象
|
|
115
|
+
*/
|
|
116
|
+
static add(left, right, result = new Interval()) {
|
|
117
|
+
Check.instanceOf('left', left, Interval);
|
|
118
|
+
Check.instanceOf('right', right, Interval);
|
|
119
|
+
|
|
120
|
+
result.minimum = left.minimum + right.minimum;
|
|
121
|
+
result.maximum = left.maximum + right.maximum;
|
|
122
|
+
result.containsMinimum = left.containsMinimum && right.containsMinimum;
|
|
123
|
+
result.containsMaximum = left.containsMaximum && right.containsMaximum;
|
|
124
|
+
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* 当前区间与另一个区间相加
|
|
130
|
+
* @param {Interval} other
|
|
131
|
+
* @returns {Interval} 当前区间对象
|
|
132
|
+
*/
|
|
133
|
+
add(other) {
|
|
134
|
+
return Interval.add(this, other, this);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* 两个区间相减,left - right
|
|
139
|
+
* @param {Interval} left
|
|
140
|
+
* @param {Interval} right
|
|
141
|
+
* @param {Interval} result 结果区间对象,可不填
|
|
142
|
+
* @returns {Interval} 结果区间对象
|
|
143
|
+
*/
|
|
144
|
+
static subtract(left, right, result = new Interval()) {
|
|
145
|
+
Check.instanceOf('left', left, Interval);
|
|
146
|
+
Check.instanceOf('right', right, Interval);
|
|
147
|
+
|
|
148
|
+
result.minimum = left.minimum - right.minimum;
|
|
149
|
+
result.maximum = left.maximum - right.maximum;
|
|
150
|
+
result.containsMinimum = left.containsMinimum && right.containsMinimum;
|
|
151
|
+
result.containsMaximum = left.containsMaximum && right.containsMaximum;
|
|
152
|
+
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* 当前区间减去另一个区间
|
|
158
|
+
* @param {Interval} other
|
|
159
|
+
* @returns {Interval} 当前区间对象
|
|
160
|
+
*/
|
|
161
|
+
subtract(other) {
|
|
162
|
+
return Interval.subtract(this, other, this);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* 两个区间相乘,left x right
|
|
167
|
+
* @param {Interval} left
|
|
168
|
+
* @param {Interval} right
|
|
169
|
+
* @param {Interval} result 结果区间对象,可不填
|
|
170
|
+
* @returns {Interval} 结果区间对象
|
|
171
|
+
*/
|
|
172
|
+
static multiply(left, right, result = new Interval()) {
|
|
173
|
+
Check.instanceOf('left', left, Interval);
|
|
174
|
+
Check.instanceOf('right', right, Interval);
|
|
175
|
+
|
|
176
|
+
const ac = left.minimum * right.minimum;
|
|
177
|
+
const ad = left.minimum * right.maximum;
|
|
178
|
+
const bc = left.maximum * right.minimum;
|
|
179
|
+
const bd = left.maximum * right.maximum;
|
|
180
|
+
result.minimum = Math.min(ac, ad, bc, bd);
|
|
181
|
+
result.maximum = Math.max(ac, ad, bc, bd);
|
|
182
|
+
result.containsMinimum = left.containsMinimum && right.containsMinimum;
|
|
183
|
+
result.containsMaximum = left.containsMaximum && right.containsMaximum;
|
|
184
|
+
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* 当前区间乘以另一个区间
|
|
190
|
+
* @param {Interval} other
|
|
191
|
+
* @returns {Interval} 当前区间对象
|
|
192
|
+
*/
|
|
193
|
+
multiply(other) {
|
|
194
|
+
return Interval.multiply(this, other, this);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* 两个区间相除,left / right
|
|
199
|
+
* @param {Interval} left
|
|
200
|
+
* @param {Interval} right
|
|
201
|
+
* @param {Interval} result 结果区间对象,可不填
|
|
202
|
+
* @returns {Interval} 结果区间对象
|
|
203
|
+
*/
|
|
204
|
+
static divide(left, right, result = new Interval()) {
|
|
205
|
+
Check.instanceOf('left', left, Interval);
|
|
206
|
+
Check.instanceOf('right', right, Interval);
|
|
207
|
+
|
|
208
|
+
const ac = left.minimum / right.minimum;
|
|
209
|
+
const ad = left.minimum / right.maximum;
|
|
210
|
+
const bc = left.maximum / right.minimum;
|
|
211
|
+
const bd = left.maximum / right.maximum;
|
|
212
|
+
result.minimum = Math.min(ac, ad, bc, bd);
|
|
213
|
+
result.maximum = Math.max(ac, ad, bc, bd);
|
|
214
|
+
result.containsMinimum = left.containsMinimum && right.containsMinimum;
|
|
215
|
+
result.containsMaximum = left.containsMaximum && right.containsMaximum;
|
|
216
|
+
|
|
217
|
+
return result;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* 当前区间除以另一个区间
|
|
222
|
+
* @param {Interval} other
|
|
223
|
+
* @returns {Interval} 当前区间对象
|
|
224
|
+
*/
|
|
225
|
+
divide(other) {
|
|
226
|
+
return Interval.divide(this, other, this);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* 克隆一个区间对象
|
|
231
|
+
* @param {Interval} interval 需要克隆的区间对象
|
|
232
|
+
* @param {Interval} result 结果区间对象,可不设置
|
|
233
|
+
* @returns {Interval} 结果区间对象
|
|
234
|
+
*/
|
|
235
|
+
static clone(interval, result = new Interval()) {
|
|
236
|
+
Check.instanceOf('interval', interval, Interval);
|
|
237
|
+
|
|
238
|
+
result.minimum = interval.minimum;
|
|
239
|
+
result.maximum = interval.maximum;
|
|
240
|
+
result.containsMinimum = interval.containsMinimum;
|
|
241
|
+
result.containsMaximum = interval.containsMaximum;
|
|
242
|
+
|
|
243
|
+
return result;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* 克隆当前区间对象
|
|
248
|
+
* @param {Interval} result 结果区间对象,可不设置
|
|
249
|
+
* @returns {Interval} 结果区间对象
|
|
250
|
+
*/
|
|
251
|
+
clone(result) {
|
|
252
|
+
return Interval.clone(this, result);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* 将一个区间对象的所有属性打包到一个数组中
|
|
257
|
+
* @param {Interval} interval 需要打包的区间对象
|
|
258
|
+
* @param {Array} array 打包到的数组
|
|
259
|
+
* @param {Integer} startingIndex 数组起始索引,默认0
|
|
260
|
+
* @returns {Array} 打包后的数组
|
|
261
|
+
*/
|
|
262
|
+
static pack(interval, array = [], startingIndex = 0) {
|
|
263
|
+
Check.instanceOf('interval', interval, Interval);
|
|
264
|
+
|
|
265
|
+
array[startingIndex++] = interval.minimum;
|
|
266
|
+
array[startingIndex++] = interval.maximum;
|
|
267
|
+
array[startingIndex++] = interval.containsMinimum;
|
|
268
|
+
array[startingIndex++] = interval.containsMaximum;
|
|
269
|
+
|
|
270
|
+
return array;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* 将当前区间对象属性打包至数组
|
|
275
|
+
* @param {Array} array 打包到的数组
|
|
276
|
+
* @param {Integer} startingIndex 数组起始索引,默认0
|
|
277
|
+
* @returns {Array} 打包后的数组
|
|
278
|
+
*/
|
|
279
|
+
toArray(array, startingIndex = 0) {
|
|
280
|
+
return Interval.pack(this, array, startingIndex);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* 从一个数组中提取一个区间对象的所有属性
|
|
285
|
+
* @param {Array} array 提取属性的数组
|
|
286
|
+
* @param {Integer} startingIndex 数组起始索引,默认0
|
|
287
|
+
* @param {Interval} result 结果区间对象,可不填
|
|
288
|
+
* @returns {Interval} 结果区间对象
|
|
289
|
+
*/
|
|
290
|
+
static unpack(array, startingIndex = 0, result = new Interval()) {
|
|
291
|
+
Check.typeOf.array("array", array);
|
|
292
|
+
//>>includeEnd('debug');
|
|
293
|
+
|
|
294
|
+
result.minimum = array[startingIndex++];
|
|
295
|
+
result.maximum = array[startingIndex++];
|
|
296
|
+
result.containsMinimum = array[startingIndex++];
|
|
297
|
+
result.containsMaximum = array[startingIndex++];
|
|
298
|
+
|
|
299
|
+
return result;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* 从一个数组给当前区间对象赋值
|
|
304
|
+
* @param {Array} array 提取属性的数组
|
|
305
|
+
* @param {Integer} startingIndex 数组起始索引,默认0
|
|
306
|
+
* @returns {Interval} 当前区间对象
|
|
307
|
+
*/
|
|
308
|
+
fromArray(array, startingIndex = 0) {
|
|
309
|
+
return Interval.unpack(array, startingIndex, this);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
toString() {
|
|
313
|
+
return 'Interval:' + this.containsMinimum ? '[' : '(' + this.minimum + ', ' + this.maximum + this.containsMaximum ? ']' : ')'
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
Interval.packedLength = 4;
|
|
318
|
+
|
|
319
|
+
export default Interval;
|
package/src/clampLatitude.js
CHANGED
package/src/clampLongitude.js
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Check from "@lijuhong1981/jscheck";
|
|
2
|
+
import { PI_OVER_TWO } from "./Constant.js";
|
|
2
3
|
|
|
4
|
+
/**
|
|
5
|
+
* 转换一个纬度值至纬度范围内
|
|
6
|
+
* @param {Number} latitude 需要转换的纬度值
|
|
7
|
+
* @param {Boolean} degrees 单位,true表示角度单位,false表示弧度单位,默认true
|
|
8
|
+
* @returns {Number} 转换后的纬度
|
|
9
|
+
*/
|
|
3
10
|
function convertToLatitudeRange(latitude, degrees = true) {
|
|
11
|
+
Check.typeOf.number('latitude', latitude);
|
|
4
12
|
if (degrees) {
|
|
5
13
|
while (latitude > 90 || latitude < -90) {
|
|
6
14
|
if (latitude > 90) {
|
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import { convertToRange } from "
|
|
1
|
+
import { convertToRange } from "./convertToRange.js";
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* 转换一个经度值至经度范围内
|
|
5
|
+
* @param {Number} longitude 需要转换的经度值
|
|
6
|
+
* @param {Boolean} degrees 单位,true表示角度单位,false表示弧度单位,默认true
|
|
7
|
+
* @returns {Number} 转换后的经度
|
|
8
|
+
*/
|
|
3
9
|
function convertToLongitudeRange(longitude, degrees = true) {
|
|
4
10
|
if (degrees)
|
|
5
11
|
return convertToRange(longitude, -180, 180);
|
package/src/lerp.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import Check from "@lijuhong1981/jscheck";
|
|
2
|
+
import clamp from "./clamp.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 在两个数值间线性插值
|
|
6
|
+
* @param {Number} strat 开始数值
|
|
7
|
+
* @param {Number} end 结束数值
|
|
8
|
+
* @param {Number} percent 插值百分比,needClamp为true时约束在[0,1]区间内,为false时可超出[0,1]区间
|
|
9
|
+
* @param {Boolean} needClamp 是否需要约束插值,默认true
|
|
10
|
+
* @returns {Number} 插值结果
|
|
11
|
+
*/
|
|
12
|
+
function lerp(strat, end, percent, needClamp = true) {
|
|
13
|
+
Check.typeOf.number('strat', strat);
|
|
14
|
+
Check.typeOf.number('end', end);
|
|
15
|
+
Check.typeOf.number('percent', percent);
|
|
16
|
+
if (needClamp)
|
|
17
|
+
percent = clamp(percent, 0, 1);
|
|
18
|
+
return strat + (end - strat) * percent;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export default lerp;
|
package/src/percentInRange.js
CHANGED
package/src/percentToRange.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import Check from "@lijuhong1981/jscheck";
|
|
2
|
-
import clamp from "./clamp.js";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* 根据百分比计算在两个数值之间的数
|
|
6
|
-
* @param {Number} percent 百分比
|
|
7
|
-
* @param {Number} rangeMinimum 较小数
|
|
8
|
-
* @param {Number} rangeMaximum 较大数
|
|
9
|
-
* @param {Boolean} needClamp 是否需要约束至两个数值之间,默认false
|
|
10
|
-
* @returns {Number} 计算结果
|
|
11
|
-
*/
|
|
12
|
-
function percentToRange(percent, rangeMinimum, rangeMaximum, needClamp = false) {
|
|
13
|
-
Check.typeOf.number('value', value);
|
|
14
|
-
Check.typeOf.number('rangeMinimum', rangeMinimum);
|
|
15
|
-
Check.typeOf.number('rangeMaximum', rangeMaximum);
|
|
16
|
-
if (needClamp)
|
|
17
|
-
percent = clamp(percent, 0, 1);
|
|
18
|
-
return rangeMinimum + (rangeMaximum - rangeMinimum) * percent;
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
export default percentToRange;
|