jc-structure 0.1.13 → 0.1.15
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/dist/jc-structure.js +329 -145
- package/dist/jc-structure.umd.cjs +2 -2
- package/index.d.ts +203 -73
- package/package.json +1 -1
package/dist/jc-structure.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
class
|
|
1
|
+
class j {
|
|
2
2
|
items = {};
|
|
3
3
|
count = 0;
|
|
4
4
|
lowestCount = 0;
|
|
@@ -58,21 +58,11 @@ class U {
|
|
|
58
58
|
throw new Error("Invalid item: item cannot be null or undefined");
|
|
59
59
|
return this.items[this.count] = t, this.count++, this;
|
|
60
60
|
}
|
|
61
|
-
/**
|
|
62
|
-
* 从参数中提取需要添加的元素
|
|
63
|
-
* @param args 传入的参数
|
|
64
|
-
* @returns 需要添加的元素数组
|
|
65
|
-
*/
|
|
66
61
|
addItems(t) {
|
|
67
62
|
return t.filter((s) => this.isValidItem(s)).forEach((s) => {
|
|
68
63
|
this.items[this.count] = s, this.count++;
|
|
69
64
|
}), this;
|
|
70
65
|
}
|
|
71
|
-
/**
|
|
72
|
-
* 验证元素是否有效
|
|
73
|
-
* @param item 要验证的元素
|
|
74
|
-
* @returns 是否有效
|
|
75
|
-
*/
|
|
76
66
|
isValidItem(t) {
|
|
77
67
|
return t != null;
|
|
78
68
|
}
|
|
@@ -92,13 +82,42 @@ class U {
|
|
|
92
82
|
return this.isEmpty() ? "" : `Stack(count: ${this.count}):[${this.items[this.count - 1]},...rest]`;
|
|
93
83
|
}
|
|
94
84
|
}
|
|
95
|
-
|
|
85
|
+
class $ {
|
|
86
|
+
stack = [];
|
|
87
|
+
minStack = [];
|
|
88
|
+
push(t) {
|
|
89
|
+
this.stack.push(t), (this.minStack.length === 0 || t <= this.minStack[this.minStack.length - 1]) && this.minStack.push(t);
|
|
90
|
+
}
|
|
91
|
+
pop() {
|
|
92
|
+
const t = this.stack.pop();
|
|
93
|
+
return t === this.minStack[this.minStack.length - 1] && this.minStack.pop(), t;
|
|
94
|
+
}
|
|
95
|
+
peek() {
|
|
96
|
+
return this.stack[this.stack.length - 1];
|
|
97
|
+
}
|
|
98
|
+
getMin() {
|
|
99
|
+
return this.minStack[this.minStack.length - 1];
|
|
100
|
+
}
|
|
101
|
+
isEmpty() {
|
|
102
|
+
return this.size() === 0;
|
|
103
|
+
}
|
|
104
|
+
size() {
|
|
105
|
+
return this.stack.length;
|
|
106
|
+
}
|
|
107
|
+
clear() {
|
|
108
|
+
this.stack = [], this.minStack = [];
|
|
109
|
+
}
|
|
110
|
+
toString() {
|
|
111
|
+
return this.isEmpty() ? "" : `MinStack(count: ${this.size()}):[${this.getMin()},...rest]`;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function k(r, t) {
|
|
96
115
|
return r === t ? 0 : r < t ? -1 : 1;
|
|
97
116
|
}
|
|
98
|
-
class
|
|
117
|
+
class y {
|
|
99
118
|
heap = [];
|
|
100
119
|
compareFn;
|
|
101
|
-
constructor(t =
|
|
120
|
+
constructor(t = k) {
|
|
102
121
|
this.compareFn = t;
|
|
103
122
|
}
|
|
104
123
|
static getLeftIndex(t) {
|
|
@@ -129,7 +148,7 @@ class w {
|
|
|
129
148
|
return this.heap.toString();
|
|
130
149
|
}
|
|
131
150
|
}
|
|
132
|
-
class
|
|
151
|
+
class O extends y {
|
|
133
152
|
insert(t) {
|
|
134
153
|
return t ? !1 : (this.heap.push(t), this.siftUp(this.heap.length - 1), !0);
|
|
135
154
|
}
|
|
@@ -140,24 +159,24 @@ class R extends w {
|
|
|
140
159
|
return this.heap[0] = this.heap.pop(), this.siftDown(0), t;
|
|
141
160
|
}
|
|
142
161
|
siftUp(t) {
|
|
143
|
-
let e = t, s =
|
|
144
|
-
s < n && this.compareFn(this.heap[e], this.heap[s]) === -1 && (e = s), i < n && this.compareFn(this.heap[e], this.heap[i]) === 1 && (e = i), e !== t && (
|
|
162
|
+
let e = t, s = y.getLeftIndex(e), i = y.getRightIndex(e), n = this.size();
|
|
163
|
+
s < n && this.compareFn(this.heap[e], this.heap[s]) === -1 && (e = s), i < n && this.compareFn(this.heap[e], this.heap[i]) === 1 && (e = i), e !== t && (y.swap(this.heap, t, e), this.siftUp(e));
|
|
145
164
|
}
|
|
146
165
|
siftDown(t) {
|
|
147
|
-
let e =
|
|
166
|
+
let e = y.getParentIndex(t);
|
|
148
167
|
for (; t > 0 && e && this.compareFn(this.heap[e], this.heap[t]) === 1; )
|
|
149
|
-
|
|
168
|
+
y.swap(this.heap, e, t), t = e, e = y.getParentIndex(t);
|
|
150
169
|
}
|
|
151
170
|
}
|
|
152
|
-
class q extends
|
|
153
|
-
constructor(t = (e, s) =>
|
|
171
|
+
class q extends O {
|
|
172
|
+
constructor(t = (e, s) => k(s, e)) {
|
|
154
173
|
super(t);
|
|
155
174
|
}
|
|
156
175
|
}
|
|
157
|
-
function
|
|
176
|
+
function R(r) {
|
|
158
177
|
return { value: r };
|
|
159
178
|
}
|
|
160
|
-
class
|
|
179
|
+
class D {
|
|
161
180
|
capacity;
|
|
162
181
|
length = 0;
|
|
163
182
|
head = null;
|
|
@@ -187,14 +206,14 @@ class _ {
|
|
|
187
206
|
}
|
|
188
207
|
update(t, e) {
|
|
189
208
|
let s = this.lookup.get(t);
|
|
190
|
-
s ? (this.detach(s), this.prepend(s), s.value = e) : (s =
|
|
209
|
+
s ? (this.detach(s), this.prepend(s), s.value = e) : (s = R(e), this.length++, this.prepend(s), this.trimCache(), this.lookup.set(t, s), this.reverseLookup);
|
|
191
210
|
}
|
|
192
211
|
}
|
|
193
212
|
let A = class {
|
|
194
213
|
value;
|
|
195
214
|
next = void 0;
|
|
196
215
|
};
|
|
197
|
-
class
|
|
216
|
+
class H {
|
|
198
217
|
count = 0;
|
|
199
218
|
head = void 0;
|
|
200
219
|
constructor() {
|
|
@@ -273,17 +292,17 @@ class $ {
|
|
|
273
292
|
return t = t.slice(0, -1), t;
|
|
274
293
|
}
|
|
275
294
|
}
|
|
276
|
-
class
|
|
295
|
+
class V {
|
|
277
296
|
key;
|
|
278
297
|
value;
|
|
279
298
|
constructor(t, e) {
|
|
280
299
|
this.key = t, this.value = e;
|
|
281
300
|
}
|
|
282
301
|
}
|
|
283
|
-
function
|
|
302
|
+
function P(r, t = { emptyString: !1, zeroNumber: !1 }) {
|
|
284
303
|
return r == null ? !(t.emptyString && r === "" || t.zeroNumber && r === 0) : !1;
|
|
285
304
|
}
|
|
286
|
-
class
|
|
305
|
+
class z {
|
|
287
306
|
table = [];
|
|
288
307
|
constructor() {
|
|
289
308
|
}
|
|
@@ -294,15 +313,15 @@ class j {
|
|
|
294
313
|
return -1;
|
|
295
314
|
}
|
|
296
315
|
set(t, e) {
|
|
297
|
-
if (
|
|
316
|
+
if (P(t))
|
|
298
317
|
throw new Error("key is required");
|
|
299
|
-
if (
|
|
318
|
+
if (P(e))
|
|
300
319
|
throw new Error("value is required");
|
|
301
320
|
if (this.has(t)) {
|
|
302
321
|
let s = this.getItemIndex(t);
|
|
303
322
|
this.table[s].value = e;
|
|
304
323
|
} else {
|
|
305
|
-
const s = new
|
|
324
|
+
const s = new V(t, e);
|
|
306
325
|
this.table.push(s);
|
|
307
326
|
}
|
|
308
327
|
}
|
|
@@ -353,12 +372,12 @@ class j {
|
|
|
353
372
|
return t = t.slice(0, -1), t;
|
|
354
373
|
}
|
|
355
374
|
}
|
|
356
|
-
class
|
|
375
|
+
class W {
|
|
357
376
|
isDirected;
|
|
358
377
|
vertices;
|
|
359
378
|
adjList;
|
|
360
379
|
constructor(t = !1) {
|
|
361
|
-
this.isDirected = t, this.vertices = [], this.adjList = new
|
|
380
|
+
this.isDirected = t, this.vertices = [], this.adjList = new z();
|
|
362
381
|
}
|
|
363
382
|
addVertex(t) {
|
|
364
383
|
this.vertices.includes(t) || (this.vertices.push(t), this.adjList.set(t, []));
|
|
@@ -380,10 +399,10 @@ class H {
|
|
|
380
399
|
return t;
|
|
381
400
|
}
|
|
382
401
|
}
|
|
383
|
-
class
|
|
402
|
+
class w {
|
|
384
403
|
_data;
|
|
385
404
|
static zero(t) {
|
|
386
|
-
return new
|
|
405
|
+
return new w(...Array(t).fill(0));
|
|
387
406
|
}
|
|
388
407
|
constructor(...t) {
|
|
389
408
|
this._data = t;
|
|
@@ -402,7 +421,7 @@ class g {
|
|
|
402
421
|
if (t === 0)
|
|
403
422
|
throw new Error("Cannot normalize a zero vector");
|
|
404
423
|
const e = this._data.map((s) => s / t);
|
|
405
|
-
return new
|
|
424
|
+
return new w(...e);
|
|
406
425
|
}
|
|
407
426
|
add(t) {
|
|
408
427
|
if (this.dimension !== t.dimension)
|
|
@@ -410,7 +429,7 @@ class g {
|
|
|
410
429
|
const e = this._data.map(
|
|
411
430
|
(s, i) => s + t._data[i]
|
|
412
431
|
);
|
|
413
|
-
return new
|
|
432
|
+
return new w(...e);
|
|
414
433
|
}
|
|
415
434
|
sub(t) {
|
|
416
435
|
if (this.dimension !== t.dimension)
|
|
@@ -418,10 +437,10 @@ class g {
|
|
|
418
437
|
const e = this._data.map(
|
|
419
438
|
(s, i) => s - t._data[i]
|
|
420
439
|
);
|
|
421
|
-
return new
|
|
440
|
+
return new w(...e);
|
|
422
441
|
}
|
|
423
442
|
mul(t) {
|
|
424
|
-
return new
|
|
443
|
+
return new w(...this._data.map((e) => e * t));
|
|
425
444
|
}
|
|
426
445
|
dot(t) {
|
|
427
446
|
if (this.dimension !== t.dimension)
|
|
@@ -461,10 +480,10 @@ class E {
|
|
|
461
480
|
return this.row * this.col;
|
|
462
481
|
}
|
|
463
482
|
rowVector(t) {
|
|
464
|
-
return new
|
|
483
|
+
return new w(...this._matrix[t]);
|
|
465
484
|
}
|
|
466
485
|
colVector(t) {
|
|
467
|
-
return new
|
|
486
|
+
return new w(...this._matrix.map((e) => e[t]));
|
|
468
487
|
}
|
|
469
488
|
getItem(t) {
|
|
470
489
|
return this._matrix[t[0]][t[1]];
|
|
@@ -515,7 +534,7 @@ class E {
|
|
|
515
534
|
return e;
|
|
516
535
|
}
|
|
517
536
|
}
|
|
518
|
-
class
|
|
537
|
+
class c {
|
|
519
538
|
static distance(t, e) {
|
|
520
539
|
return Math.hypot(e.x - t.x, e.y - t.y);
|
|
521
540
|
}
|
|
@@ -525,42 +544,42 @@ class a {
|
|
|
525
544
|
this.x = t, this.y = e;
|
|
526
545
|
}
|
|
527
546
|
distanceTo(t) {
|
|
528
|
-
return
|
|
547
|
+
return c.distance(this, t);
|
|
529
548
|
}
|
|
530
549
|
}
|
|
531
|
-
class
|
|
550
|
+
class m {
|
|
532
551
|
// 使用更合适的精度阈值常量
|
|
533
552
|
static EPSILON = 1e-10;
|
|
534
|
-
static sloped(t, e =
|
|
553
|
+
static sloped(t, e = m.EPSILON) {
|
|
535
554
|
const s = t.p2.x - t.p1.x, i = t.p2.y - t.p1.y;
|
|
536
555
|
return Math.abs(s) < e ? Math.abs(i) < e ? 0 : null : i / s;
|
|
537
556
|
}
|
|
538
|
-
static isParallel(t, e, s =
|
|
539
|
-
const i =
|
|
557
|
+
static isParallel(t, e, s = m.EPSILON) {
|
|
558
|
+
const i = m.sloped(t), n = m.sloped(e);
|
|
540
559
|
return i === null && n === null ? !0 : i === null || n === null ? !1 : Math.abs(i - n) < s;
|
|
541
560
|
}
|
|
542
|
-
static getIntersection(t, e, s =
|
|
543
|
-
if (
|
|
544
|
-
const i = t.p1.x, n = t.p1.y,
|
|
545
|
-
if (Math.abs(
|
|
546
|
-
const
|
|
547
|
-
if (
|
|
548
|
-
const
|
|
549
|
-
return new
|
|
561
|
+
static getIntersection(t, e, s = m.EPSILON) {
|
|
562
|
+
if (m.isParallel(t, e)) return null;
|
|
563
|
+
const i = t.p1.x, n = t.p1.y, a = t.p2.x, h = t.p2.y, u = e.p1.x, f = e.p1.y, g = e.p2.x, o = e.p2.y, l = (i - a) * (f - o) - (n - h) * (u - g);
|
|
564
|
+
if (Math.abs(l) < s) return null;
|
|
565
|
+
const d = ((i - u) * (f - o) - (n - f) * (u - g)) / l, S = -((i - a) * (n - f) - (n - h) * (i - u)) / l;
|
|
566
|
+
if (d >= 0 && d <= 1 && S >= 0 && S <= 1) {
|
|
567
|
+
const C = i + d * (a - i), L = n + d * (h - n);
|
|
568
|
+
return new c(C, L);
|
|
550
569
|
}
|
|
551
570
|
return null;
|
|
552
571
|
}
|
|
553
572
|
static isIntersecting(t, e) {
|
|
554
|
-
return
|
|
573
|
+
return m.getIntersection(t, e) !== null;
|
|
555
574
|
}
|
|
556
|
-
static distanceToPoint(t, e, s =
|
|
557
|
-
const i = e.x - t.p1.x, n = e.y - t.p1.y,
|
|
558
|
-
let
|
|
559
|
-
|
|
560
|
-
let
|
|
561
|
-
|
|
562
|
-
const
|
|
563
|
-
return Math.hypot(
|
|
575
|
+
static distanceToPoint(t, e, s = m.EPSILON) {
|
|
576
|
+
const i = e.x - t.p1.x, n = e.y - t.p1.y, a = t.p2.x - t.p1.x, h = t.p2.y - t.p1.y, u = i * a + n * h, f = a * a + h * h;
|
|
577
|
+
let g = -1;
|
|
578
|
+
f > s && (g = u / f);
|
|
579
|
+
let o, l;
|
|
580
|
+
g < 0 ? (o = t.p1.x, l = t.p1.y) : g > 1 ? (o = t.p2.x, l = t.p2.y) : (o = t.p1.x + g * a, l = t.p1.y + g * h);
|
|
581
|
+
const d = e.x - o, S = e.y - l;
|
|
582
|
+
return Math.hypot(d + S);
|
|
564
583
|
}
|
|
565
584
|
p1;
|
|
566
585
|
p2;
|
|
@@ -573,21 +592,21 @@ class l {
|
|
|
573
592
|
}
|
|
574
593
|
get midpoint() {
|
|
575
594
|
const t = (this.p1.x + this.p2.x) / 2, e = (this.p1.y + this.p2.y) / 2;
|
|
576
|
-
return new
|
|
595
|
+
return new c(t, e);
|
|
577
596
|
}
|
|
578
597
|
get angle() {
|
|
579
598
|
return Math.atan2(this.p2.y - this.p1.y, this.p2.x - this.p1.x);
|
|
580
599
|
}
|
|
581
|
-
containsPoint(t, e =
|
|
600
|
+
containsPoint(t, e = m.EPSILON) {
|
|
582
601
|
const s = (t.x - this.p1.x) * (this.p2.y - this.p1.y) - (t.y - this.p1.y) * (this.p2.x - this.p1.x);
|
|
583
602
|
return Math.abs(s) > e ? !1 : (t.x - this.p1.x) * (t.x - this.p2.x) + (t.y - this.p1.y) * (t.y - this.p2.y) <= e;
|
|
584
603
|
}
|
|
585
604
|
// 获取线段的方向向量
|
|
586
605
|
get direction() {
|
|
587
606
|
const t = this.length;
|
|
588
|
-
if (t <
|
|
607
|
+
if (t < m.EPSILON) return new c(0, 0);
|
|
589
608
|
const e = (this.p2.x - this.p1.x) / t, s = (this.p2.y - this.p1.y) / t;
|
|
590
|
-
return new
|
|
609
|
+
return new c(e, s);
|
|
591
610
|
}
|
|
592
611
|
get start() {
|
|
593
612
|
return this.p1;
|
|
@@ -596,34 +615,34 @@ class l {
|
|
|
596
615
|
return this.p2;
|
|
597
616
|
}
|
|
598
617
|
}
|
|
599
|
-
class
|
|
618
|
+
class N {
|
|
600
619
|
static EPSILON = 1e-10;
|
|
601
620
|
name;
|
|
602
621
|
constructor(t) {
|
|
603
622
|
this.name = t;
|
|
604
623
|
}
|
|
605
624
|
}
|
|
606
|
-
class
|
|
625
|
+
class p extends N {
|
|
607
626
|
static isValid(t, e, s) {
|
|
608
627
|
return t <= 0 || e <= 0 || s <= 0 ? !1 : t + e > s && t + s > e && e + s > t;
|
|
609
628
|
}
|
|
610
629
|
static area(t, e, s) {
|
|
611
|
-
if (!
|
|
630
|
+
if (!p.isValid(t, e, s))
|
|
612
631
|
throw new Error("Invalid triangle");
|
|
613
632
|
const i = (t + e + s) / 2;
|
|
614
633
|
return Math.sqrt(i * (i - t) * (i - e) * (i - s));
|
|
615
634
|
}
|
|
616
635
|
static getType(t, e, s) {
|
|
617
|
-
if (!
|
|
636
|
+
if (!p.isValid(t, e, s))
|
|
618
637
|
throw new Error("Invalid triangle sides");
|
|
619
|
-
const i = [t, e, s].sort((u,
|
|
620
|
-
return Math.abs(n -
|
|
638
|
+
const i = [t, e, s].sort((u, f) => u - f), [n, a, h] = i;
|
|
639
|
+
return Math.abs(n - a) < p.EPSILON && Math.abs(a - h) < p.EPSILON ? "equilateral" : Math.abs(n - a) < p.EPSILON || Math.abs(a - h) < p.EPSILON ? "isosceles" : "scalene";
|
|
621
640
|
}
|
|
622
641
|
static getAngles(t, e, s) {
|
|
623
|
-
if (!
|
|
642
|
+
if (!p.isValid(t, e, s))
|
|
624
643
|
throw new Error("Invalid triangle sides");
|
|
625
|
-
const i = Math.acos((e * e + s * s - t * t) / (2 * e * s)), n = Math.acos((t * t + s * s - e * e) / (2 * t * s)),
|
|
626
|
-
return [i, n,
|
|
644
|
+
const i = Math.acos((e * e + s * s - t * t) / (2 * e * s)), n = Math.acos((t * t + s * s - e * e) / (2 * t * s)), a = Math.PI - i - n;
|
|
645
|
+
return [i, n, a];
|
|
627
646
|
}
|
|
628
647
|
p1;
|
|
629
648
|
p2;
|
|
@@ -636,68 +655,68 @@ class c extends C {
|
|
|
636
655
|
areCollinear() {
|
|
637
656
|
return Math.abs(
|
|
638
657
|
(this.p2.x - this.p1.x) * (this.p3.y - this.p1.y) - (this.p3.x - this.p1.x) * (this.p2.y - this.p1.y)
|
|
639
|
-
) <
|
|
658
|
+
) < N.EPSILON;
|
|
640
659
|
}
|
|
641
660
|
get side() {
|
|
642
661
|
return [
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
662
|
+
c.distance(this.p1, this.p2),
|
|
663
|
+
c.distance(this.p2, this.p3),
|
|
664
|
+
c.distance(this.p3, this.p1)
|
|
646
665
|
];
|
|
647
666
|
}
|
|
648
667
|
perimeter() {
|
|
649
|
-
return
|
|
668
|
+
return p.isValid(this.side[0], this.side[1], this.side[2]), this.side.reduce((t, e) => t + e, 0);
|
|
650
669
|
}
|
|
651
670
|
area() {
|
|
652
671
|
const [t, e, s] = this.side;
|
|
653
|
-
return
|
|
672
|
+
return p.area(t, e, s);
|
|
654
673
|
}
|
|
655
674
|
get type() {
|
|
656
675
|
const [t, e, s] = this.side;
|
|
657
|
-
return
|
|
676
|
+
return p.getType(t, e, s);
|
|
658
677
|
}
|
|
659
678
|
get angles() {
|
|
660
679
|
const [t, e, s] = this.side;
|
|
661
|
-
return
|
|
680
|
+
return p.getAngles(t, e, s);
|
|
662
681
|
}
|
|
663
682
|
get centroid() {
|
|
664
|
-
return new
|
|
683
|
+
return new c(
|
|
665
684
|
(this.p1.x + this.p2.x + this.p3.x) / 3,
|
|
666
685
|
(this.p1.y + this.p2.y + this.p3.y) / 3
|
|
667
686
|
);
|
|
668
687
|
}
|
|
669
688
|
get incenter() {
|
|
670
|
-
const [t, e, s] = this.side, i = this.perimeter() / 2, n = (t * this.p1.x + e * this.p2.x + s * this.p3.x) / i,
|
|
671
|
-
return new
|
|
689
|
+
const [t, e, s] = this.side, i = this.perimeter() / 2, n = (t * this.p1.x + e * this.p2.x + s * this.p3.x) / i, a = (t * this.p1.y + e * this.p2.y + s * this.p3.y) / i;
|
|
690
|
+
return new c(n, a);
|
|
672
691
|
}
|
|
673
692
|
get circumcenter() {
|
|
674
693
|
const t = 2 * (this.p1.x * (this.p2.y - this.p3.y) + this.p2.x * (this.p3.y - this.p1.y) + this.p3.x * (this.p1.y - this.p2.y));
|
|
675
|
-
if (Math.abs(t) <
|
|
694
|
+
if (Math.abs(t) < p.EPSILON)
|
|
676
695
|
throw new Error("Cannot calculate circumcenter for collinear points");
|
|
677
696
|
const e = ((this.p1.x * this.p1.x + this.p1.y * this.p1.y) * (this.p2.y - this.p3.y) + (this.p2.x * this.p2.x + this.p2.y * this.p2.y) * (this.p3.y - this.p1.y) + (this.p3.x * this.p3.x + this.p3.y * this.p3.y) * (this.p1.y - this.p2.y)) / t, s = ((this.p1.x * this.p1.x + this.p1.y * this.p1.y) * (this.p3.x - this.p2.x) + (this.p2.x * this.p2.x + this.p2.y * this.p2.y) * (this.p1.x - this.p3.x) + (this.p3.x * this.p3.x + this.p3.y * this.p3.y) * (this.p2.x - this.p1.x)) / t;
|
|
678
|
-
return new
|
|
697
|
+
return new c(e, s);
|
|
679
698
|
}
|
|
680
699
|
containsPoint(t) {
|
|
681
|
-
const e =
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
), s =
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
), i =
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
700
|
+
const e = p.area(
|
|
701
|
+
c.distance(t, this.p1),
|
|
702
|
+
c.distance(t, this.p2),
|
|
703
|
+
c.distance(this.p1, this.p2)
|
|
704
|
+
), s = p.area(
|
|
705
|
+
c.distance(t, this.p2),
|
|
706
|
+
c.distance(t, this.p3),
|
|
707
|
+
c.distance(this.p2, this.p3)
|
|
708
|
+
), i = p.area(
|
|
709
|
+
c.distance(t, this.p3),
|
|
710
|
+
c.distance(t, this.p1),
|
|
711
|
+
c.distance(this.p3, this.p1)
|
|
693
712
|
);
|
|
694
|
-
return Math.abs(e + s + i - this.area()) <
|
|
713
|
+
return Math.abs(e + s + i - this.area()) < p.EPSILON;
|
|
695
714
|
}
|
|
696
715
|
}
|
|
697
|
-
function
|
|
716
|
+
function T(r) {
|
|
698
717
|
return new Promise((t) => setTimeout(t, r));
|
|
699
718
|
}
|
|
700
|
-
function
|
|
719
|
+
function F(r) {
|
|
701
720
|
const t = [], e = {
|
|
702
721
|
"(": ")",
|
|
703
722
|
"[": "]",
|
|
@@ -713,7 +732,7 @@ function T(r) {
|
|
|
713
732
|
function M(r) {
|
|
714
733
|
return r !== null && (typeof r == "object" || typeof r == "function");
|
|
715
734
|
}
|
|
716
|
-
class
|
|
735
|
+
class B {
|
|
717
736
|
map = /* @__PURE__ */ new Map();
|
|
718
737
|
weakMap = /* @__PURE__ */ new WeakMap();
|
|
719
738
|
set(t, e) {
|
|
@@ -735,16 +754,16 @@ function G(r) {
|
|
|
735
754
|
}
|
|
736
755
|
function e(s) {
|
|
737
756
|
for (let i = t.length - 1; i >= 0; i--) {
|
|
738
|
-
const n = t[i],
|
|
739
|
-
if (
|
|
757
|
+
const n = t[i], a = n[t[i].length - 1];
|
|
758
|
+
if (a < s) {
|
|
740
759
|
t[i + 1] = [...n, s];
|
|
741
760
|
break;
|
|
742
|
-
} else
|
|
761
|
+
} else a > s && i === 0 && (t[i] = [s]);
|
|
743
762
|
}
|
|
744
763
|
}
|
|
745
764
|
return t[t.length - 1];
|
|
746
765
|
}
|
|
747
|
-
class
|
|
766
|
+
class X {
|
|
748
767
|
static ROMAN_MAP = /* @__PURE__ */ new Map([
|
|
749
768
|
["M", 1e3],
|
|
750
769
|
["CM", 900],
|
|
@@ -764,14 +783,14 @@ class B {
|
|
|
764
783
|
if (t.length === 0)
|
|
765
784
|
throw new Error("Input cannot be empty");
|
|
766
785
|
const e = /* @__PURE__ */ new Set(["I", "V", "X", "L", "C", "D", "M"]);
|
|
767
|
-
for (const
|
|
768
|
-
if (!e.has(
|
|
769
|
-
throw new Error(`Invalid Roman numeral character: ${
|
|
786
|
+
for (const a of t)
|
|
787
|
+
if (!e.has(a))
|
|
788
|
+
throw new Error(`Invalid Roman numeral character: ${a}`);
|
|
770
789
|
let s = 0, i = 0;
|
|
771
790
|
for (; i < t.length; ) {
|
|
772
|
-
const
|
|
773
|
-
if (this.ROMAN_MAP.has(
|
|
774
|
-
s += this.ROMAN_MAP.get(
|
|
791
|
+
const a = t.slice(i, i + 2);
|
|
792
|
+
if (this.ROMAN_MAP.has(a))
|
|
793
|
+
s += this.ROMAN_MAP.get(a), i += 2;
|
|
775
794
|
else {
|
|
776
795
|
const h = t[i], u = this.ROMAN_MAP.get(h);
|
|
777
796
|
if (!u)
|
|
@@ -795,7 +814,167 @@ class B {
|
|
|
795
814
|
return e;
|
|
796
815
|
}
|
|
797
816
|
}
|
|
798
|
-
|
|
817
|
+
class Q {
|
|
818
|
+
static isValidPositiveInteger(t) {
|
|
819
|
+
return Number.isInteger(t) && t > 0 && t <= Number.MAX_SAFE_INTEGER;
|
|
820
|
+
}
|
|
821
|
+
static isPowerOfTwo(t) {
|
|
822
|
+
return t > 0 && (t & t - 1) === 0;
|
|
823
|
+
}
|
|
824
|
+
static isOdd(t) {
|
|
825
|
+
return t % 2 === 1 || t % 2 === -1;
|
|
826
|
+
}
|
|
827
|
+
static factorial(t) {
|
|
828
|
+
if (!this.isValidPositiveInteger(t))
|
|
829
|
+
throw new Error("Input must be a non-negative integer");
|
|
830
|
+
if (t < 2)
|
|
831
|
+
return 1;
|
|
832
|
+
let e = 1;
|
|
833
|
+
for (let s = 2; s <= t; s++)
|
|
834
|
+
e *= s;
|
|
835
|
+
return e;
|
|
836
|
+
}
|
|
837
|
+
static fibonacci(t, e = 1, s = 1) {
|
|
838
|
+
if (!this.isValidPositiveInteger(t))
|
|
839
|
+
throw new Error("Input must be a non-negative integer");
|
|
840
|
+
return t < 2 ? s : this.fibonacci(t - 1, s, s + e);
|
|
841
|
+
}
|
|
842
|
+
static fibonacciIterative(t) {
|
|
843
|
+
if (!this.isValidPositiveInteger(t))
|
|
844
|
+
throw new Error("Input must be a non-negative integer");
|
|
845
|
+
let e = 1, s = 1;
|
|
846
|
+
for (let i = 2; i < t; i++)
|
|
847
|
+
[e, s] = [s, e + s];
|
|
848
|
+
return t === 0 ? 0 : s;
|
|
849
|
+
}
|
|
850
|
+
static getPercentWithPrecision(t, e = 2) {
|
|
851
|
+
if (!Array.isArray(t) || t.length === 0)
|
|
852
|
+
return [];
|
|
853
|
+
if (e < 0 || !Number.isInteger(e))
|
|
854
|
+
throw new Error("Precision must be a non-negative integer");
|
|
855
|
+
const s = t.reduce((o, l) => o + l, 0);
|
|
856
|
+
if (s === 0)
|
|
857
|
+
return t.map(() => "0%");
|
|
858
|
+
const n = 100 * Math.pow(10, e), a = t.map((o) => o / s * n), h = a.map((o) => Math.floor(o)), u = a.map((o, l) => o - h[l]);
|
|
859
|
+
let f = h.reduce((o, l) => o + l, 0), g = n - f;
|
|
860
|
+
for (; g > 0; ) {
|
|
861
|
+
let o = -1, l = -1;
|
|
862
|
+
for (let d = 0; d < u.length; d++)
|
|
863
|
+
u[d] > l && (l = u[d], o = d);
|
|
864
|
+
if (o === -1) break;
|
|
865
|
+
h[o]++, u[o] = 0, g--;
|
|
866
|
+
}
|
|
867
|
+
return h.map((o) => `${(o / n * 100).toFixed(e)}%`);
|
|
868
|
+
}
|
|
869
|
+
static fastSqrt(t) {
|
|
870
|
+
if (t < 0)
|
|
871
|
+
throw new Error("n must be a non-negative number");
|
|
872
|
+
const e = 0.5 * t;
|
|
873
|
+
let s = new BigInt64Array(new Float32Array([t]).buffer)[0];
|
|
874
|
+
s = 0x1ff7a3bea91d9b1bn + (s >> 1n);
|
|
875
|
+
let i = new Float64Array(new BigInt64Array([s]).buffer)[0];
|
|
876
|
+
return i = i * 0.5 + e / i, i = i * 0.5 + e / i, i = i * 0.5 + e / i, i;
|
|
877
|
+
}
|
|
878
|
+
static middle(t, e) {
|
|
879
|
+
return e - (e - t >> 1);
|
|
880
|
+
}
|
|
881
|
+
static gcd(t, e) {
|
|
882
|
+
return e === 0 ? t : this.gcd(e, t % e);
|
|
883
|
+
}
|
|
884
|
+
static lcm(t, e) {
|
|
885
|
+
return t * e / this.gcd(t, e);
|
|
886
|
+
}
|
|
887
|
+
static isPrime(t) {
|
|
888
|
+
if (t <= 1)
|
|
889
|
+
return !1;
|
|
890
|
+
for (let e = 2; e <= Math.sqrt(t); e++)
|
|
891
|
+
if (t % e === 0)
|
|
892
|
+
return !1;
|
|
893
|
+
return !0;
|
|
894
|
+
}
|
|
895
|
+
static isPalindrome(t) {
|
|
896
|
+
if (t < 0 || t % 10 === 0 && t !== 0)
|
|
897
|
+
return !1;
|
|
898
|
+
let e = 0, s = t;
|
|
899
|
+
for (; t > 0; ) {
|
|
900
|
+
const i = t % 10;
|
|
901
|
+
e = e * 10 + i, t = Math.floor(t / 10);
|
|
902
|
+
}
|
|
903
|
+
return s === e;
|
|
904
|
+
}
|
|
905
|
+
static isArmstrong(t) {
|
|
906
|
+
const e = t.toString(), s = e.length;
|
|
907
|
+
let i = 0;
|
|
908
|
+
for (let n = 0; n < s; n++)
|
|
909
|
+
i += Math.pow(parseInt(e[n]), s);
|
|
910
|
+
return i === t;
|
|
911
|
+
}
|
|
912
|
+
static isPerfect(t) {
|
|
913
|
+
let e = 0;
|
|
914
|
+
for (let s = 1; s < t; s++)
|
|
915
|
+
t % s === 0 && (e += s);
|
|
916
|
+
return e === t;
|
|
917
|
+
}
|
|
918
|
+
static scale(t, e, s) {
|
|
919
|
+
if (e[0] >= e[1] || s[0] >= s[1])
|
|
920
|
+
throw new Error("Invalid range");
|
|
921
|
+
const i = e[1] - e[0];
|
|
922
|
+
return (t - e[0]) * ((s[1] - s[0]) / i) + s[0];
|
|
923
|
+
}
|
|
924
|
+
static randomInt(t, e) {
|
|
925
|
+
return Math.floor(Math.random() * (e - t + 1)) + t;
|
|
926
|
+
}
|
|
927
|
+
static floatEqual(t, e, s = 1e-6) {
|
|
928
|
+
return Math.abs(t - e) < s;
|
|
929
|
+
}
|
|
930
|
+
static isSameSign(t, e) {
|
|
931
|
+
return t >= 0 && e >= 0 || t <= 0 && e <= 0;
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
class K {
|
|
935
|
+
static READ = 1;
|
|
936
|
+
static WRITE = 2;
|
|
937
|
+
static SHARE = 4;
|
|
938
|
+
static DELETE = 8;
|
|
939
|
+
static CREATE = 16;
|
|
940
|
+
static include(t, e) {
|
|
941
|
+
return (t & e) === e;
|
|
942
|
+
}
|
|
943
|
+
static add(t, e) {
|
|
944
|
+
return t | e;
|
|
945
|
+
}
|
|
946
|
+
static remove(t, e) {
|
|
947
|
+
return t & ~e;
|
|
948
|
+
}
|
|
949
|
+
static toggle(t, e) {
|
|
950
|
+
return t ^ e;
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
class Z {
|
|
954
|
+
static longestCommonPrefix(t) {
|
|
955
|
+
if (!t.length) return "";
|
|
956
|
+
let e = t[0];
|
|
957
|
+
for (let s = 1; s < t.length; s++)
|
|
958
|
+
for (; !t[s].startsWith(e); )
|
|
959
|
+
if (e = e.slice(0, -1), e === "") return "";
|
|
960
|
+
return e;
|
|
961
|
+
}
|
|
962
|
+
static uuid(t) {
|
|
963
|
+
return typeof t == "number" ? (t ^ Math.random() * 16 >> t / 4).toString(16) : (9987e3 + -1e11).toString().replace(/[018]/g, (e) => {
|
|
964
|
+
const s = parseInt(e, 10);
|
|
965
|
+
return this.uuid(s);
|
|
966
|
+
});
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
class J {
|
|
970
|
+
static isValidHex(t) {
|
|
971
|
+
return /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(t);
|
|
972
|
+
}
|
|
973
|
+
static isValidRGB(t) {
|
|
974
|
+
return /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/.test(t);
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
function Y(r) {
|
|
799
978
|
let t;
|
|
800
979
|
const e = new Proxy(r, {
|
|
801
980
|
construct(s, i, n) {
|
|
@@ -820,7 +999,7 @@ const x = {
|
|
|
820
999
|
UI_HIDE_LOADING: "隐藏加载事件",
|
|
821
1000
|
UI_SHOW_MESSAGE: "显示消息事件"
|
|
822
1001
|
};
|
|
823
|
-
class
|
|
1002
|
+
class I {
|
|
824
1003
|
static instance = null;
|
|
825
1004
|
listeners = {};
|
|
826
1005
|
debugMode;
|
|
@@ -833,7 +1012,7 @@ class v {
|
|
|
833
1012
|
}
|
|
834
1013
|
// 单例模式
|
|
835
1014
|
static getInstance(t) {
|
|
836
|
-
return
|
|
1015
|
+
return I.instance || (I.instance = new I(t)), I.instance;
|
|
837
1016
|
}
|
|
838
1017
|
/**
|
|
839
1018
|
* 添加事件监听器
|
|
@@ -940,12 +1119,12 @@ const b = {
|
|
|
940
1119
|
]),
|
|
941
1120
|
allowedAttributes: /* @__PURE__ */ new Set(["class", "id", "href", "src", "alt", "title"])
|
|
942
1121
|
};
|
|
943
|
-
class
|
|
1122
|
+
class v {
|
|
944
1123
|
static instance;
|
|
945
1124
|
constructor() {
|
|
946
1125
|
}
|
|
947
1126
|
static getInstance() {
|
|
948
|
-
return
|
|
1127
|
+
return v.instance || (v.instance = new v()), v.instance;
|
|
949
1128
|
}
|
|
950
1129
|
/**
|
|
951
1130
|
* 创建DOM元素
|
|
@@ -1033,7 +1212,7 @@ class I {
|
|
|
1033
1212
|
return t.replace(b.scriptRegex, "").replace(b.javascriptRegex, "").replace(b.eventHandlerRegex, "");
|
|
1034
1213
|
}
|
|
1035
1214
|
}
|
|
1036
|
-
class
|
|
1215
|
+
class tt {
|
|
1037
1216
|
features;
|
|
1038
1217
|
constructor() {
|
|
1039
1218
|
this.features = this.detectFeatures();
|
|
@@ -1066,12 +1245,12 @@ class Q {
|
|
|
1066
1245
|
timstamp: n.timestamp
|
|
1067
1246
|
}),
|
|
1068
1247
|
(n) => {
|
|
1069
|
-
const
|
|
1248
|
+
const a = {
|
|
1070
1249
|
1: "User denied the request for Geolocation.",
|
|
1071
1250
|
2: "Position information is unavailable.",
|
|
1072
1251
|
3: "The request to get user location timed out."
|
|
1073
1252
|
};
|
|
1074
|
-
i(new Error(
|
|
1253
|
+
i(new Error(a[n.code] || "Unknown error"));
|
|
1075
1254
|
},
|
|
1076
1255
|
{ ...e, ...t }
|
|
1077
1256
|
);
|
|
@@ -1180,34 +1359,39 @@ Object.defineProperties(Element.prototype, {
|
|
|
1180
1359
|
});
|
|
1181
1360
|
Text.prototype.surround = function(r = "strong", t = "") {
|
|
1182
1361
|
if (!this.nodeValue || !r || !t) return null;
|
|
1183
|
-
const s = r.split("."), i = s[0], n = s.slice(1).join(" "),
|
|
1184
|
-
if (
|
|
1362
|
+
const s = r.split("."), i = s[0], n = s.slice(1).join(" "), a = this.textContent.indexOf(t);
|
|
1363
|
+
if (a < 0) return null;
|
|
1185
1364
|
const h = document.createRange();
|
|
1186
|
-
h.setStart(this,
|
|
1365
|
+
h.setStart(this, a), h.setEnd(this, a + t.length);
|
|
1187
1366
|
const u = document.createElement(i);
|
|
1188
1367
|
return n && (u.className = n), h.surroundContents(u), u;
|
|
1189
1368
|
};
|
|
1190
1369
|
export {
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1370
|
+
K as BitPerm,
|
|
1371
|
+
J as Color,
|
|
1372
|
+
z as Dictionary,
|
|
1373
|
+
v as DomHelper,
|
|
1374
|
+
I as Emitter,
|
|
1375
|
+
W as Graph,
|
|
1195
1376
|
G as LIS,
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1377
|
+
D as LRU,
|
|
1378
|
+
m as Line,
|
|
1379
|
+
H as LinkedList,
|
|
1199
1380
|
E as Matrix,
|
|
1200
1381
|
q as MaxHeap,
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1382
|
+
B as MemoizeMap,
|
|
1383
|
+
O as MinHeap,
|
|
1384
|
+
$ as MinStack,
|
|
1385
|
+
Q as Num,
|
|
1386
|
+
c as Point,
|
|
1387
|
+
j as Queue,
|
|
1388
|
+
X as Roman,
|
|
1206
1389
|
U as Stack,
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1390
|
+
Z as Str,
|
|
1391
|
+
p as Triangle,
|
|
1392
|
+
w as Vector,
|
|
1393
|
+
tt as WebAppManager,
|
|
1394
|
+
F as isValidBracket,
|
|
1395
|
+
Y as singleton,
|
|
1396
|
+
T as sleep
|
|
1213
1397
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(
|
|
2
|
-
`;return t}}class d{_data;static zero(t){return new d(...Array(t).fill(0))}constructor(...t){this._data=t}get dimension(){return this._data.length}get norm(){return Math.hypot(...this._data)}getItem(t){return this._data[t]}normalize(){const t=this.norm;if(t===0)throw new Error("Cannot normalize a zero vector");const e=this._data.map(s=>s/t);return new d(...e)}add(t){if(this.dimension!==t.dimension)throw new Error("Vectors must have the same dimension to add");const e=this._data.map((s,i)=>s+t._data[i]);return new d(...e)}sub(t){if(this.dimension!==t.dimension)throw new Error("Vectors must have the same dimension to subtract");const e=this._data.map((s,i)=>s-t._data[i]);return new d(...e)}mul(t){return new d(...this._data.map(e=>e*t))}dot(t){if(this.dimension!==t.dimension)throw new Error("Vectors must have the same dimension to dot product");return this._data.reduce((e,s,i)=>e+s*t._data[i],0)}pos(){return this.mul(1)}neg(){return this.mul(-1)}}class y{_matrix;static zero(t,e){return new y(Array.from({length:t},()=>Array.from({length:e},()=>0)))}constructor(t){this._matrix=t}get shape(){return[this._matrix.length,this._matrix[0].length]}get row(){return this.shape[0]}get col(){return this.shape[1]}get size(){return this.row*this.col}rowVector(t){return new d(...this._matrix[t])}colVector(t){return new d(...this._matrix.map(e=>e[t]))}getItem(t){return this._matrix[t[0]][t[1]]}setItem(t,e){return this._matrix[t[0]][t[1]]=e,this}mul(t){return new y(this._matrix.map(e=>e.map(s=>s*t)))}div(t){return this.mul(1/t)}add(t){if(this.row!==t.row||this.col!==t.col)throw new Error("Matrix dimensions do not match");return new y(this._matrix.map((e,s)=>e.map((i,n)=>i+t.getItem([s,n]))))}sub(t){return this.add(t.neg())}pos(){return this.mul(1)}neg(){return this.mul(-1)}mulVector(t){if(this.col!==t.dimension)throw new Error("Matrix dimensions do not match");return new y(this._matrix.map(e=>e.map((s,i)=>s*t.getItem(i))))}mulMatrix(t){if(this.col!==t.row)throw new Error("Matrix dimensions do not match");const e=y.zero(this.row,t.col);for(let s=0;s<this.row;s++){const i=this.rowVector(s);for(let n=0;n<this.col;n++)e.setItem([s,n],i.dot(t.colVector(n)))}return e}}class h{static distance(t,e){return Math.hypot(e.x-t.x,e.y-t.y)}x;y;constructor(t,e){this.x=t,this.y=e}distanceTo(t){return h.distance(this,t)}}class p{static EPSILON=1e-10;static sloped(t,e=p.EPSILON){const s=t.p2.x-t.p1.x,i=t.p2.y-t.p1.y;return Math.abs(s)<e?Math.abs(i)<e?0:null:i/s}static isParallel(t,e,s=p.EPSILON){const i=p.sloped(t),n=p.sloped(e);return i===null&&n===null?!0:i===null||n===null?!1:Math.abs(i-n)<s}static getIntersection(t,e,s=p.EPSILON){if(p.isParallel(t,e))return null;const i=t.p1.x,n=t.p1.y,o=t.p2.x,u=t.p2.y,l=e.p1.x,f=e.p1.y,g=e.p2.x,E=e.p2.y,m=(i-o)*(f-E)-(n-u)*(l-g);if(Math.abs(m)<s)return null;const I=((i-l)*(f-E)-(n-f)*(l-g))/m,L=-((i-o)*(n-f)-(n-u)*(i-l))/m;if(I>=0&&I<=1&&L>=0&&L<=1){const X=i+I*(o-i),Q=n+I*(u-n);return new h(X,Q)}return null}static isIntersecting(t,e){return p.getIntersection(t,e)!==null}static distanceToPoint(t,e,s=p.EPSILON){const i=e.x-t.p1.x,n=e.y-t.p1.y,o=t.p2.x-t.p1.x,u=t.p2.y-t.p1.y,l=i*o+n*u,f=o*o+u*u;let g=-1;f>s&&(g=l/f);let E,m;g<0?(E=t.p1.x,m=t.p1.y):g>1?(E=t.p2.x,m=t.p2.y):(E=t.p1.x+g*o,m=t.p1.y+g*u);const I=e.x-E,L=e.y-m;return Math.hypot(I+L)}p1;p2;constructor(t,e){this.p1=t,this.p2=e}get length(){const t=this.p2.x-this.p1.x,e=this.p2.y-this.p1.y;return Math.sqrt(t*t+e*e)}get midpoint(){const t=(this.p1.x+this.p2.x)/2,e=(this.p1.y+this.p2.y)/2;return new h(t,e)}get angle(){return Math.atan2(this.p2.y-this.p1.y,this.p2.x-this.p1.x)}containsPoint(t,e=p.EPSILON){const s=(t.x-this.p1.x)*(this.p2.y-this.p1.y)-(t.y-this.p1.y)*(this.p2.x-this.p1.x);return Math.abs(s)>e?!1:(t.x-this.p1.x)*(t.x-this.p2.x)+(t.y-this.p1.y)*(t.y-this.p2.y)<=e}get direction(){const t=this.length;if(t<p.EPSILON)return new h(0,0);const e=(this.p2.x-this.p1.x)/t,s=(this.p2.y-this.p1.y)/t;return new h(e,s)}get start(){return this.p1}get end(){return this.p2}}class k{static EPSILON=1e-10;name;constructor(t){this.name=t}}class c extends k{static isValid(t,e,s){return t<=0||e<=0||s<=0?!1:t+e>s&&t+s>e&&e+s>t}static area(t,e,s){if(!c.isValid(t,e,s))throw new Error("Invalid triangle");const i=(t+e+s)/2;return Math.sqrt(i*(i-t)*(i-e)*(i-s))}static getType(t,e,s){if(!c.isValid(t,e,s))throw new Error("Invalid triangle sides");const i=[t,e,s].sort((l,f)=>l-f),[n,o,u]=i;return Math.abs(n-o)<c.EPSILON&&Math.abs(o-u)<c.EPSILON?"equilateral":Math.abs(n-o)<c.EPSILON||Math.abs(o-u)<c.EPSILON?"isosceles":"scalene"}static getAngles(t,e,s){if(!c.isValid(t,e,s))throw new Error("Invalid triangle sides");const i=Math.acos((e*e+s*s-t*t)/(2*e*s)),n=Math.acos((t*t+s*s-e*e)/(2*t*s)),o=Math.PI-i-n;return[i,n,o]}p1;p2;p3;constructor(t,e,s,i="triangle"){if(super(i),this.p1=t,this.p2=e,this.p3=s,this.areCollinear())throw new Error("Points are collinear, cannot form a triangle")}areCollinear(){return Math.abs((this.p2.x-this.p1.x)*(this.p3.y-this.p1.y)-(this.p3.x-this.p1.x)*(this.p2.y-this.p1.y))<k.EPSILON}get side(){return[h.distance(this.p1,this.p2),h.distance(this.p2,this.p3),h.distance(this.p3,this.p1)]}perimeter(){return c.isValid(this.side[0],this.side[1],this.side[2]),this.side.reduce((t,e)=>t+e,0)}area(){const[t,e,s]=this.side;return c.area(t,e,s)}get type(){const[t,e,s]=this.side;return c.getType(t,e,s)}get angles(){const[t,e,s]=this.side;return c.getAngles(t,e,s)}get centroid(){return new h((this.p1.x+this.p2.x+this.p3.x)/3,(this.p1.y+this.p2.y+this.p3.y)/3)}get incenter(){const[t,e,s]=this.side,i=this.perimeter()/2,n=(t*this.p1.x+e*this.p2.x+s*this.p3.x)/i,o=(t*this.p1.y+e*this.p2.y+s*this.p3.y)/i;return new h(n,o)}get circumcenter(){const t=2*(this.p1.x*(this.p2.y-this.p3.y)+this.p2.x*(this.p3.y-this.p1.y)+this.p3.x*(this.p1.y-this.p2.y));if(Math.abs(t)<c.EPSILON)throw new Error("Cannot calculate circumcenter for collinear points");const e=((this.p1.x*this.p1.x+this.p1.y*this.p1.y)*(this.p2.y-this.p3.y)+(this.p2.x*this.p2.x+this.p2.y*this.p2.y)*(this.p3.y-this.p1.y)+(this.p3.x*this.p3.x+this.p3.y*this.p3.y)*(this.p1.y-this.p2.y))/t,s=((this.p1.x*this.p1.x+this.p1.y*this.p1.y)*(this.p3.x-this.p2.x)+(this.p2.x*this.p2.x+this.p2.y*this.p2.y)*(this.p1.x-this.p3.x)+(this.p3.x*this.p3.x+this.p3.y*this.p3.y)*(this.p2.x-this.p1.x))/t;return new h(e,s)}containsPoint(t){const e=c.area(h.distance(t,this.p1),h.distance(t,this.p2),h.distance(this.p1,this.p2)),s=c.area(h.distance(t,this.p2),h.distance(t,this.p3),h.distance(this.p2,this.p3)),i=c.area(h.distance(t,this.p3),h.distance(t,this.p1),h.distance(this.p3,this.p1));return Math.abs(e+s+i-this.area())<c.EPSILON}}function _(r){return new Promise(t=>setTimeout(t,r))}function $(r){const t=[],e={"(":")","[":"]","{":"}"},s=new Set(Object.values(e));for(const i of r)if(i in e)t.push(e[i]);else if(s.has(i)&&i!==t.pop())return!1;return t.length===0}function A(r){return r!==null&&(typeof r=="object"||typeof r=="function")}class W{map=new Map;weakMap=new WeakMap;set(t,e){A(t)?this.weakMap.set(t,e):this.map.set(t,e)}get(t){return A(t)?this.weakMap.get(t):this.map.get(t)}has(t){return A(t)?this.weakMap.has(t):this.map.has(t)}}function T(r){if(!r.length)return[];const t=[[r[0]]];for(let s=1,i=r.length;s<i;s++){const n=r[s];e(n)}function e(s){for(let i=t.length-1;i>=0;i--){const n=t[i],o=n[t[i].length-1];if(o<s){t[i+1]=[...n,s];break}else o>s&&i===0&&(t[i]=[s])}}return t[t.length-1]}class G{static ROMAN_MAP=new Map([["M",1e3],["CM",900],["D",500],["CD",400],["C",100],["XC",90],["L",50],["XL",40],["X",10],["IX",9],["V",5],["IV",4],["I",1]]);static toInteger(t){if(t.length===0)throw new Error("Input cannot be empty");const e=new Set(["I","V","X","L","C","D","M"]);for(const o of t)if(!e.has(o))throw new Error(`Invalid Roman numeral character: ${o}`);let s=0,i=0;for(;i<t.length;){const o=t.slice(i,i+2);if(this.ROMAN_MAP.has(o))s+=this.ROMAN_MAP.get(o),i+=2;else{const u=t[i],l=this.ROMAN_MAP.get(u);if(!l)throw new Error(`Invalid Roman numeral sequence at position ${i}`);s+=l,i+=1}}if(this.toRoman(s)!==t)throw new Error("Invalid Roman numeral sequence");return s}static toRoman(t){if(t<=0||t>=4e3)throw new Error("Number must be between 1 and 3999");if(!Number.isInteger(t))throw new Error("Number must be an integer");let e="";for(const[s,i]of this.ROMAN_MAP)for(;t>=i;)e+=s,t-=i;return e}}function F(r){let t;const e=new Proxy(r,{construct(s,i,n){return t||(t=Reflect.construct(s,i,n)),t}});return r.prototype.constructor=e,e}const x={AUTH_UNAUTHORIZED:"未授权事件",AUTH_LOGIN_SUCCESS:"登录成功事件",AUTH_LOGOUT:"注销事件",AUTH_TOKEN_EXPIRED:"令牌过期事件",REQUEST_ERROR:"请求错误事件",REQUEST_TIMEOUT:"请求超时事件",REQUEST_NETWORK_ERROR:"网络错误事件",UI_SHOW_LOADING:"显示加载事件",UI_HIDE_LOADING:"隐藏加载事件",UI_SHOW_MESSAGE:"显示消息事件"};class b{static instance=null;listeners={};debugMode;constructor(t=!1){this.debugMode=t,Object.keys(x).forEach(e=>{this.listeners[e]=new Set})}static getInstance(t){return b.instance||(b.instance=new b(t)),b.instance}on(t,e){this.debugLog(`添加事件监听: ${x[t]}`),this.listeners[t].add(e)}emit(t,e){this.debugLog(`触发事件: ${x[t]}`,e),this.listeners[t].forEach(s=>{try{s(e)}catch(i){console.error(`事件 ${x[t]} 处理出错:`,i)}})}off(t,e){this.debugLog(`移除事件监听: ${x[t]}`),this.listeners[t].delete(e)}once(t,e){this.debugLog(`添加一次性事件监听: ${x[t]}`);const s=i=>{e(i),this.off(t,s)};this.on(t,s)}clear(){this.debugLog("清除所有事件监听器"),Object.values(this.listeners).forEach(t=>t.clear())}getListenerCount(t){return this.listeners[t].size}debugLog(t,e){this.debugMode&&console.log(`[EventEmitter] ${t}`,e||"")}}const S={scriptRegex:/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,javascriptRegex:/javascript:/gi,eventHandlerRegex:/on\w+\s*=/gi,allowedTags:new Set(["div","span","p","a","img","button","input","form","label","select","option","textarea","ul","ol","li","table","tr","td","th","thead","tbody","tfoot","h1","h2","h3","h4","h5","h6","hr","br","section","article","nav","header","footer","main","aside","figure","figcaption"]),allowedAttributes:new Set(["class","id","href","src","alt","title"])};class v{static instance;constructor(){}static getInstance(){return v.instance||(v.instance=new v),v.instance}createElement(t,e={},s=""){if(!S.allowedTags.has(t.toLowerCase()))throw new Error(`Unsupported tag: ${t}`);const i=document.createElement(t);return this._processAttributes(i,e),this._processContent(i,s),i}createBatch(t,e){const s=document.createDocumentFragment();t.forEach(i=>{const n=this.createElement(i.tag,i.attributes||{},i.content||"");s.appendChild(n)}),e.appendChild(s)}setHtml(t,e){const s=this._sanitizeHtml(e);t.innerHTML=s}_processAttributes(t,e){Object.entries(e).forEach(([s,i])=>{if(!S.allowedAttributes.has(s)&&!s.startsWith("data-")){console.warn(`Potentially unsafe attribute: ${s}`);return}if(typeof i=="function")s.startsWith("on")&&t.addEventListener(s.slice(2).toLowerCase(),i);else switch(s){case"className":t.className=i;break;case"dataset":Object.assign(t.dataset,i);break;case"style":Object.assign(t.style,i);break;default:t.setAttribute(s,i)}})}_processContent(t,e){typeof e=="string"?t.textContent=e:e instanceof Node?t.appendChild(e):Array.isArray(e)&&e.forEach(s=>{typeof s=="string"?t.appendChild(document.createTextNode(s)):t.appendChild(s)})}_sanitizeHtml(t){return t.replace(S.scriptRegex,"").replace(S.javascriptRegex,"").replace(S.eventHandlerRegex,"")}}class B{features;constructor(){this.features=this.detectFeatures()}detectFeatures(){return{geolocation:"geolocation"in navigator,notification:"Notification"in window,serviceWorker:"serviceWorker"in navigator,webShare:"share"in navigator,deviceOrientation:"DeviceOrientationEvent"in window,battery:"getBattery"in navigator,online:"onLine"in navigator}}async getLocation(t={}){if(!this.features.geolocation)throw new Error("Geolocation is not supported");const e={enableHighAccuracy:!0,timeout:10*1e3,maximumAge:300*1e3};return new Promise((s,i)=>{navigator.geolocation.getCurrentPosition(n=>s({latitude:n.coords.latitude,longitude:n.coords.longitude,accuracy:n.coords.accuracy,timstamp:n.timestamp}),n=>{const o={1:"User denied the request for Geolocation.",2:"Position information is unavailable.",3:"The request to get user location timed out."};i(new Error(o[n.code]||"Unknown error"))},{...e,...t})})}async sendNotification(t,e){if(!this.features.notification)throw new Error("Notification is not supported");if(Notification.permission==="default"&&await Notification.requestPermission()!=="granted")throw new Error("Notification permission is not granted");if(Notification.permission!=="granted")throw new Error("Notification permission is not granted");return new Notification(t,{icon:e.icon,badge:e.badge,...e})}async registerServiceWorker(t){if(!this.features.serviceWorker)throw new Error("Service Worker is not supported");try{const e=await navigator.serviceWorker.register(t);return console.log("Service Worker registered with scope:",e),e}catch(e){throw console.error("Service Worker registration failed:",e),e}}async shareContent(t){if(this.features.webShare)try{return await navigator.share(t),!0}catch(e){return e instanceof Error&&e.name!="AbortError"&&console.error("Error sharing content:",e),!1}else try{return await navigator.clipboard.writeText(t.url||t.text||""),this.sendNotification("Copied to clipboard",{body:"Link copied to clipboard"}),!0}catch(e){return console.error("Error copying to clipboard:",e),!1}}}String.prototype.pointLength=function(){let r=0;for(let t=0,e=this.length;t<e;){const s=this.codePointAt(t);t+=s>65535?2:1,r++}return r},String.prototype.pointAt=function(r){if(r>=this.pointLength())return;let t=0;for(let e=0,s=this.length;e<s;){const i=this.codePointAt(e);if(!i)return;if(t===r)return String.fromCodePoint(i);e+=i>65535?2:1,t++}},String.prototype.sliceByPoint=function(r,t=this.pointLength()){let e="";for(let s=r;s<t;s++)e+=this.pointAt(s);return e},RegExp.escape=function(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Element.prototype.farthest=function(r){if(typeof r!="string"||!r)return null;let t=null,e=this;for(;e;){const s=e.closest(r);if(!s)break;t=s,e=s.parentElement}return t},Object.defineProperties(Element.prototype,{firstElement:{get:function(){if(!this.children.length)return null;let r=this.firstElementChild,t=null;for(;r;)t=r,r=r.firstElementChild;return t}},lastElement:{get:function(){if(!this.children.length)return null;let r=this.lastElementChild,t=null;for(;r;)t=r,r=r.lastElementChild;return t}}}),Text.prototype.surround=function(r="strong",t=""){if(!this.nodeValue||!r||!t)return null;const s=r.split("."),i=s[0],n=s.slice(1).join(" "),o=this.textContent.indexOf(t);if(o<0)return null;const u=document.createRange();u.setStart(this,o),u.setEnd(this,o+t.length);const l=document.createElement(i);return n&&(l.className=n),u.surroundContents(l),l},a.Dictionary=R,a.DomHelper=v,a.Emitter=b,a.Graph=H,a.LIS=T,a.LRU=U,a.Line=p,a.LinkedList=D,a.Matrix=y,a.MaxHeap=z,a.MemoizeMap=W,a.MinHeap=N,a.Point=h,a.Queue=M,a.Roman=G,a.Stack=j,a.Triangle=c,a.Vector=d,a.WebAppManager=B,a.isValidBracket=$,a.singleton=F,a.sleep=_,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})}));
|
|
1
|
+
(function(o,S){typeof exports=="object"&&typeof module<"u"?S(exports):typeof define=="function"&&define.amd?define(["exports"],S):(o=typeof globalThis<"u"?globalThis:o||self,S(o["jc-structure"]={}))})(this,(function(o){"use strict";class S{items={};count=0;lowestCount=0;constructor(){}dequeue(){if(this.isEmpty())return;const t=this.items[this.lowestCount];return delete this.items[this.lowestCount],this.lowestCount++,t}enqueue(...t){if(t.length===0)return this;const e=t.length===1&&Array.isArray(t[0])?t[0]:t;return this.batchEnqueue(e),this}batchEnqueue(t){t.forEach(e=>{this.isValidItem(e)&&(this.items[this.count]=e,this.count++)})}isValidItem(t){return t!=null}front(){return this.isEmpty()?void 0:this.items[this.lowestCount]}isEmpty(){return this.size()===0}size(){return this.count-this.lowestCount}clear(){this.items={},this.count=0,this.lowestCount=0}toString(){return this.isEmpty()?"":`Queue(size: ${this.size()}):[${this.items[this.lowestCount]},...rest]`}}class V{items={};count=0;constructor(){}pop(){if(this.isEmpty())return;this.count--;const t=this.items[this.count];return delete this.items[this.count],t}push(t){return t==null||t==null?this:Array.isArray(t)?this.addItems(t):this.addItem(t)}addItem(t){if(!this.isValidItem(t))throw new Error("Invalid item: item cannot be null or undefined");return this.items[this.count]=t,this.count++,this}addItems(t){return t.filter(i=>this.isValidItem(i)).forEach(i=>{this.items[this.count]=i,this.count++}),this}isValidItem(t){return t!=null}peek(){return this.isEmpty()?void 0:this.items[this.count-1]}isEmpty(){return this.count===0}size(){return this.count}clear(){this.items={},this.count=0}toString(){return this.isEmpty()?"":`Stack(count: ${this.count}):[${this.items[this.count-1]},...rest]`}}class z{stack=[];minStack=[];push(t){this.stack.push(t),(this.minStack.length===0||t<=this.minStack[this.minStack.length-1])&&this.minStack.push(t)}pop(){const t=this.stack.pop();return t===this.minStack[this.minStack.length-1]&&this.minStack.pop(),t}peek(){return this.stack[this.stack.length-1]}getMin(){return this.minStack[this.minStack.length-1]}isEmpty(){return this.size()===0}size(){return this.stack.length}clear(){this.stack=[],this.minStack=[]}toString(){return this.isEmpty()?"":`MinStack(count: ${this.size()}):[${this.getMin()},...rest]`}}function k(r,t){return r===t?0:r<t?-1:1}class E{heap=[];compareFn;constructor(t=k){this.compareFn=t}static getLeftIndex(t){return 2*t+1}static getRightIndex(t){return 2*t+2}static getParentIndex(t){return t===0?void 0:Math.floor((t-1)/2)}static swap(t,e,i){[t[e],t[i]]=[t[i],t[e]]}find(){return this.isEmpty()?void 0:this.heap[0]}size(){return this.heap.length}isEmpty(){return this.size()===0}clear(){this.heap=[]}toString(){return this.heap.toString()}}class N extends E{insert(t){return t?!1:(this.heap.push(t),this.siftUp(this.heap.length-1),!0)}extract(){if(this.isEmpty())return;if(this.heap.length===1)return this.heap.shift();const t=this.heap[0];return this.heap[0]=this.heap.pop(),this.siftDown(0),t}siftUp(t){let e=t,i=E.getLeftIndex(e),s=E.getRightIndex(e),n=this.size();i<n&&this.compareFn(this.heap[e],this.heap[i])===-1&&(e=i),s<n&&this.compareFn(this.heap[e],this.heap[s])===1&&(e=s),e!==t&&(E.swap(this.heap,t,e),this.siftUp(e))}siftDown(t){let e=E.getParentIndex(t);for(;t>0&&e&&this.compareFn(this.heap[e],this.heap[t])===1;)E.swap(this.heap,e,t),t=e,e=E.getParentIndex(t)}}class j extends N{constructor(t=(e,i)=>k(i,e)){super(t)}}function U(r){return{value:r}}class D{capacity;length=0;head=null;tail=null;lookup=new Map;reverseLookup=new Map;constructor(t=10){this.capacity=t}prepend(t){this.head?(t.next=this.head,this.head.prev=t,this.head=t):this.head=this.tail=t}detach(t){t.prev&&(t.prev.next=t.next),t.next&&(t.next.prev=t.prev),this.head===t&&(this.head=this.head.next||null),this.tail===t&&(this.tail=this.tail.prev||null),t.next=void 0,t.prev=void 0}trimCache(){if(this.length<=this.capacity)return;const t=this.tail;this.detach(t);const e=this.reverseLookup.get(t);this.lookup.delete(e),this.reverseLookup.delete(t),this.length--}get(t){const e=this.lookup.get(t);if(e)return this.detach(e),this.prepend(e),e.value}update(t,e){let i=this.lookup.get(t);i?(this.detach(i),this.prepend(i),i.value=e):(i=U(e),this.length++,this.prepend(i),this.trimCache(),this.lookup.set(t,i),this.reverseLookup)}}let L=class{value;next=void 0};class ${count=0;head=void 0;constructor(){}indexOf(t){let e=this.head,i=0,s=!1;for(;e;){if(this.equals(e.value,t)){s=!0;break}i++,e=e.next}return s?i:-1}equals(t,e){return!1}getElementAt(t){if(t<0||t>=this.count)return;if(t===0)return this.head;let e=this.head;for(let i=0;i<t;i++)e=e?.next;return e}getValueAt(t){return this.getElementAt(t)?.value}insert(t,e){let i=new L;if(i.value=t,e>this.count||e<0)throw new Error("index error");this.count++;let s,n;if(e===0){i.next=this.head,this.head=i;return}s=this.getElementAt(e-1),n=s.next,s.next=i,i.next=n}push(t){let e=new L;if(e.value=t,this.count++,this.isEmpty()){this.head=e;return}let i=this.getElementAt(this.count-1);i.next=e}remove(t){const e=this.indexOf(t);return e===-1?void 0:this.removeAt(e)}removeAt(t){if(this.isEmpty()||t<0||t>=this.count)return;let e=this.getElementAt(t),i=this.getElementAt(t-1),s=e?.next;return t===0&&(this.head=s),i&&(i.next=s),this.count--,e?.value}isEmpty(){return this.count===0}size(){return this.count}clear(){this.count=0,this.head=void 0}toString(){let t="",e=this.head;for(;e;)t+=e.value,t+=",",e=e.next;return t=t.slice(0,-1),t}}class q{key;value;constructor(t,e){this.key=t,this.value=e}}function C(r,t={emptyString:!1,zeroNumber:!1}){return r==null?!(t.emptyString&&r===""||t.zeroNumber&&r===0):!1}class O{table=[];constructor(){}getItemIndex(t){for(let e=0,i=this.table.length;e<i;e++)if(this.table[e].key===t)return e;return-1}set(t,e){if(C(t))throw new Error("key is required");if(C(e))throw new Error("value is required");if(this.has(t)){let i=this.getItemIndex(t);this.table[i].value=e}else{const i=new q(t,e);this.table.push(i)}}remove(t){if(this.has(t)){let e=this.getItemIndex(t);return this.table.splice(e,1)[0]}}has(t){return this.getItemIndex(t)!==-1}get(t){if(this.has(t)){let e=this.getItemIndex(t);return this.table[e]}}keys(){return this.table.map(t=>t.key)}values(){return this.table.map(t=>t.value)}keyValues(){return this.table.map(t=>[t.key,t.value])}forEach(t){for(let e=0,i=this.size();e<i;e++){let s=this.table[e];if(!t(s.key,s.value))break}}isEmpty(){return!this.size()}size(){return this.table.length}clear(){this.table=[]}toString(){let t="";for(let e=0,i=this.table.length;e<i;e++)t+=this.table[e].toString(),t+=",";return t=t.slice(0,-1),t}}class H{isDirected;vertices;adjList;constructor(t=!1){this.isDirected=t,this.vertices=[],this.adjList=new O}addVertex(t){this.vertices.includes(t)||(this.vertices.push(t),this.adjList.set(t,[]))}addEdge(t,e){this.adjList.get(t)||this.addVertex(t),this.adjList.get(e)||this.addVertex(e),this.adjList.get(t)?.value.indexOf(e)===-1&&this.adjList.get(t)?.value.push(e),this.isDirected||this.adjList.get(e)?.value.indexOf(t)===-1&&this.adjList.get(e)?.value.push(t)}getVertices(){return this.vertices}getAdjacencyList(){return this.adjList}toString(){let t="";for(let e=0;e<this.vertices.length;e++)t+=this.vertices[e]+"-->",t+=this.adjList.get(this.vertices[e])?.toString()||"",t+=`
|
|
2
|
+
`;return t}}class y{_data;static zero(t){return new y(...Array(t).fill(0))}constructor(...t){this._data=t}get dimension(){return this._data.length}get norm(){return Math.hypot(...this._data)}getItem(t){return this._data[t]}normalize(){const t=this.norm;if(t===0)throw new Error("Cannot normalize a zero vector");const e=this._data.map(i=>i/t);return new y(...e)}add(t){if(this.dimension!==t.dimension)throw new Error("Vectors must have the same dimension to add");const e=this._data.map((i,s)=>i+t._data[s]);return new y(...e)}sub(t){if(this.dimension!==t.dimension)throw new Error("Vectors must have the same dimension to subtract");const e=this._data.map((i,s)=>i-t._data[s]);return new y(...e)}mul(t){return new y(...this._data.map(e=>e*t))}dot(t){if(this.dimension!==t.dimension)throw new Error("Vectors must have the same dimension to dot product");return this._data.reduce((e,i,s)=>e+i*t._data[s],0)}pos(){return this.mul(1)}neg(){return this.mul(-1)}}class x{_matrix;static zero(t,e){return new x(Array.from({length:t},()=>Array.from({length:e},()=>0)))}constructor(t){this._matrix=t}get shape(){return[this._matrix.length,this._matrix[0].length]}get row(){return this.shape[0]}get col(){return this.shape[1]}get size(){return this.row*this.col}rowVector(t){return new y(...this._matrix[t])}colVector(t){return new y(...this._matrix.map(e=>e[t]))}getItem(t){return this._matrix[t[0]][t[1]]}setItem(t,e){return this._matrix[t[0]][t[1]]=e,this}mul(t){return new x(this._matrix.map(e=>e.map(i=>i*t)))}div(t){return this.mul(1/t)}add(t){if(this.row!==t.row||this.col!==t.col)throw new Error("Matrix dimensions do not match");return new x(this._matrix.map((e,i)=>e.map((s,n)=>s+t.getItem([i,n]))))}sub(t){return this.add(t.neg())}pos(){return this.mul(1)}neg(){return this.mul(-1)}mulVector(t){if(this.col!==t.dimension)throw new Error("Matrix dimensions do not match");return new x(this._matrix.map(e=>e.map((i,s)=>i*t.getItem(s))))}mulMatrix(t){if(this.col!==t.row)throw new Error("Matrix dimensions do not match");const e=x.zero(this.row,t.col);for(let i=0;i<this.row;i++){const s=this.rowVector(i);for(let n=0;n<this.col;n++)e.setItem([i,n],s.dot(t.colVector(n)))}return e}}class c{static distance(t,e){return Math.hypot(e.x-t.x,e.y-t.y)}x;y;constructor(t,e){this.x=t,this.y=e}distanceTo(t){return c.distance(this,t)}}class f{static EPSILON=1e-10;static sloped(t,e=f.EPSILON){const i=t.p2.x-t.p1.x,s=t.p2.y-t.p1.y;return Math.abs(i)<e?Math.abs(s)<e?0:null:s/i}static isParallel(t,e,i=f.EPSILON){const s=f.sloped(t),n=f.sloped(e);return s===null&&n===null?!0:s===null||n===null?!1:Math.abs(s-n)<i}static getIntersection(t,e,i=f.EPSILON){if(f.isParallel(t,e))return null;const s=t.p1.x,n=t.p1.y,a=t.p2.x,u=t.p2.y,l=e.p1.x,m=e.p1.y,w=e.p2.x,h=e.p2.y,d=(s-a)*(m-h)-(n-u)*(l-w);if(Math.abs(d)<i)return null;const g=((s-l)*(m-h)-(n-m)*(l-w))/d,A=-((s-a)*(n-m)-(n-u)*(s-l))/d;if(g>=0&&g<=1&&A>=0&&A<=1){const Y=s+g*(a-s),tt=n+g*(u-n);return new c(Y,tt)}return null}static isIntersecting(t,e){return f.getIntersection(t,e)!==null}static distanceToPoint(t,e,i=f.EPSILON){const s=e.x-t.p1.x,n=e.y-t.p1.y,a=t.p2.x-t.p1.x,u=t.p2.y-t.p1.y,l=s*a+n*u,m=a*a+u*u;let w=-1;m>i&&(w=l/m);let h,d;w<0?(h=t.p1.x,d=t.p1.y):w>1?(h=t.p2.x,d=t.p2.y):(h=t.p1.x+w*a,d=t.p1.y+w*u);const g=e.x-h,A=e.y-d;return Math.hypot(g+A)}p1;p2;constructor(t,e){this.p1=t,this.p2=e}get length(){const t=this.p2.x-this.p1.x,e=this.p2.y-this.p1.y;return Math.sqrt(t*t+e*e)}get midpoint(){const t=(this.p1.x+this.p2.x)/2,e=(this.p1.y+this.p2.y)/2;return new c(t,e)}get angle(){return Math.atan2(this.p2.y-this.p1.y,this.p2.x-this.p1.x)}containsPoint(t,e=f.EPSILON){const i=(t.x-this.p1.x)*(this.p2.y-this.p1.y)-(t.y-this.p1.y)*(this.p2.x-this.p1.x);return Math.abs(i)>e?!1:(t.x-this.p1.x)*(t.x-this.p2.x)+(t.y-this.p1.y)*(t.y-this.p2.y)<=e}get direction(){const t=this.length;if(t<f.EPSILON)return new c(0,0);const e=(this.p2.x-this.p1.x)/t,i=(this.p2.y-this.p1.y)/t;return new c(e,i)}get start(){return this.p1}get end(){return this.p2}}class R{static EPSILON=1e-10;name;constructor(t){this.name=t}}class p extends R{static isValid(t,e,i){return t<=0||e<=0||i<=0?!1:t+e>i&&t+i>e&&e+i>t}static area(t,e,i){if(!p.isValid(t,e,i))throw new Error("Invalid triangle");const s=(t+e+i)/2;return Math.sqrt(s*(s-t)*(s-e)*(s-i))}static getType(t,e,i){if(!p.isValid(t,e,i))throw new Error("Invalid triangle sides");const s=[t,e,i].sort((l,m)=>l-m),[n,a,u]=s;return Math.abs(n-a)<p.EPSILON&&Math.abs(a-u)<p.EPSILON?"equilateral":Math.abs(n-a)<p.EPSILON||Math.abs(a-u)<p.EPSILON?"isosceles":"scalene"}static getAngles(t,e,i){if(!p.isValid(t,e,i))throw new Error("Invalid triangle sides");const s=Math.acos((e*e+i*i-t*t)/(2*e*i)),n=Math.acos((t*t+i*i-e*e)/(2*t*i)),a=Math.PI-s-n;return[s,n,a]}p1;p2;p3;constructor(t,e,i,s="triangle"){if(super(s),this.p1=t,this.p2=e,this.p3=i,this.areCollinear())throw new Error("Points are collinear, cannot form a triangle")}areCollinear(){return Math.abs((this.p2.x-this.p1.x)*(this.p3.y-this.p1.y)-(this.p3.x-this.p1.x)*(this.p2.y-this.p1.y))<R.EPSILON}get side(){return[c.distance(this.p1,this.p2),c.distance(this.p2,this.p3),c.distance(this.p3,this.p1)]}perimeter(){return p.isValid(this.side[0],this.side[1],this.side[2]),this.side.reduce((t,e)=>t+e,0)}area(){const[t,e,i]=this.side;return p.area(t,e,i)}get type(){const[t,e,i]=this.side;return p.getType(t,e,i)}get angles(){const[t,e,i]=this.side;return p.getAngles(t,e,i)}get centroid(){return new c((this.p1.x+this.p2.x+this.p3.x)/3,(this.p1.y+this.p2.y+this.p3.y)/3)}get incenter(){const[t,e,i]=this.side,s=this.perimeter()/2,n=(t*this.p1.x+e*this.p2.x+i*this.p3.x)/s,a=(t*this.p1.y+e*this.p2.y+i*this.p3.y)/s;return new c(n,a)}get circumcenter(){const t=2*(this.p1.x*(this.p2.y-this.p3.y)+this.p2.x*(this.p3.y-this.p1.y)+this.p3.x*(this.p1.y-this.p2.y));if(Math.abs(t)<p.EPSILON)throw new Error("Cannot calculate circumcenter for collinear points");const e=((this.p1.x*this.p1.x+this.p1.y*this.p1.y)*(this.p2.y-this.p3.y)+(this.p2.x*this.p2.x+this.p2.y*this.p2.y)*(this.p3.y-this.p1.y)+(this.p3.x*this.p3.x+this.p3.y*this.p3.y)*(this.p1.y-this.p2.y))/t,i=((this.p1.x*this.p1.x+this.p1.y*this.p1.y)*(this.p3.x-this.p2.x)+(this.p2.x*this.p2.x+this.p2.y*this.p2.y)*(this.p1.x-this.p3.x)+(this.p3.x*this.p3.x+this.p3.y*this.p3.y)*(this.p2.x-this.p1.x))/t;return new c(e,i)}containsPoint(t){const e=p.area(c.distance(t,this.p1),c.distance(t,this.p2),c.distance(this.p1,this.p2)),i=p.area(c.distance(t,this.p2),c.distance(t,this.p3),c.distance(this.p2,this.p3)),s=p.area(c.distance(t,this.p3),c.distance(t,this.p1),c.distance(this.p3,this.p1));return Math.abs(e+i+s-this.area())<p.EPSILON}}function T(r){return new Promise(t=>setTimeout(t,r))}function _(r){const t=[],e={"(":")","[":"]","{":"}"},i=new Set(Object.values(e));for(const s of r)if(s in e)t.push(e[s]);else if(i.has(s)&&s!==t.pop())return!1;return t.length===0}function P(r){return r!==null&&(typeof r=="object"||typeof r=="function")}class W{map=new Map;weakMap=new WeakMap;set(t,e){P(t)?this.weakMap.set(t,e):this.map.set(t,e)}get(t){return P(t)?this.weakMap.get(t):this.map.get(t)}has(t){return P(t)?this.weakMap.has(t):this.map.has(t)}}function F(r){if(!r.length)return[];const t=[[r[0]]];for(let i=1,s=r.length;i<s;i++){const n=r[i];e(n)}function e(i){for(let s=t.length-1;s>=0;s--){const n=t[s],a=n[t[s].length-1];if(a<i){t[s+1]=[...n,i];break}else a>i&&s===0&&(t[s]=[i])}}return t[t.length-1]}class B{static ROMAN_MAP=new Map([["M",1e3],["CM",900],["D",500],["CD",400],["C",100],["XC",90],["L",50],["XL",40],["X",10],["IX",9],["V",5],["IV",4],["I",1]]);static toInteger(t){if(t.length===0)throw new Error("Input cannot be empty");const e=new Set(["I","V","X","L","C","D","M"]);for(const a of t)if(!e.has(a))throw new Error(`Invalid Roman numeral character: ${a}`);let i=0,s=0;for(;s<t.length;){const a=t.slice(s,s+2);if(this.ROMAN_MAP.has(a))i+=this.ROMAN_MAP.get(a),s+=2;else{const u=t[s],l=this.ROMAN_MAP.get(u);if(!l)throw new Error(`Invalid Roman numeral sequence at position ${s}`);i+=l,s+=1}}if(this.toRoman(i)!==t)throw new Error("Invalid Roman numeral sequence");return i}static toRoman(t){if(t<=0||t>=4e3)throw new Error("Number must be between 1 and 3999");if(!Number.isInteger(t))throw new Error("Number must be an integer");let e="";for(const[i,s]of this.ROMAN_MAP)for(;t>=s;)e+=i,t-=s;return e}}class G{static isValidPositiveInteger(t){return Number.isInteger(t)&&t>0&&t<=Number.MAX_SAFE_INTEGER}static isPowerOfTwo(t){return t>0&&(t&t-1)===0}static isOdd(t){return t%2===1||t%2===-1}static factorial(t){if(!this.isValidPositiveInteger(t))throw new Error("Input must be a non-negative integer");if(t<2)return 1;let e=1;for(let i=2;i<=t;i++)e*=i;return e}static fibonacci(t,e=1,i=1){if(!this.isValidPositiveInteger(t))throw new Error("Input must be a non-negative integer");return t<2?i:this.fibonacci(t-1,i,i+e)}static fibonacciIterative(t){if(!this.isValidPositiveInteger(t))throw new Error("Input must be a non-negative integer");let e=1,i=1;for(let s=2;s<t;s++)[e,i]=[i,e+i];return t===0?0:i}static getPercentWithPrecision(t,e=2){if(!Array.isArray(t)||t.length===0)return[];if(e<0||!Number.isInteger(e))throw new Error("Precision must be a non-negative integer");const i=t.reduce((h,d)=>h+d,0);if(i===0)return t.map(()=>"0%");const n=100*Math.pow(10,e),a=t.map(h=>h/i*n),u=a.map(h=>Math.floor(h)),l=a.map((h,d)=>h-u[d]);let m=u.reduce((h,d)=>h+d,0),w=n-m;for(;w>0;){let h=-1,d=-1;for(let g=0;g<l.length;g++)l[g]>d&&(d=l[g],h=g);if(h===-1)break;u[h]++,l[h]=0,w--}return u.map(h=>`${(h/n*100).toFixed(e)}%`)}static fastSqrt(t){if(t<0)throw new Error("n must be a non-negative number");const e=.5*t;let i=new BigInt64Array(new Float32Array([t]).buffer)[0];i=0x1ff7a3bea91d9b1bn+(i>>1n);let s=new Float64Array(new BigInt64Array([i]).buffer)[0];return s=s*.5+e/s,s=s*.5+e/s,s=s*.5+e/s,s}static middle(t,e){return e-(e-t>>1)}static gcd(t,e){return e===0?t:this.gcd(e,t%e)}static lcm(t,e){return t*e/this.gcd(t,e)}static isPrime(t){if(t<=1)return!1;for(let e=2;e<=Math.sqrt(t);e++)if(t%e===0)return!1;return!0}static isPalindrome(t){if(t<0||t%10===0&&t!==0)return!1;let e=0,i=t;for(;t>0;){const s=t%10;e=e*10+s,t=Math.floor(t/10)}return i===e}static isArmstrong(t){const e=t.toString(),i=e.length;let s=0;for(let n=0;n<i;n++)s+=Math.pow(parseInt(e[n]),i);return s===t}static isPerfect(t){let e=0;for(let i=1;i<t;i++)t%i===0&&(e+=i);return e===t}static scale(t,e,i){if(e[0]>=e[1]||i[0]>=i[1])throw new Error("Invalid range");const s=e[1]-e[0];return(t-e[0])*((i[1]-i[0])/s)+i[0]}static randomInt(t,e){return Math.floor(Math.random()*(e-t+1))+t}static floatEqual(t,e,i=1e-6){return Math.abs(t-e)<i}static isSameSign(t,e){return t>=0&&e>=0||t<=0&&e<=0}}class X{static READ=1;static WRITE=2;static SHARE=4;static DELETE=8;static CREATE=16;static include(t,e){return(t&e)===e}static add(t,e){return t|e}static remove(t,e){return t&~e}static toggle(t,e){return t^e}}class Q{static longestCommonPrefix(t){if(!t.length)return"";let e=t[0];for(let i=1;i<t.length;i++)for(;!t[i].startsWith(e);)if(e=e.slice(0,-1),e==="")return"";return e}static uuid(t){return typeof t=="number"?(t^Math.random()*16>>t/4).toString(16):(9987e3+-1e11).toString().replace(/[018]/g,e=>{const i=parseInt(e,10);return this.uuid(i)})}}class K{static isValidHex(t){return/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(t)}static isValidRGB(t){return/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/.test(t)}}function Z(r){let t;const e=new Proxy(r,{construct(i,s,n){return t||(t=Reflect.construct(i,s,n)),t}});return r.prototype.constructor=e,e}const b={AUTH_UNAUTHORIZED:"未授权事件",AUTH_LOGIN_SUCCESS:"登录成功事件",AUTH_LOGOUT:"注销事件",AUTH_TOKEN_EXPIRED:"令牌过期事件",REQUEST_ERROR:"请求错误事件",REQUEST_TIMEOUT:"请求超时事件",REQUEST_NETWORK_ERROR:"网络错误事件",UI_SHOW_LOADING:"显示加载事件",UI_HIDE_LOADING:"隐藏加载事件",UI_SHOW_MESSAGE:"显示消息事件"};class I{static instance=null;listeners={};debugMode;constructor(t=!1){this.debugMode=t,Object.keys(b).forEach(e=>{this.listeners[e]=new Set})}static getInstance(t){return I.instance||(I.instance=new I(t)),I.instance}on(t,e){this.debugLog(`添加事件监听: ${b[t]}`),this.listeners[t].add(e)}emit(t,e){this.debugLog(`触发事件: ${b[t]}`,e),this.listeners[t].forEach(i=>{try{i(e)}catch(s){console.error(`事件 ${b[t]} 处理出错:`,s)}})}off(t,e){this.debugLog(`移除事件监听: ${b[t]}`),this.listeners[t].delete(e)}once(t,e){this.debugLog(`添加一次性事件监听: ${b[t]}`);const i=s=>{e(s),this.off(t,i)};this.on(t,i)}clear(){this.debugLog("清除所有事件监听器"),Object.values(this.listeners).forEach(t=>t.clear())}getListenerCount(t){return this.listeners[t].size}debugLog(t,e){this.debugMode&&console.log(`[EventEmitter] ${t}`,e||"")}}const M={scriptRegex:/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,javascriptRegex:/javascript:/gi,eventHandlerRegex:/on\w+\s*=/gi,allowedTags:new Set(["div","span","p","a","img","button","input","form","label","select","option","textarea","ul","ol","li","table","tr","td","th","thead","tbody","tfoot","h1","h2","h3","h4","h5","h6","hr","br","section","article","nav","header","footer","main","aside","figure","figcaption"]),allowedAttributes:new Set(["class","id","href","src","alt","title"])};class v{static instance;constructor(){}static getInstance(){return v.instance||(v.instance=new v),v.instance}createElement(t,e={},i=""){if(!M.allowedTags.has(t.toLowerCase()))throw new Error(`Unsupported tag: ${t}`);const s=document.createElement(t);return this._processAttributes(s,e),this._processContent(s,i),s}createBatch(t,e){const i=document.createDocumentFragment();t.forEach(s=>{const n=this.createElement(s.tag,s.attributes||{},s.content||"");i.appendChild(n)}),e.appendChild(i)}setHtml(t,e){const i=this._sanitizeHtml(e);t.innerHTML=i}_processAttributes(t,e){Object.entries(e).forEach(([i,s])=>{if(!M.allowedAttributes.has(i)&&!i.startsWith("data-")){console.warn(`Potentially unsafe attribute: ${i}`);return}if(typeof s=="function")i.startsWith("on")&&t.addEventListener(i.slice(2).toLowerCase(),s);else switch(i){case"className":t.className=s;break;case"dataset":Object.assign(t.dataset,s);break;case"style":Object.assign(t.style,s);break;default:t.setAttribute(i,s)}})}_processContent(t,e){typeof e=="string"?t.textContent=e:e instanceof Node?t.appendChild(e):Array.isArray(e)&&e.forEach(i=>{typeof i=="string"?t.appendChild(document.createTextNode(i)):t.appendChild(i)})}_sanitizeHtml(t){return t.replace(M.scriptRegex,"").replace(M.javascriptRegex,"").replace(M.eventHandlerRegex,"")}}class J{features;constructor(){this.features=this.detectFeatures()}detectFeatures(){return{geolocation:"geolocation"in navigator,notification:"Notification"in window,serviceWorker:"serviceWorker"in navigator,webShare:"share"in navigator,deviceOrientation:"DeviceOrientationEvent"in window,battery:"getBattery"in navigator,online:"onLine"in navigator}}async getLocation(t={}){if(!this.features.geolocation)throw new Error("Geolocation is not supported");const e={enableHighAccuracy:!0,timeout:10*1e3,maximumAge:300*1e3};return new Promise((i,s)=>{navigator.geolocation.getCurrentPosition(n=>i({latitude:n.coords.latitude,longitude:n.coords.longitude,accuracy:n.coords.accuracy,timstamp:n.timestamp}),n=>{const a={1:"User denied the request for Geolocation.",2:"Position information is unavailable.",3:"The request to get user location timed out."};s(new Error(a[n.code]||"Unknown error"))},{...e,...t})})}async sendNotification(t,e){if(!this.features.notification)throw new Error("Notification is not supported");if(Notification.permission==="default"&&await Notification.requestPermission()!=="granted")throw new Error("Notification permission is not granted");if(Notification.permission!=="granted")throw new Error("Notification permission is not granted");return new Notification(t,{icon:e.icon,badge:e.badge,...e})}async registerServiceWorker(t){if(!this.features.serviceWorker)throw new Error("Service Worker is not supported");try{const e=await navigator.serviceWorker.register(t);return console.log("Service Worker registered with scope:",e),e}catch(e){throw console.error("Service Worker registration failed:",e),e}}async shareContent(t){if(this.features.webShare)try{return await navigator.share(t),!0}catch(e){return e instanceof Error&&e.name!="AbortError"&&console.error("Error sharing content:",e),!1}else try{return await navigator.clipboard.writeText(t.url||t.text||""),this.sendNotification("Copied to clipboard",{body:"Link copied to clipboard"}),!0}catch(e){return console.error("Error copying to clipboard:",e),!1}}}String.prototype.pointLength=function(){let r=0;for(let t=0,e=this.length;t<e;){const i=this.codePointAt(t);t+=i>65535?2:1,r++}return r},String.prototype.pointAt=function(r){if(r>=this.pointLength())return;let t=0;for(let e=0,i=this.length;e<i;){const s=this.codePointAt(e);if(!s)return;if(t===r)return String.fromCodePoint(s);e+=s>65535?2:1,t++}},String.prototype.sliceByPoint=function(r,t=this.pointLength()){let e="";for(let i=r;i<t;i++)e+=this.pointAt(i);return e},RegExp.escape=function(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Element.prototype.farthest=function(r){if(typeof r!="string"||!r)return null;let t=null,e=this;for(;e;){const i=e.closest(r);if(!i)break;t=i,e=i.parentElement}return t},Object.defineProperties(Element.prototype,{firstElement:{get:function(){if(!this.children.length)return null;let r=this.firstElementChild,t=null;for(;r;)t=r,r=r.firstElementChild;return t}},lastElement:{get:function(){if(!this.children.length)return null;let r=this.lastElementChild,t=null;for(;r;)t=r,r=r.lastElementChild;return t}}}),Text.prototype.surround=function(r="strong",t=""){if(!this.nodeValue||!r||!t)return null;const i=r.split("."),s=i[0],n=i.slice(1).join(" "),a=this.textContent.indexOf(t);if(a<0)return null;const u=document.createRange();u.setStart(this,a),u.setEnd(this,a+t.length);const l=document.createElement(s);return n&&(l.className=n),u.surroundContents(l),l},o.BitPerm=X,o.Color=K,o.Dictionary=O,o.DomHelper=v,o.Emitter=I,o.Graph=H,o.LIS=F,o.LRU=D,o.Line=f,o.LinkedList=$,o.Matrix=x,o.MaxHeap=j,o.MemoizeMap=W,o.MinHeap=N,o.MinStack=z,o.Num=G,o.Point=c,o.Queue=S,o.Roman=B,o.Stack=V,o.Str=Q,o.Triangle=p,o.Vector=y,o.WebAppManager=J,o.isValidBracket=_,o.singleton=Z,o.sleep=T,Object.defineProperty(o,Symbol.toStringTag,{value:"Module"})}));
|
package/index.d.ts
CHANGED
|
@@ -324,23 +324,6 @@ declare module "jc-structure" {
|
|
|
324
324
|
has(key: unknown): boolean;
|
|
325
325
|
}
|
|
326
326
|
|
|
327
|
-
/**
|
|
328
|
-
* 罗马数字类
|
|
329
|
-
*/
|
|
330
|
-
interface RomanConstructor {
|
|
331
|
-
/**
|
|
332
|
-
* #### 转阿拉伯数字
|
|
333
|
-
* @param str 罗马数字文本
|
|
334
|
-
*/
|
|
335
|
-
toInteger(str: string): number;
|
|
336
|
-
/**
|
|
337
|
-
* #### 转罗马数字
|
|
338
|
-
* @param num 阿拉伯整数
|
|
339
|
-
*/
|
|
340
|
-
toRoman(num: number): string;
|
|
341
|
-
}
|
|
342
|
-
declare var Roman: RomanConstructor;
|
|
343
|
-
|
|
344
327
|
interface Point {
|
|
345
328
|
/**
|
|
346
329
|
* #### 点x坐标
|
|
@@ -443,67 +426,14 @@ declare module "jc-structure" {
|
|
|
443
426
|
}
|
|
444
427
|
declare var Line: LineConstructor;
|
|
445
428
|
|
|
446
|
-
/**
|
|
447
|
-
* ### 三角形类
|
|
448
|
-
*/
|
|
449
|
-
// export class Triangle {
|
|
450
|
-
// /**
|
|
451
|
-
// * #### 判断三条边是否能构成三角形
|
|
452
|
-
// * @param a 边长
|
|
453
|
-
// * @param b 边长
|
|
454
|
-
// * @param c 边长
|
|
455
|
-
// */
|
|
456
|
-
// static isValid(a: number, b: number, c: number): boolean;
|
|
457
|
-
// /**
|
|
458
|
-
// * #### 计算三角形的面积,采用秦九昭公式或叫海伦面积公式
|
|
459
|
-
// * @param a 边长
|
|
460
|
-
// * @param b 边长
|
|
461
|
-
// * @param c 边长
|
|
462
|
-
// */
|
|
463
|
-
// static area(a: number, b: number, c: number): number;
|
|
464
|
-
// /**
|
|
465
|
-
// * #### 获取三角形的角度
|
|
466
|
-
// * @param a 边长
|
|
467
|
-
// * @param b 边长
|
|
468
|
-
// * @param c 边长
|
|
469
|
-
// */
|
|
470
|
-
// static getAngles(a: number, b: number, c: number): [number, number, number];
|
|
471
|
-
// constructor(p1: Point, p2: Point, p3: Point): Triangle;
|
|
472
|
-
// /**
|
|
473
|
-
// * #### 获取三角形的边长
|
|
474
|
-
// */
|
|
475
|
-
// get side(): [number, number, number];
|
|
476
|
-
// /**
|
|
477
|
-
// * #### 获取三角形的内心点
|
|
478
|
-
// */
|
|
479
|
-
// get centroid(): Point;
|
|
480
|
-
// /**
|
|
481
|
-
// * #### 获取三角形的外切园心点
|
|
482
|
-
// */
|
|
483
|
-
// get circumcenter(): Point;
|
|
484
|
-
// /**
|
|
485
|
-
// * #### 获取三角形的内切园心点
|
|
486
|
-
// */
|
|
487
|
-
// get incenter(): Point;
|
|
488
|
-
// /**
|
|
489
|
-
// * #### 获取三角形的周长
|
|
490
|
-
// */
|
|
491
|
-
// perimeter(): number;
|
|
492
|
-
// /**
|
|
493
|
-
// * #### 获取三角形的面积
|
|
494
|
-
// */
|
|
495
|
-
// area(): number;
|
|
496
|
-
// /**
|
|
497
|
-
// * #### 判断点是否在三角形内
|
|
498
|
-
// * @param point
|
|
499
|
-
// */
|
|
500
|
-
// containsPoint(point: Point): boolean;
|
|
501
|
-
// }
|
|
502
429
|
enum TriangleType {
|
|
503
430
|
Equilateral = "equilateral", // 等边
|
|
504
431
|
Isosceles = "isosceles", // 等腰
|
|
505
432
|
Scalene = "scalene", // 不等边
|
|
506
433
|
}
|
|
434
|
+
/**
|
|
435
|
+
* ### 三角形类
|
|
436
|
+
*/
|
|
507
437
|
interface Triangle {
|
|
508
438
|
readonly p1: Point;
|
|
509
439
|
readonly p2: Point;
|
|
@@ -567,6 +497,7 @@ declare module "jc-structure" {
|
|
|
567
497
|
getTYpe(a: number, b: number, c: number): TriangleType;
|
|
568
498
|
}
|
|
569
499
|
declare var Triangle: TriangleConstructor;
|
|
500
|
+
|
|
570
501
|
/**
|
|
571
502
|
* ### 向量类
|
|
572
503
|
*/
|
|
@@ -660,4 +591,203 @@ declare module "jc-structure" {
|
|
|
660
591
|
* @param str 含括号的字符串
|
|
661
592
|
*/
|
|
662
593
|
export function isValidBracket(str: string): boolean;
|
|
594
|
+
|
|
595
|
+
interface NumConstructor {
|
|
596
|
+
new (value?: any): Number;
|
|
597
|
+
readonly prototype: Number;
|
|
598
|
+
|
|
599
|
+
/**
|
|
600
|
+
* #### 判断是否是有效的正整数
|
|
601
|
+
* @param n A numeric value
|
|
602
|
+
*/
|
|
603
|
+
isValidPositiveInteger(n: number): boolean;
|
|
604
|
+
|
|
605
|
+
/**
|
|
606
|
+
* #### 判断是否是2的幂
|
|
607
|
+
* @param n A numeric value
|
|
608
|
+
*/
|
|
609
|
+
isPowerOfTwo(n: number): boolean;
|
|
610
|
+
|
|
611
|
+
/**
|
|
612
|
+
* #### 判断是否是奇数
|
|
613
|
+
* @param n A numeric value
|
|
614
|
+
*/
|
|
615
|
+
isOdd(n: number): boolean;
|
|
616
|
+
|
|
617
|
+
/**
|
|
618
|
+
* #### 正整数阶乘
|
|
619
|
+
* @param n A numeric value
|
|
620
|
+
*/
|
|
621
|
+
factorial(n: number): number;
|
|
622
|
+
|
|
623
|
+
/**
|
|
624
|
+
* #### 计算斐波那契数
|
|
625
|
+
* - 采用尾递归的方法,避免递归深度过深导致的栈溢出问题
|
|
626
|
+
* @param n A positive integer
|
|
627
|
+
* @param start 起始值,默认为1
|
|
628
|
+
* @param total 总数,默认为1
|
|
629
|
+
*/
|
|
630
|
+
fibonacci(n: number, start?: number, total?: number): number;
|
|
631
|
+
|
|
632
|
+
/**
|
|
633
|
+
* #### 计算斐波那契数
|
|
634
|
+
* - 采用滑动数组的方法,避免递归深度过深导致的栈溢出问题
|
|
635
|
+
* @param n A positive integer
|
|
636
|
+
*/
|
|
637
|
+
fibonacciIterative(n: number): number;
|
|
638
|
+
|
|
639
|
+
/**
|
|
640
|
+
* #### 获取百分比字符串数组
|
|
641
|
+
* - 使用了"最大余数法"(也称为"汉密尔顿方法")来分配百分比
|
|
642
|
+
* - 这种方法可以确保所有百分比加起来正好等于100%,避免由于四舍五入造成的误差
|
|
643
|
+
* @param valueList 数值数组
|
|
644
|
+
* @param precision 精度位数,默认2位小数
|
|
645
|
+
* @returns 格式化的百分比字符串数组
|
|
646
|
+
*/
|
|
647
|
+
getPercentWithPrecision(valueList: number[], precision?: number): string[];
|
|
648
|
+
|
|
649
|
+
/**
|
|
650
|
+
* #### 史上最快开方算法
|
|
651
|
+
* @param n A non-negative number
|
|
652
|
+
*/
|
|
653
|
+
fastSqrt(n: number): number;
|
|
654
|
+
|
|
655
|
+
/**
|
|
656
|
+
* #### 获取中位数
|
|
657
|
+
* @param n A numeric value
|
|
658
|
+
*/
|
|
659
|
+
middle(n: number): number;
|
|
660
|
+
|
|
661
|
+
/**
|
|
662
|
+
* #### 获取最大公约数
|
|
663
|
+
* @param a
|
|
664
|
+
* @param b
|
|
665
|
+
*/
|
|
666
|
+
gcd(a: number, b: number): number;
|
|
667
|
+
|
|
668
|
+
/**
|
|
669
|
+
* #### 获取最小公倍数
|
|
670
|
+
* @param a
|
|
671
|
+
* @param b
|
|
672
|
+
*/
|
|
673
|
+
lcm(a: number, b: number): number;
|
|
674
|
+
|
|
675
|
+
/**
|
|
676
|
+
* #### 是否是素数
|
|
677
|
+
* @param n
|
|
678
|
+
*/
|
|
679
|
+
isPrime(n: number): boolean;
|
|
680
|
+
|
|
681
|
+
/**
|
|
682
|
+
* #### 是否是回文数
|
|
683
|
+
* @param n
|
|
684
|
+
*/
|
|
685
|
+
isPalindrome(n: number): boolean;
|
|
686
|
+
|
|
687
|
+
/**
|
|
688
|
+
* #### 是否是阿姆斯特朗数
|
|
689
|
+
* @param n
|
|
690
|
+
*/
|
|
691
|
+
isArmstrong(n: number): boolean;
|
|
692
|
+
|
|
693
|
+
/**
|
|
694
|
+
* #### 是否是完美数
|
|
695
|
+
* @param n
|
|
696
|
+
*/
|
|
697
|
+
isPerfect(n: number): boolean;
|
|
698
|
+
|
|
699
|
+
/**
|
|
700
|
+
* #### 线性比例缩放取值
|
|
701
|
+
* @param n
|
|
702
|
+
* @param original 原范围
|
|
703
|
+
* @param target 现范围
|
|
704
|
+
*/
|
|
705
|
+
scale(
|
|
706
|
+
n: number,
|
|
707
|
+
original: [number, number],
|
|
708
|
+
target: [number, number]
|
|
709
|
+
): number;
|
|
710
|
+
|
|
711
|
+
/**
|
|
712
|
+
* #### 获取随机整数,包含min和max
|
|
713
|
+
* @param min 最小数
|
|
714
|
+
* @param max 最大数
|
|
715
|
+
*/
|
|
716
|
+
randomInt(min: number, max: number): number;
|
|
717
|
+
|
|
718
|
+
/**
|
|
719
|
+
* #### 大约相等
|
|
720
|
+
* @param a
|
|
721
|
+
* @param b
|
|
722
|
+
* @param epsilon 默认为0.000001
|
|
723
|
+
*/
|
|
724
|
+
floatEqual(a: number, b: number, epsilon?: number): boolean;
|
|
725
|
+
|
|
726
|
+
/**
|
|
727
|
+
* #### 判断两个数是否同号
|
|
728
|
+
* @param a
|
|
729
|
+
* @param b
|
|
730
|
+
*/
|
|
731
|
+
isSameSign(a: number, b: number): boolean;
|
|
732
|
+
}
|
|
733
|
+
declare var Num: NumConstructor;
|
|
734
|
+
|
|
735
|
+
/**
|
|
736
|
+
* 罗马数字类
|
|
737
|
+
*/
|
|
738
|
+
interface RomanConstructor {
|
|
739
|
+
/**
|
|
740
|
+
* #### 转阿拉伯数字
|
|
741
|
+
* @param str 罗马数字文本
|
|
742
|
+
*/
|
|
743
|
+
toInteger(str: string): number;
|
|
744
|
+
/**
|
|
745
|
+
* #### 转罗马数字
|
|
746
|
+
* @param num 阿拉伯整数
|
|
747
|
+
*/
|
|
748
|
+
toRoman(num: number): string;
|
|
749
|
+
}
|
|
750
|
+
declare var Roman: RomanConstructor;
|
|
751
|
+
|
|
752
|
+
interface BitPerConstructor {
|
|
753
|
+
readonly READ: number;
|
|
754
|
+
readonly WRITE: number;
|
|
755
|
+
readonly SHARE: number;
|
|
756
|
+
readonly DELETE: number;
|
|
757
|
+
readonly CREATE: number;
|
|
758
|
+
/**
|
|
759
|
+
* #### 判断权限是否包含
|
|
760
|
+
* @param permission
|
|
761
|
+
* @param target
|
|
762
|
+
*/
|
|
763
|
+
include(permission: number, target: number): boolean;
|
|
764
|
+
/**
|
|
765
|
+
* #### 添加权限
|
|
766
|
+
* @param permission
|
|
767
|
+
* @param target
|
|
768
|
+
*/
|
|
769
|
+
add(permission: number, target: number): number;
|
|
770
|
+
/**
|
|
771
|
+
* #### 移除权限
|
|
772
|
+
* @param permission
|
|
773
|
+
* @param target
|
|
774
|
+
*/
|
|
775
|
+
remove(permission: number, target: number): number;
|
|
776
|
+
/**
|
|
777
|
+
* #### 切换权限
|
|
778
|
+
* @param permission
|
|
779
|
+
* @param target
|
|
780
|
+
*/
|
|
781
|
+
toggle(permission: number, target: number): number;
|
|
782
|
+
}
|
|
783
|
+
declare var BitPer: BitPerConstructor;
|
|
784
|
+
|
|
785
|
+
interface StrConstructor {
|
|
786
|
+
new (value?: any): String;
|
|
787
|
+
readonly prototype: String;
|
|
788
|
+
|
|
789
|
+
longestCommonPrefix(strs: string[]): string;
|
|
790
|
+
uuid(a?: number | string): string;
|
|
791
|
+
}
|
|
792
|
+
declare var Str: StrConstructor;
|
|
663
793
|
}
|