jc-structure 0.1.2 → 0.1.3
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 +145 -148
- package/dist/jc-structure.umd.cjs +2 -2
- package/index.d.ts +196 -132
- package/package.json +1 -1
- package/types/heap.d.ts +2 -0
- package/types/queue.d.ts +1 -0
package/dist/jc-structure.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
class
|
|
1
|
+
class U {
|
|
2
2
|
items = {};
|
|
3
3
|
count = 0;
|
|
4
4
|
lowestCount = 0;
|
|
@@ -30,7 +30,7 @@ class j {
|
|
|
30
30
|
return this.isEmpty() ? "" : `Queue(size: ${this.size()}):[${this.items[this.lowestCount]},...rest]`;
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
class
|
|
33
|
+
class V {
|
|
34
34
|
items = {};
|
|
35
35
|
count = 0;
|
|
36
36
|
constructor() {
|
|
@@ -62,13 +62,13 @@ class U {
|
|
|
62
62
|
return this.isEmpty() ? "" : `Stack(count: ${this.count}):[${this.items[this.count - 1]},...rest]`;
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
|
-
function
|
|
65
|
+
function A(r, t) {
|
|
66
66
|
return r === t ? 0 : r < t ? -1 : 1;
|
|
67
67
|
}
|
|
68
|
-
class
|
|
68
|
+
class w {
|
|
69
69
|
heap = [];
|
|
70
70
|
compareFn;
|
|
71
|
-
constructor(t =
|
|
71
|
+
constructor(t = A) {
|
|
72
72
|
this.compareFn = t;
|
|
73
73
|
}
|
|
74
74
|
static getLeftIndex(t) {
|
|
@@ -99,7 +99,7 @@ class m {
|
|
|
99
99
|
return this.heap.toString();
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
|
-
class
|
|
102
|
+
class R extends w {
|
|
103
103
|
insert(t) {
|
|
104
104
|
return t ? !1 : (this.heap.push(t), this.siftUp(this.heap.length - 1), !0);
|
|
105
105
|
}
|
|
@@ -110,21 +110,21 @@ class P extends m {
|
|
|
110
110
|
return this.heap[0] = this.heap.pop(), this.siftDown(0), t;
|
|
111
111
|
}
|
|
112
112
|
siftUp(t) {
|
|
113
|
-
let e = t, s =
|
|
114
|
-
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 && (
|
|
113
|
+
let e = t, s = w.getLeftIndex(e), i = w.getRightIndex(e), n = this.size();
|
|
114
|
+
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 && (w.swap(this.heap, t, e), this.siftUp(e));
|
|
115
115
|
}
|
|
116
116
|
siftDown(t) {
|
|
117
|
-
let e =
|
|
117
|
+
let e = w.getParentIndex(t);
|
|
118
118
|
for (; t > 0 && e && this.compareFn(this.heap[e], this.heap[t]) === 1; )
|
|
119
|
-
|
|
119
|
+
w.swap(this.heap, e, t), t = e, e = w.getParentIndex(t);
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
|
-
class
|
|
123
|
-
constructor(t = (e, s) =>
|
|
122
|
+
class _ extends R {
|
|
123
|
+
constructor(t = (e, s) => A(s, e)) {
|
|
124
124
|
super(t);
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
|
-
function
|
|
127
|
+
function k(r) {
|
|
128
128
|
return { value: r };
|
|
129
129
|
}
|
|
130
130
|
class D {
|
|
@@ -157,14 +157,14 @@ class D {
|
|
|
157
157
|
}
|
|
158
158
|
update(t, e) {
|
|
159
159
|
let s = this.lookup.get(t);
|
|
160
|
-
s ? (this.detach(s), this.prepend(s), s.value = e) : (s =
|
|
160
|
+
s ? (this.detach(s), this.prepend(s), s.value = e) : (s = k(e), this.length++, this.prepend(s), this.trimCache(), this.lookup.set(t, s), this.reverseLookup);
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
|
-
let
|
|
163
|
+
let L = class {
|
|
164
164
|
value;
|
|
165
165
|
next = void 0;
|
|
166
166
|
};
|
|
167
|
-
class
|
|
167
|
+
class q {
|
|
168
168
|
count = 0;
|
|
169
169
|
head = void 0;
|
|
170
170
|
constructor() {
|
|
@@ -197,7 +197,7 @@ class _ {
|
|
|
197
197
|
return this.getElementAt(t)?.value;
|
|
198
198
|
}
|
|
199
199
|
insert(t, e) {
|
|
200
|
-
let s = new
|
|
200
|
+
let s = new L();
|
|
201
201
|
if (s.value = t, e > this.count || e < 0)
|
|
202
202
|
throw new Error("index error");
|
|
203
203
|
this.count++;
|
|
@@ -209,7 +209,7 @@ class _ {
|
|
|
209
209
|
i = this.getElementAt(e - 1), n = i.next, i.next = s, s.next = n;
|
|
210
210
|
}
|
|
211
211
|
push(t) {
|
|
212
|
-
let e = new
|
|
212
|
+
let e = new L();
|
|
213
213
|
if (e.value = t, this.count++, this.isEmpty()) {
|
|
214
214
|
this.head = e;
|
|
215
215
|
return;
|
|
@@ -243,17 +243,17 @@ class _ {
|
|
|
243
243
|
return t = t.slice(0, -1), t;
|
|
244
244
|
}
|
|
245
245
|
}
|
|
246
|
-
class
|
|
246
|
+
class z {
|
|
247
247
|
key;
|
|
248
248
|
value;
|
|
249
249
|
constructor(t, e) {
|
|
250
250
|
this.key = t, this.value = e;
|
|
251
251
|
}
|
|
252
252
|
}
|
|
253
|
-
function
|
|
253
|
+
function C(r, t = { emptyString: !1, zeroNumber: !1 }) {
|
|
254
254
|
return r == null ? !(t.emptyString && r === "" || t.zeroNumber && r === 0) : !1;
|
|
255
255
|
}
|
|
256
|
-
class
|
|
256
|
+
class j {
|
|
257
257
|
table = [];
|
|
258
258
|
constructor() {
|
|
259
259
|
}
|
|
@@ -264,15 +264,15 @@ class z {
|
|
|
264
264
|
return -1;
|
|
265
265
|
}
|
|
266
266
|
set(t, e) {
|
|
267
|
-
if (
|
|
267
|
+
if (C(t))
|
|
268
268
|
throw new Error("key is required");
|
|
269
|
-
if (
|
|
269
|
+
if (C(e))
|
|
270
270
|
throw new Error("value is required");
|
|
271
271
|
if (this.has(t)) {
|
|
272
272
|
let s = this.getItemIndex(t);
|
|
273
273
|
this.table[s].value = e;
|
|
274
274
|
} else {
|
|
275
|
-
const s = new
|
|
275
|
+
const s = new z(t, e);
|
|
276
276
|
this.table.push(s);
|
|
277
277
|
}
|
|
278
278
|
}
|
|
@@ -323,12 +323,12 @@ class z {
|
|
|
323
323
|
return t = t.slice(0, -1), t;
|
|
324
324
|
}
|
|
325
325
|
}
|
|
326
|
-
class
|
|
326
|
+
class H {
|
|
327
327
|
isDirected;
|
|
328
328
|
vertices;
|
|
329
329
|
adjList;
|
|
330
330
|
constructor(t = !1) {
|
|
331
|
-
this.isDirected = t, this.vertices = [], this.adjList = new
|
|
331
|
+
this.isDirected = t, this.vertices = [], this.adjList = new j();
|
|
332
332
|
}
|
|
333
333
|
addVertex(t) {
|
|
334
334
|
this.vertices.includes(t) || (this.vertices.push(t), this.adjList.set(t, []));
|
|
@@ -350,10 +350,10 @@ class q {
|
|
|
350
350
|
return t;
|
|
351
351
|
}
|
|
352
352
|
}
|
|
353
|
-
class
|
|
353
|
+
class g {
|
|
354
354
|
_data;
|
|
355
355
|
static zero(t) {
|
|
356
|
-
return new
|
|
356
|
+
return new g(...Array(t).fill(0));
|
|
357
357
|
}
|
|
358
358
|
constructor(...t) {
|
|
359
359
|
this._data = t;
|
|
@@ -372,7 +372,7 @@ class f {
|
|
|
372
372
|
if (t === 0)
|
|
373
373
|
throw new Error("Cannot normalize a zero vector");
|
|
374
374
|
const e = this._data.map((s) => s / t);
|
|
375
|
-
return new
|
|
375
|
+
return new g(...e);
|
|
376
376
|
}
|
|
377
377
|
add(t) {
|
|
378
378
|
if (this.dimension !== t.dimension)
|
|
@@ -380,7 +380,7 @@ class f {
|
|
|
380
380
|
const e = this._data.map(
|
|
381
381
|
(s, i) => s + t._data[i]
|
|
382
382
|
);
|
|
383
|
-
return new
|
|
383
|
+
return new g(...e);
|
|
384
384
|
}
|
|
385
385
|
sub(t) {
|
|
386
386
|
if (this.dimension !== t.dimension)
|
|
@@ -388,10 +388,10 @@ class f {
|
|
|
388
388
|
const e = this._data.map(
|
|
389
389
|
(s, i) => s - t._data[i]
|
|
390
390
|
);
|
|
391
|
-
return new
|
|
391
|
+
return new g(...e);
|
|
392
392
|
}
|
|
393
393
|
mul(t) {
|
|
394
|
-
return new
|
|
394
|
+
return new g(...this._data.map((e) => e * t));
|
|
395
395
|
}
|
|
396
396
|
dot(t) {
|
|
397
397
|
if (this.dimension !== t.dimension)
|
|
@@ -408,10 +408,10 @@ class f {
|
|
|
408
408
|
return this.mul(-1);
|
|
409
409
|
}
|
|
410
410
|
}
|
|
411
|
-
class
|
|
411
|
+
class E {
|
|
412
412
|
_matrix;
|
|
413
413
|
static zero(t, e) {
|
|
414
|
-
return new
|
|
414
|
+
return new E(
|
|
415
415
|
Array.from({ length: t }, () => Array.from({ length: e }, () => 0))
|
|
416
416
|
);
|
|
417
417
|
}
|
|
@@ -431,10 +431,10 @@ class x {
|
|
|
431
431
|
return this.row * this.col;
|
|
432
432
|
}
|
|
433
433
|
rowVector(t) {
|
|
434
|
-
return new
|
|
434
|
+
return new g(...this._matrix[t]);
|
|
435
435
|
}
|
|
436
436
|
colVector(t) {
|
|
437
|
-
return new
|
|
437
|
+
return new g(...this._matrix.map((e) => e[t]));
|
|
438
438
|
}
|
|
439
439
|
getItem(t) {
|
|
440
440
|
return this._matrix[t[0]][t[1]];
|
|
@@ -443,7 +443,7 @@ class x {
|
|
|
443
443
|
return this._matrix[t[0]][t[1]] = e, this;
|
|
444
444
|
}
|
|
445
445
|
mul(t) {
|
|
446
|
-
return new
|
|
446
|
+
return new E(this._matrix.map((e) => e.map((s) => s * t)));
|
|
447
447
|
}
|
|
448
448
|
div(t) {
|
|
449
449
|
return this.mul(1 / t);
|
|
@@ -451,7 +451,7 @@ class x {
|
|
|
451
451
|
add(t) {
|
|
452
452
|
if (this.row !== t.row || this.col !== t.col)
|
|
453
453
|
throw new Error("Matrix dimensions do not match");
|
|
454
|
-
return new
|
|
454
|
+
return new E(
|
|
455
455
|
this._matrix.map(
|
|
456
456
|
(e, s) => e.map((i, n) => i + t.getItem([s, n]))
|
|
457
457
|
)
|
|
@@ -469,14 +469,14 @@ class x {
|
|
|
469
469
|
mulVector(t) {
|
|
470
470
|
if (this.col !== t.dimension)
|
|
471
471
|
throw new Error("Matrix dimensions do not match");
|
|
472
|
-
return new
|
|
472
|
+
return new E(
|
|
473
473
|
this._matrix.map((e) => e.map((s, i) => s * t.getItem(i)))
|
|
474
474
|
);
|
|
475
475
|
}
|
|
476
476
|
mulMatrix(t) {
|
|
477
477
|
if (this.col !== t.row)
|
|
478
478
|
throw new Error("Matrix dimensions do not match");
|
|
479
|
-
const e =
|
|
479
|
+
const e = E.zero(this.row, t.col);
|
|
480
480
|
for (let s = 0; s < this.row; s++) {
|
|
481
481
|
const i = this.rowVector(s);
|
|
482
482
|
for (let n = 0; n < this.col; n++)
|
|
@@ -498,76 +498,73 @@ class a {
|
|
|
498
498
|
return a.distance(this, t);
|
|
499
499
|
}
|
|
500
500
|
}
|
|
501
|
-
class
|
|
501
|
+
class l {
|
|
502
502
|
// 使用更合适的精度阈值常量
|
|
503
503
|
static EPSILON = 1e-10;
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
if (w >= 0 && w <= 1 && I >= 0 && I <= 1) {
|
|
521
|
-
const C = s + w * (n - s), A = i + w * (o - i);
|
|
522
|
-
return new a(C, A);
|
|
504
|
+
static sloped(t, e = l.EPSILON) {
|
|
505
|
+
const s = t.p2.x - t.p1.x, i = t.p2.y - t.p1.y;
|
|
506
|
+
return Math.abs(s) < e ? Math.abs(i) < e ? 0 : null : i / s;
|
|
507
|
+
}
|
|
508
|
+
static isParallel(t, e, s = l.EPSILON) {
|
|
509
|
+
const i = l.sloped(t), n = l.sloped(e);
|
|
510
|
+
return i === null && n === null ? !0 : i === null || n === null ? !1 : Math.abs(i - n) < s;
|
|
511
|
+
}
|
|
512
|
+
static getIntersection(t, e, s = l.EPSILON) {
|
|
513
|
+
if (l.isParallel(t, e)) return null;
|
|
514
|
+
const i = t.p1.x, n = t.p1.y, o = t.p2.x, h = t.p2.y, u = e.p1.x, p = e.p1.y, d = e.p2.x, m = e.p2.y, f = (i - o) * (p - m) - (n - h) * (u - d);
|
|
515
|
+
if (Math.abs(f) < s) return null;
|
|
516
|
+
const y = ((i - u) * (p - m) - (n - p) * (u - d)) / f, S = -((i - o) * (n - p) - (n - h) * (i - u)) / f;
|
|
517
|
+
if (y >= 0 && y <= 1 && S >= 0 && S <= 1) {
|
|
518
|
+
const O = i + y * (o - i), P = n + y * (h - n);
|
|
519
|
+
return new a(O, P);
|
|
523
520
|
}
|
|
524
521
|
return null;
|
|
525
522
|
}
|
|
526
|
-
// 静态方法:判断两条线段是否相交
|
|
527
523
|
static isIntersecting(t, e) {
|
|
528
|
-
return
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
return Math.hypot(w + I);
|
|
524
|
+
return l.getIntersection(t, e) !== null;
|
|
525
|
+
}
|
|
526
|
+
static distanceToPoint(t, e, s = l.EPSILON) {
|
|
527
|
+
const i = e.x - t.p1.x, n = e.y - t.p1.y, o = t.p2.x - t.p1.x, h = t.p2.y - t.p1.y, u = i * o + n * h, p = o * o + h * h;
|
|
528
|
+
let d = -1;
|
|
529
|
+
p > s && (d = u / p);
|
|
530
|
+
let m, f;
|
|
531
|
+
d < 0 ? (m = t.p1.x, f = t.p1.y) : d > 1 ? (m = t.p2.x, f = t.p2.y) : (m = t.p1.x + d * o, f = t.p1.y + d * h);
|
|
532
|
+
const y = e.x - m, S = e.y - f;
|
|
533
|
+
return Math.hypot(y + S);
|
|
539
534
|
}
|
|
540
535
|
p1;
|
|
541
536
|
p2;
|
|
542
537
|
constructor(t, e) {
|
|
543
538
|
this.p1 = t, this.p2 = e;
|
|
544
539
|
}
|
|
545
|
-
// 获取线段长度
|
|
546
540
|
get length() {
|
|
547
541
|
const t = this.p2.x - this.p1.x, e = this.p2.y - this.p1.y;
|
|
548
542
|
return Math.sqrt(t * t + e * e);
|
|
549
543
|
}
|
|
550
|
-
// 获取线段中点
|
|
551
544
|
get midpoint() {
|
|
552
545
|
const t = (this.p1.x + this.p2.x) / 2, e = (this.p1.y + this.p2.y) / 2;
|
|
553
546
|
return new a(t, e);
|
|
554
547
|
}
|
|
555
|
-
// 获取线段的角度(弧度)
|
|
556
548
|
get angle() {
|
|
557
549
|
return Math.atan2(this.p2.y - this.p1.y, this.p2.x - this.p1.x);
|
|
558
550
|
}
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
return Math.abs(e) > u.EPSILON ? !1 : (t.x - this.p1.x) * (t.x - this.p2.x) + (t.y - this.p1.y) * (t.y - this.p2.y) <= u.EPSILON;
|
|
551
|
+
containsPoint(t, e = l.EPSILON) {
|
|
552
|
+
const s = (t.x - this.p1.x) * (this.p2.y - this.p1.y) - (t.y - this.p1.y) * (this.p2.x - this.p1.x);
|
|
553
|
+
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;
|
|
563
554
|
}
|
|
564
555
|
// 获取线段的方向向量
|
|
565
556
|
get direction() {
|
|
566
557
|
const t = this.length;
|
|
567
|
-
if (t <
|
|
558
|
+
if (t < l.EPSILON) return new a(0, 0);
|
|
568
559
|
const e = (this.p2.x - this.p1.x) / t, s = (this.p2.y - this.p1.y) / t;
|
|
569
560
|
return new a(e, s);
|
|
570
561
|
}
|
|
562
|
+
get start() {
|
|
563
|
+
return this.p1;
|
|
564
|
+
}
|
|
565
|
+
get end() {
|
|
566
|
+
return this.p2;
|
|
567
|
+
}
|
|
571
568
|
}
|
|
572
569
|
class N {
|
|
573
570
|
static EPSILON = 1e-10;
|
|
@@ -576,24 +573,24 @@ class N {
|
|
|
576
573
|
this.name = t;
|
|
577
574
|
}
|
|
578
575
|
}
|
|
579
|
-
class
|
|
576
|
+
class c extends N {
|
|
580
577
|
static isValid(t, e, s) {
|
|
581
578
|
return t <= 0 || e <= 0 || s <= 0 ? !1 : t + e > s && t + s > e && e + s > t;
|
|
582
579
|
}
|
|
583
580
|
static area(t, e, s) {
|
|
584
|
-
if (!
|
|
581
|
+
if (!c.isValid(t, e, s))
|
|
585
582
|
throw new Error("Invalid triangle");
|
|
586
583
|
const i = (t + e + s) / 2;
|
|
587
584
|
return Math.sqrt(i * (i - t) * (i - e) * (i - s));
|
|
588
585
|
}
|
|
589
586
|
static getType(t, e, s) {
|
|
590
|
-
if (!
|
|
587
|
+
if (!c.isValid(t, e, s))
|
|
591
588
|
throw new Error("Invalid triangle sides");
|
|
592
|
-
const i = [t, e, s].sort((
|
|
593
|
-
return Math.abs(n - o) <
|
|
589
|
+
const i = [t, e, s].sort((u, p) => u - p), [n, o, h] = i;
|
|
590
|
+
return Math.abs(n - o) < c.EPSILON && Math.abs(o - h) < c.EPSILON ? "equilateral" : Math.abs(n - o) < c.EPSILON || Math.abs(o - h) < c.EPSILON ? "isosceles" : "scalene";
|
|
594
591
|
}
|
|
595
592
|
static getAngles(t, e, s) {
|
|
596
|
-
if (!
|
|
593
|
+
if (!c.isValid(t, e, s))
|
|
597
594
|
throw new Error("Invalid triangle sides");
|
|
598
595
|
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;
|
|
599
596
|
return [i, n, o];
|
|
@@ -619,19 +616,19 @@ class h extends N {
|
|
|
619
616
|
];
|
|
620
617
|
}
|
|
621
618
|
perimeter() {
|
|
622
|
-
return
|
|
619
|
+
return c.isValid(this.side[0], this.side[1], this.side[2]), this.side.reduce((t, e) => t + e, 0);
|
|
623
620
|
}
|
|
624
621
|
area() {
|
|
625
622
|
const [t, e, s] = this.side;
|
|
626
|
-
return
|
|
623
|
+
return c.area(t, e, s);
|
|
627
624
|
}
|
|
628
625
|
get type() {
|
|
629
626
|
const [t, e, s] = this.side;
|
|
630
|
-
return
|
|
627
|
+
return c.getType(t, e, s);
|
|
631
628
|
}
|
|
632
629
|
get angles() {
|
|
633
630
|
const [t, e, s] = this.side;
|
|
634
|
-
return
|
|
631
|
+
return c.getAngles(t, e, s);
|
|
635
632
|
}
|
|
636
633
|
get centroid() {
|
|
637
634
|
return new a(
|
|
@@ -645,32 +642,32 @@ class h extends N {
|
|
|
645
642
|
}
|
|
646
643
|
get circumcenter() {
|
|
647
644
|
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));
|
|
648
|
-
if (Math.abs(t) <
|
|
645
|
+
if (Math.abs(t) < c.EPSILON)
|
|
649
646
|
throw new Error("Cannot calculate circumcenter for collinear points");
|
|
650
647
|
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;
|
|
651
648
|
return new a(e, s);
|
|
652
649
|
}
|
|
653
650
|
containsPoint(t) {
|
|
654
|
-
const e =
|
|
651
|
+
const e = c.area(
|
|
655
652
|
a.distance(t, this.p1),
|
|
656
653
|
a.distance(t, this.p2),
|
|
657
654
|
a.distance(this.p1, this.p2)
|
|
658
|
-
), s =
|
|
655
|
+
), s = c.area(
|
|
659
656
|
a.distance(t, this.p2),
|
|
660
657
|
a.distance(t, this.p3),
|
|
661
658
|
a.distance(this.p2, this.p3)
|
|
662
|
-
), i =
|
|
659
|
+
), i = c.area(
|
|
663
660
|
a.distance(t, this.p3),
|
|
664
661
|
a.distance(t, this.p1),
|
|
665
662
|
a.distance(this.p3, this.p1)
|
|
666
663
|
);
|
|
667
|
-
return Math.abs(e + s + i - this.area()) <
|
|
664
|
+
return Math.abs(e + s + i - this.area()) < c.EPSILON;
|
|
668
665
|
}
|
|
669
666
|
}
|
|
670
|
-
function
|
|
667
|
+
function W(r) {
|
|
671
668
|
return new Promise((t) => setTimeout(t, r));
|
|
672
669
|
}
|
|
673
|
-
function
|
|
670
|
+
function T(r) {
|
|
674
671
|
const t = [], e = {
|
|
675
672
|
"(": ")",
|
|
676
673
|
"[": "]",
|
|
@@ -683,23 +680,23 @@ function W(r) {
|
|
|
683
680
|
return !1;
|
|
684
681
|
return t.length === 0;
|
|
685
682
|
}
|
|
686
|
-
function
|
|
683
|
+
function M(r) {
|
|
687
684
|
return r !== null && (typeof r == "object" || typeof r == "function");
|
|
688
685
|
}
|
|
689
|
-
class
|
|
686
|
+
class F {
|
|
690
687
|
map = /* @__PURE__ */ new Map();
|
|
691
688
|
weakMap = /* @__PURE__ */ new WeakMap();
|
|
692
689
|
set(t, e) {
|
|
693
|
-
|
|
690
|
+
M(t) ? this.weakMap.set(t, e) : this.map.set(t, e);
|
|
694
691
|
}
|
|
695
692
|
get(t) {
|
|
696
|
-
return
|
|
693
|
+
return M(t) ? this.weakMap.get(t) : this.map.get(t);
|
|
697
694
|
}
|
|
698
695
|
has(t) {
|
|
699
|
-
return
|
|
696
|
+
return M(t) ? this.weakMap.has(t) : this.map.has(t);
|
|
700
697
|
}
|
|
701
698
|
}
|
|
702
|
-
function
|
|
699
|
+
function G(r) {
|
|
703
700
|
if (!r.length) return [];
|
|
704
701
|
const t = [[r[0]]];
|
|
705
702
|
for (let s = 1, i = r.length; s < i; s++) {
|
|
@@ -717,7 +714,7 @@ function F(r) {
|
|
|
717
714
|
}
|
|
718
715
|
return t[t.length - 1];
|
|
719
716
|
}
|
|
720
|
-
class
|
|
717
|
+
class B {
|
|
721
718
|
static ROMAN_MAP = /* @__PURE__ */ new Map([
|
|
722
719
|
["M", 1e3],
|
|
723
720
|
["CM", 900],
|
|
@@ -746,10 +743,10 @@ class G {
|
|
|
746
743
|
if (this.ROMAN_MAP.has(o))
|
|
747
744
|
s += this.ROMAN_MAP.get(o), i += 2;
|
|
748
745
|
else {
|
|
749
|
-
const
|
|
750
|
-
if (!
|
|
746
|
+
const h = t[i], u = this.ROMAN_MAP.get(h);
|
|
747
|
+
if (!u)
|
|
751
748
|
throw new Error(`Invalid Roman numeral sequence at position ${i}`);
|
|
752
|
-
s +=
|
|
749
|
+
s += u, i += 1;
|
|
753
750
|
}
|
|
754
751
|
}
|
|
755
752
|
if (this.toRoman(s) !== t)
|
|
@@ -768,7 +765,7 @@ class G {
|
|
|
768
765
|
return e;
|
|
769
766
|
}
|
|
770
767
|
}
|
|
771
|
-
function
|
|
768
|
+
function X(r) {
|
|
772
769
|
let t;
|
|
773
770
|
const e = new Proxy(r, {
|
|
774
771
|
construct(s, i, n) {
|
|
@@ -781,7 +778,7 @@ function B(r) {
|
|
|
781
778
|
});
|
|
782
779
|
return r.prototype.constructor = e, e;
|
|
783
780
|
}
|
|
784
|
-
const
|
|
781
|
+
const x = {
|
|
785
782
|
AUTH_UNAUTHORIZED: "未授权事件",
|
|
786
783
|
AUTH_LOGIN_SUCCESS: "登录成功事件",
|
|
787
784
|
AUTH_LOGOUT: "注销事件",
|
|
@@ -793,12 +790,12 @@ const y = {
|
|
|
793
790
|
UI_HIDE_LOADING: "隐藏加载事件",
|
|
794
791
|
UI_SHOW_MESSAGE: "显示消息事件"
|
|
795
792
|
};
|
|
796
|
-
class
|
|
793
|
+
class v {
|
|
797
794
|
static instance = null;
|
|
798
795
|
listeners = {};
|
|
799
796
|
debugMode;
|
|
800
797
|
constructor(t = !1) {
|
|
801
|
-
this.debugMode = t, Object.keys(
|
|
798
|
+
this.debugMode = t, Object.keys(x).forEach(
|
|
802
799
|
(e) => {
|
|
803
800
|
this.listeners[e] = /* @__PURE__ */ new Set();
|
|
804
801
|
}
|
|
@@ -806,7 +803,7 @@ class b {
|
|
|
806
803
|
}
|
|
807
804
|
// 单例模式
|
|
808
805
|
static getInstance(t) {
|
|
809
|
-
return
|
|
806
|
+
return v.instance || (v.instance = new v(t)), v.instance;
|
|
810
807
|
}
|
|
811
808
|
/**
|
|
812
809
|
* 添加事件监听器
|
|
@@ -814,7 +811,7 @@ class b {
|
|
|
814
811
|
* @param listener 监听函数
|
|
815
812
|
*/
|
|
816
813
|
on(t, e) {
|
|
817
|
-
this.debugLog(`添加事件监听: ${
|
|
814
|
+
this.debugLog(`添加事件监听: ${x[t]}`), this.listeners[t].add(e);
|
|
818
815
|
}
|
|
819
816
|
/**
|
|
820
817
|
* 触发事件
|
|
@@ -822,11 +819,11 @@ class b {
|
|
|
822
819
|
* @param params 事件参数
|
|
823
820
|
*/
|
|
824
821
|
emit(t, e) {
|
|
825
|
-
this.debugLog(`触发事件: ${
|
|
822
|
+
this.debugLog(`触发事件: ${x[t]}`, e), this.listeners[t].forEach((s) => {
|
|
826
823
|
try {
|
|
827
824
|
s(e);
|
|
828
825
|
} catch (i) {
|
|
829
|
-
console.error(`事件 ${
|
|
826
|
+
console.error(`事件 ${x[t]} 处理出错:`, i);
|
|
830
827
|
}
|
|
831
828
|
});
|
|
832
829
|
}
|
|
@@ -836,7 +833,7 @@ class b {
|
|
|
836
833
|
* @param listener 监听函数
|
|
837
834
|
*/
|
|
838
835
|
off(t, e) {
|
|
839
|
-
this.debugLog(`移除事件监听: ${
|
|
836
|
+
this.debugLog(`移除事件监听: ${x[t]}`), this.listeners[t].delete(e);
|
|
840
837
|
}
|
|
841
838
|
/**
|
|
842
839
|
* 添加一次性事件监听器
|
|
@@ -844,7 +841,7 @@ class b {
|
|
|
844
841
|
* @param listener 监听函数
|
|
845
842
|
*/
|
|
846
843
|
once(t, e) {
|
|
847
|
-
this.debugLog(`添加一次性事件监听: ${
|
|
844
|
+
this.debugLog(`添加一次性事件监听: ${x[t]}`);
|
|
848
845
|
const s = (i) => {
|
|
849
846
|
e(i), this.off(t, s);
|
|
850
847
|
};
|
|
@@ -866,7 +863,7 @@ class b {
|
|
|
866
863
|
this.debugMode && console.log(`[EventEmitter] ${t}`, e || "");
|
|
867
864
|
}
|
|
868
865
|
}
|
|
869
|
-
const
|
|
866
|
+
const b = {
|
|
870
867
|
scriptRegex: /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
|
|
871
868
|
javascriptRegex: /javascript:/gi,
|
|
872
869
|
eventHandlerRegex: /on\w+\s*=/gi,
|
|
@@ -913,12 +910,12 @@ const E = {
|
|
|
913
910
|
]),
|
|
914
911
|
allowedAttributes: /* @__PURE__ */ new Set(["class", "id", "href", "src", "alt", "title"])
|
|
915
912
|
};
|
|
916
|
-
class
|
|
913
|
+
class I {
|
|
917
914
|
static instance;
|
|
918
915
|
constructor() {
|
|
919
916
|
}
|
|
920
917
|
static getInstance() {
|
|
921
|
-
return
|
|
918
|
+
return I.instance || (I.instance = new I()), I.instance;
|
|
922
919
|
}
|
|
923
920
|
/**
|
|
924
921
|
* 创建DOM元素
|
|
@@ -928,7 +925,7 @@ class v {
|
|
|
928
925
|
* @returns 创建的HTMLElement
|
|
929
926
|
*/
|
|
930
927
|
createElement(t, e = {}, s = "") {
|
|
931
|
-
if (!
|
|
928
|
+
if (!b.allowedTags.has(t.toLowerCase()))
|
|
932
929
|
throw new Error(`Unsupported tag: ${t}`);
|
|
933
930
|
const i = document.createElement(t);
|
|
934
931
|
return this._processAttributes(i, e), this._processContent(i, s), i;
|
|
@@ -964,7 +961,7 @@ class v {
|
|
|
964
961
|
*/
|
|
965
962
|
_processAttributes(t, e) {
|
|
966
963
|
Object.entries(e).forEach(([s, i]) => {
|
|
967
|
-
if (!
|
|
964
|
+
if (!b.allowedAttributes.has(s) && !s.startsWith("data-")) {
|
|
968
965
|
console.warn(`Potentially unsafe attribute: ${s}`);
|
|
969
966
|
return;
|
|
970
967
|
}
|
|
@@ -1003,10 +1000,10 @@ class v {
|
|
|
1003
1000
|
* @private
|
|
1004
1001
|
*/
|
|
1005
1002
|
_sanitizeHtml(t) {
|
|
1006
|
-
return t.replace(
|
|
1003
|
+
return t.replace(b.scriptRegex, "").replace(b.javascriptRegex, "").replace(b.eventHandlerRegex, "");
|
|
1007
1004
|
}
|
|
1008
1005
|
}
|
|
1009
|
-
class
|
|
1006
|
+
class Q {
|
|
1010
1007
|
features;
|
|
1011
1008
|
constructor() {
|
|
1012
1009
|
this.features = this.detectFeatures();
|
|
@@ -1155,32 +1152,32 @@ Text.prototype.surround = function(r = "strong", t = "") {
|
|
|
1155
1152
|
if (!this.nodeValue || !r || !t) return null;
|
|
1156
1153
|
const s = r.split("."), i = s[0], n = s.slice(1).join(" "), o = this.textContent.indexOf(t);
|
|
1157
1154
|
if (o < 0) return null;
|
|
1158
|
-
const
|
|
1159
|
-
|
|
1160
|
-
const
|
|
1161
|
-
return n && (
|
|
1155
|
+
const h = document.createRange();
|
|
1156
|
+
h.setStart(this, o), h.setEnd(this, o + t.length);
|
|
1157
|
+
const u = document.createElement(i);
|
|
1158
|
+
return n && (u.className = n), h.surroundContents(u), u;
|
|
1162
1159
|
};
|
|
1163
1160
|
export {
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1161
|
+
j as Dictionary,
|
|
1162
|
+
I as DomHelper,
|
|
1163
|
+
v as Emitter,
|
|
1164
|
+
H as Graph,
|
|
1165
|
+
G as LIS,
|
|
1169
1166
|
D as LRU,
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1167
|
+
l as Line,
|
|
1168
|
+
q as LinkedList,
|
|
1169
|
+
E as Matrix,
|
|
1170
|
+
_ as MaxHeap,
|
|
1171
|
+
F as MemoizeMap,
|
|
1172
|
+
R as MinHeap,
|
|
1176
1173
|
a as Point,
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1174
|
+
U as Queue,
|
|
1175
|
+
B as Roman,
|
|
1176
|
+
V as Stack,
|
|
1177
|
+
c as Triangle,
|
|
1178
|
+
g as Vector,
|
|
1179
|
+
Q as WebAppManager,
|
|
1180
|
+
T as isValidBracket,
|
|
1181
|
+
X as singleton,
|
|
1182
|
+
W as sleep
|
|
1186
1183
|
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(a,
|
|
2
|
-
`;return t}}class f{_data;static zero(t){return new f(...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 f(...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 f(...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 f(...e)}mul(t){return new f(...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 w{_matrix;static zero(t,e){return new w(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 f(...this._matrix[t])}colVector(t){return new f(...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 w(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 w(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 w(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=w.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){const e=t.p2.x-t.p1.x,s=t.p2.y-t.p1.y;return Math.abs(e)<p.EPSILON?Math.abs(s)<p.EPSILON?0:null:s/e}static isParallel(t,e){const s=p.sloped(t),i=p.sloped(e);return s===null&&i===null?!0:s===null||i===null?!1:Math.abs(s-i)<p.EPSILON}static getIntersection(t,e){if(p.isParallel(t,e))return null;const s=t.p1.x,i=t.p1.y,n=t.p2.x,o=t.p2.y,l=e.p1.x,u=e.p1.y,d=e.p2.x,y=e.p2.y,g=(s-n)*(u-y)-(i-o)*(l-d);if(Math.abs(g)<p.EPSILON)return null;const v=((s-l)*(u-y)-(i-u)*(l-d))/g,S=-((s-n)*(i-u)-(i-o)*(s-l))/g;if(v>=0&&v<=1&&S>=0&&S<=1){const B=s+v*(n-s),X=i+v*(o-i);return new h(B,X)}return null}static isIntersecting(t,e){return p.getIntersection(t,e)!==null}static distanceToPoint(t,e){const s=e.x-t.p1.x,i=e.y-t.p1.y,n=t.p2.x-t.p1.x,o=t.p2.y-t.p1.y,l=s*n+i*o,u=n*n+o*o;let d=-1;u>p.EPSILON&&(d=l/u);let y,g;d<0?(y=t.p1.x,g=t.p1.y):d>1?(y=t.p2.x,g=t.p2.y):(y=t.p1.x+d*n,g=t.p1.y+d*o);const v=e.x-y,S=e.y-g;return Math.hypot(v+S)}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){const e=(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(e)>p.EPSILON?!1:(t.x-this.p1.x)*(t.x-this.p2.x)+(t.y-this.p1.y)*(t.y-this.p2.y)<=p.EPSILON}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)}}class R{static EPSILON=1e-10;name;constructor(t){this.name=t}}class c extends R{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((u,d)=>u-d),[n,o,l]=i;return Math.abs(n-o)<c.EPSILON&&Math.abs(o-l)<c.EPSILON?"equilateral":Math.abs(n-o)<c.EPSILON||Math.abs(o-l)<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))<R.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 W(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 L(r){return r!==null&&(typeof r=="object"||typeof r=="function")}class _{map=new Map;weakMap=new WeakMap;set(t,e){L(t)?this.weakMap.set(t,e):this.map.set(t,e)}get(t){return L(t)?this.weakMap.get(t):this.map.get(t)}has(t){return L(t)?this.weakMap.has(t):this.map.has(t)}}function q(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 T{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 l=t[i],u=this.ROMAN_MAP.get(l);if(!u)throw new Error(`Invalid Roman numeral sequence at position ${i}`);s+=u,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 G(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 E={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 x{static instance=null;listeners={};debugMode;constructor(t=!1){this.debugMode=t,Object.keys(E).forEach(e=>{this.listeners[e]=new Set})}static getInstance(t){return x.instance||(x.instance=new x(t)),x.instance}on(t,e){this.debugLog(`添加事件监听: ${E[t]}`),this.listeners[t].add(e)}emit(t,e){this.debugLog(`触发事件: ${E[t]}`,e),this.listeners[t].forEach(s=>{try{s(e)}catch(i){console.error(`事件 ${E[t]} 处理出错:`,i)}})}off(t,e){this.debugLog(`移除事件监听: ${E[t]}`),this.listeners[t].delete(e)}once(t,e){this.debugLog(`添加一次性事件监听: ${E[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 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 b{static instance;constructor(){}static getInstance(){return b.instance||(b.instance=new b),b.instance}createElement(t,e={},s=""){if(!M.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(!M.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(M.scriptRegex,"").replace(M.javascriptRegex,"").replace(M.eventHandlerRegex,"")}}class F{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 l=document.createRange();l.setStart(this,o),l.setEnd(this,o+t.length);const u=document.createElement(i);return n&&(u.className=n),l.surroundContents(u),u},a.Dictionary=P,a.DomHelper=b,a.Emitter=x,a.Graph=H,a.LIS=q,a.LRU=U,a.Line=p,a.LinkedList=V,a.Matrix=w,a.MaxHeap=j,a.MemoizeMap=_,a.MinHeap=O,a.Point=h,a.Queue=I,a.Roman=T,a.Stack=k,a.Triangle=c,a.Vector=f,a.WebAppManager=F,a.isValidBracket=W,a.singleton=G,a.sleep=$,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})}));
|
|
1
|
+
(function(a,M){typeof exports=="object"&&typeof module<"u"?M(exports):typeof define=="function"&&define.amd?define(["exports"],M):(a=typeof globalThis<"u"?globalThis:a||self,M(a["jc-structure"]={}))})(this,(function(a){"use strict";class M{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){t.forEach(e=>{this.items[this.count]=e,this.count++})}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 j{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){t.forEach(e=>{this.items[this.count]=e,this.count++})}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]`}}function C(r,t){return r===t?0:r<t?-1:1}class w{heap=[];compareFn;constructor(t=C){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,s){[t[e],t[s]]=[t[s],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 w{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,s=w.getLeftIndex(e),i=w.getRightIndex(e),n=this.size();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&&(w.swap(this.heap,t,e),this.siftUp(e))}siftDown(t){let e=w.getParentIndex(t);for(;t>0&&e&&this.compareFn(this.heap[e],this.heap[t])===1;)w.swap(this.heap,e,t),t=e,e=w.getParentIndex(t)}}class z extends N{constructor(t=(e,s)=>C(s,e)){super(t)}}function U(r){return{value:r}}class V{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 s=this.lookup.get(t);s?(this.detach(s),this.prepend(s),s.value=e):(s=U(e),this.length++,this.prepend(s),this.trimCache(),this.lookup.set(t,s),this.reverseLookup)}}let O=class{value;next=void 0};class D{count=0;head=void 0;constructor(){}indexOf(t){let e=this.head,s=0,i=!1;for(;e;){if(this.equals(e.value,t)){i=!0;break}s++,e=e.next}return i?s:-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 s=0;s<t;s++)e=e?.next;return e}getValueAt(t){return this.getElementAt(t)?.value}insert(t,e){let s=new O;if(s.value=t,e>this.count||e<0)throw new Error("index error");this.count++;let i,n;if(e===0){s.next=this.head,this.head=s;return}i=this.getElementAt(e-1),n=i.next,i.next=s,s.next=n}push(t){let e=new O;if(e.value=t,this.count++,this.isEmpty()){this.head=e;return}let s=this.getElementAt(this.count-1);s.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),s=this.getElementAt(t-1),i=e?.next;return t===0&&(this.head=i),s&&(s.next=i),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 H{key;value;constructor(t,e){this.key=t,this.value=e}}function P(r,t={emptyString:!1,zeroNumber:!1}){return r==null?!(t.emptyString&&r===""||t.zeroNumber&&r===0):!1}class R{table=[];constructor(){}getItemIndex(t){for(let e=0,s=this.table.length;e<s;e++)if(this.table[e].key===t)return e;return-1}set(t,e){if(P(t))throw new Error("key is required");if(P(e))throw new Error("value is required");if(this.has(t)){let s=this.getItemIndex(t);this.table[s].value=e}else{const s=new H(t,e);this.table.push(s)}}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,s=this.size();e<s;e++){let i=this.table[e];if(!t(i.key,i.value))break}}isEmpty(){return!this.size()}size(){return this.table.length}clear(){this.table=[]}toString(){let t="";for(let e=0,s=this.table.length;e<s;e++)t+=this.table[e].toString(),t+=",";return t=t.slice(0,-1),t}}class _{isDirected;vertices;adjList;constructor(t=!1){this.isDirected=t,this.vertices=[],this.adjList=new R}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 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 W(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 q{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=_,a.LIS=T,a.LRU=V,a.Line=p,a.LinkedList=D,a.Matrix=y,a.MaxHeap=z,a.MemoizeMap=q,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=W,a.singleton=F,a.sleep=$,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})}));
|
package/index.d.ts
CHANGED
|
@@ -1,125 +1,58 @@
|
|
|
1
|
-
import { Vector } from "./lib/dataStructure";
|
|
2
|
-
|
|
3
1
|
declare module "jc-structure" {
|
|
2
|
+
import type { IStack } from "./types/stack";
|
|
3
|
+
import type { IQueue } from "./types/queue";
|
|
4
|
+
import type { IHeap } from "./types/heap";
|
|
4
5
|
/**
|
|
5
6
|
* 栈类,采用object实现
|
|
6
7
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
* @param args 要添加的元素,可以是多个或一个元素。
|
|
12
|
-
*/
|
|
13
|
-
push(...args: Array<T>): void;
|
|
14
|
-
/**
|
|
15
|
-
* #### 移除栈顶元素并返回该元素
|
|
16
|
-
*/
|
|
17
|
-
pop(): T | undefined;
|
|
18
|
-
/**
|
|
19
|
-
* #### 返回栈顶元素,但不移除
|
|
20
|
-
*/
|
|
21
|
-
peek(): T | undefined;
|
|
22
|
-
/**
|
|
23
|
-
* 判断数据结构是否为空
|
|
24
|
-
*/
|
|
25
|
-
isEmpty(): boolean;
|
|
26
|
-
/**
|
|
27
|
-
* 数据结构元素长度
|
|
28
|
-
*/
|
|
29
|
-
size(): number;
|
|
30
|
-
/**
|
|
31
|
-
* 重写 toString 方法
|
|
32
|
-
*/
|
|
33
|
-
toString(): string;
|
|
34
|
-
/**
|
|
35
|
-
* 清除数据结构元素
|
|
36
|
-
*/
|
|
37
|
-
clear(): void;
|
|
8
|
+
interface Stack<T> extends IStack<T> {}
|
|
9
|
+
interface StackConstructor {
|
|
10
|
+
new <T>(): Stack<T>;
|
|
11
|
+
readonly prototype: Stack<T>;
|
|
38
12
|
}
|
|
13
|
+
declare const Stack: StackConstructor;
|
|
39
14
|
|
|
40
15
|
/**
|
|
41
16
|
* 队列类,采用object实现
|
|
42
17
|
*/
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
* @param args 要添加的元素,可以是多个或一个元素。
|
|
48
|
-
*/
|
|
49
|
-
enqueue(...args: Array<T>): void;
|
|
50
|
-
/**
|
|
51
|
-
* #### 移除队列头部元素并返回该元素
|
|
52
|
-
*/
|
|
53
|
-
dequeue(): T | undefined;
|
|
54
|
-
/**
|
|
55
|
-
* #### 返回队列头部元素,但不移除
|
|
56
|
-
*/
|
|
57
|
-
front(): T | undefined;
|
|
58
|
-
/**
|
|
59
|
-
* 判断数据结构是否为空
|
|
60
|
-
*/
|
|
61
|
-
isEmpty(): boolean;
|
|
62
|
-
/**
|
|
63
|
-
* 数据结构元素长度
|
|
64
|
-
*/
|
|
65
|
-
size(): number;
|
|
66
|
-
/**
|
|
67
|
-
* 重写 toString 方法
|
|
68
|
-
*/
|
|
69
|
-
toString(): string;
|
|
70
|
-
/**
|
|
71
|
-
* 清除数据结构元素
|
|
72
|
-
*/
|
|
73
|
-
clear(): void;
|
|
18
|
+
interface Queue<T> extends IQueue<T> {}
|
|
19
|
+
interface QueueConstructor {
|
|
20
|
+
new <T>(): Queue<T>;
|
|
21
|
+
readonly prototype: Queue<T>;
|
|
74
22
|
}
|
|
23
|
+
declare const Queue: QueueConstructor;
|
|
75
24
|
|
|
76
|
-
|
|
25
|
+
type CompareResult = -1 | 0 | 1;
|
|
77
26
|
|
|
27
|
+
interface CompareFn<T> {
|
|
28
|
+
(a: T, b: T): CompareResult;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface Obj<V = any> {
|
|
32
|
+
[key: string]: V;
|
|
33
|
+
}
|
|
78
34
|
/**
|
|
79
35
|
* 最小堆
|
|
80
36
|
*/
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
* @param args 要添加的元素,可以是多个或一个元素。
|
|
86
|
-
*/
|
|
87
|
-
insert(...args: Array<T>): void;
|
|
88
|
-
/**
|
|
89
|
-
* #### 移除最小值或最大值,返回该值
|
|
90
|
-
*/
|
|
91
|
-
extract(): T | undefined;
|
|
92
|
-
/**
|
|
93
|
-
* 查找一个值
|
|
94
|
-
* @param value 要查找的值
|
|
95
|
-
*/
|
|
96
|
-
find(): T | undefined;
|
|
97
|
-
/**
|
|
98
|
-
* 判断数据结构是否为空
|
|
99
|
-
*/
|
|
100
|
-
isEmpty(): boolean;
|
|
101
|
-
/**
|
|
102
|
-
* 数据结构元素长度
|
|
103
|
-
*/
|
|
104
|
-
size(): number;
|
|
105
|
-
/**
|
|
106
|
-
* 重写 toString 方法
|
|
107
|
-
*/
|
|
108
|
-
toString(): string;
|
|
37
|
+
interface MinHeap<T> extends IHeap<T> {}
|
|
38
|
+
interface MinHeapConstructor {
|
|
39
|
+
new <T>(fn?: CompareFn<T>): MinHeap<T>;
|
|
40
|
+
readonly prototype: MinHeap<T>;
|
|
109
41
|
}
|
|
42
|
+
declare const MinHeap: MinHeapConstructor;
|
|
110
43
|
|
|
111
44
|
/**
|
|
112
45
|
* 最大堆
|
|
113
46
|
*/
|
|
114
|
-
|
|
115
|
-
|
|
47
|
+
interface Constructor {
|
|
48
|
+
new <T>(fn?: CompareFn<T>): MinHeap<T>;
|
|
49
|
+
readonly prototype: MinHeap<T>;
|
|
116
50
|
}
|
|
117
|
-
|
|
51
|
+
declare const MaxHeap: Constructor;
|
|
118
52
|
/**
|
|
119
53
|
* LRU缓存类
|
|
120
54
|
*/
|
|
121
|
-
|
|
122
|
-
constructor(capacity?: number);
|
|
55
|
+
interface LRU<K, V> {
|
|
123
56
|
/**
|
|
124
57
|
* 获取缓存的值
|
|
125
58
|
* @param key 键值
|
|
@@ -132,6 +65,11 @@ declare module "jc-structure" {
|
|
|
132
65
|
*/
|
|
133
66
|
update(key: K, value: V): void;
|
|
134
67
|
}
|
|
68
|
+
interface LRUConstructor {
|
|
69
|
+
new <K, V>(capacity?: number): LRU<K, V>;
|
|
70
|
+
readonly prototype: LRU<K, V>;
|
|
71
|
+
}
|
|
72
|
+
declare const LRU: LRUConstructor;
|
|
135
73
|
|
|
136
74
|
/**
|
|
137
75
|
* 链表节点类
|
|
@@ -319,40 +257,47 @@ declare module "jc-structure" {
|
|
|
319
257
|
/**
|
|
320
258
|
* 罗马数字类
|
|
321
259
|
*/
|
|
322
|
-
|
|
260
|
+
interface RomanConstructor {
|
|
323
261
|
/**
|
|
324
262
|
* #### 转阿拉伯数字
|
|
325
263
|
* @param str 罗马数字文本
|
|
326
264
|
*/
|
|
327
|
-
|
|
265
|
+
toInteger(str: string): number;
|
|
328
266
|
/**
|
|
329
267
|
* #### 转罗马数字
|
|
330
268
|
* @param num 阿拉伯整数
|
|
331
269
|
*/
|
|
332
|
-
|
|
270
|
+
toRoman(num: number): string;
|
|
333
271
|
}
|
|
272
|
+
declare const Roman: RomanConstructor;
|
|
334
273
|
|
|
335
|
-
|
|
274
|
+
interface Point {
|
|
336
275
|
/**
|
|
337
|
-
* ####
|
|
338
|
-
* @param x x坐标
|
|
339
|
-
* @param y y坐标
|
|
276
|
+
* #### 点x坐标
|
|
340
277
|
*/
|
|
341
|
-
|
|
278
|
+
readonly x: number;
|
|
342
279
|
/**
|
|
343
|
-
* ####
|
|
344
|
-
* @param p1 点1
|
|
345
|
-
* @param p2 点2
|
|
280
|
+
* #### 点y坐标
|
|
346
281
|
*/
|
|
347
|
-
|
|
282
|
+
readonly y: number;
|
|
348
283
|
/**
|
|
349
284
|
* #### 计算点与点之间的距离,实例方法
|
|
350
285
|
* @param p 点p
|
|
351
286
|
*/
|
|
352
287
|
distanceTo(p: Point): number;
|
|
353
288
|
}
|
|
289
|
+
interface PointConstructor {
|
|
290
|
+
new (x: number, y: number): Point;
|
|
291
|
+
/**
|
|
292
|
+
* #### 计算两点之间的距离
|
|
293
|
+
* @param p1 点1
|
|
294
|
+
* @param p2 点2
|
|
295
|
+
*/
|
|
296
|
+
distance(p1: Point, p2: Point): number;
|
|
297
|
+
}
|
|
298
|
+
declare var Point: PointConstructor;
|
|
354
299
|
|
|
355
|
-
|
|
300
|
+
interface Line {
|
|
356
301
|
/**
|
|
357
302
|
* #### 线段长度
|
|
358
303
|
*/
|
|
@@ -369,39 +314,130 @@ declare module "jc-structure" {
|
|
|
369
314
|
* #### 获取线段的方向向量
|
|
370
315
|
*/
|
|
371
316
|
get direction(): Point;
|
|
317
|
+
/**
|
|
318
|
+
* #### 获取线段的起点
|
|
319
|
+
*/
|
|
320
|
+
get start(): Point;
|
|
321
|
+
/**
|
|
322
|
+
* #### 获取线段的终点
|
|
323
|
+
*/
|
|
324
|
+
get end(): Point;
|
|
372
325
|
/**
|
|
373
326
|
* #### 判断点是否在线段上
|
|
374
327
|
* @param point
|
|
328
|
+
* @param tolerance 容差,默认1e-10
|
|
375
329
|
*/
|
|
376
|
-
containsPoint(point: Point): boolean;
|
|
330
|
+
containsPoint(point: Point, tolerance?: number): boolean;
|
|
377
331
|
}
|
|
332
|
+
interface LineConstructor {
|
|
333
|
+
new (p1: Point, p2: Point): Line;
|
|
334
|
+
readonly prototype: Line;
|
|
378
335
|
|
|
379
|
-
/**
|
|
380
|
-
* ### 三角形类
|
|
381
|
-
*/
|
|
382
|
-
export class Triangle {
|
|
383
336
|
/**
|
|
384
|
-
* ####
|
|
385
|
-
* @param
|
|
386
|
-
* @param
|
|
387
|
-
* @param c 边长
|
|
337
|
+
* #### 判断线段是否平行
|
|
338
|
+
* @param line 线段
|
|
339
|
+
* @param tolerance 容差,默认1e-10
|
|
388
340
|
*/
|
|
389
|
-
|
|
341
|
+
sloped(line: Line, tolerance?: number): number | null;
|
|
342
|
+
|
|
390
343
|
/**
|
|
391
|
-
* ####
|
|
392
|
-
* @param
|
|
393
|
-
* @param
|
|
394
|
-
* @param
|
|
344
|
+
* #### 判断线段是否平行
|
|
345
|
+
* @param line1 线段1
|
|
346
|
+
* @param line2 线段2
|
|
347
|
+
* @param tolerance 容差,默认1e-10
|
|
395
348
|
*/
|
|
396
|
-
|
|
349
|
+
isParallel(line1: Line, line2: Line, tolerance?: number): boolean;
|
|
350
|
+
|
|
397
351
|
/**
|
|
398
|
-
* ####
|
|
399
|
-
* @param
|
|
400
|
-
* @param
|
|
401
|
-
|
|
352
|
+
* #### 判断线段是否相交
|
|
353
|
+
* @param line1 线段1
|
|
354
|
+
* @param line2 线段2
|
|
355
|
+
*/
|
|
356
|
+
isIntersecting(line1: Line, line2: Line): boolean;
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* #### 获取两线段交点
|
|
360
|
+
* @param line1 线段1
|
|
361
|
+
* @param line2 线段2
|
|
362
|
+
* @param tolerance 容差,默认1e-10
|
|
363
|
+
*/
|
|
364
|
+
getIntersection(line1: Line, line2: Line, tolerance?: number): Point | null;
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* #### 获取线段到点的距离
|
|
368
|
+
* @param line1 线段1
|
|
369
|
+
* @param line2 线段2
|
|
370
|
+
* @param tolerance 容差,默认1e-10
|
|
402
371
|
*/
|
|
403
|
-
|
|
404
|
-
|
|
372
|
+
distanceToPoint(line: Line, point: Point, tolerance?: number): number;
|
|
373
|
+
}
|
|
374
|
+
declare var Line: LineConstructor;
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* ### 三角形类
|
|
378
|
+
*/
|
|
379
|
+
// export class Triangle {
|
|
380
|
+
// /**
|
|
381
|
+
// * #### 判断三条边是否能构成三角形
|
|
382
|
+
// * @param a 边长
|
|
383
|
+
// * @param b 边长
|
|
384
|
+
// * @param c 边长
|
|
385
|
+
// */
|
|
386
|
+
// static isValid(a: number, b: number, c: number): boolean;
|
|
387
|
+
// /**
|
|
388
|
+
// * #### 计算三角形的面积,采用秦九昭公式或叫海伦面积公式
|
|
389
|
+
// * @param a 边长
|
|
390
|
+
// * @param b 边长
|
|
391
|
+
// * @param c 边长
|
|
392
|
+
// */
|
|
393
|
+
// static area(a: number, b: number, c: number): number;
|
|
394
|
+
// /**
|
|
395
|
+
// * #### 获取三角形的角度
|
|
396
|
+
// * @param a 边长
|
|
397
|
+
// * @param b 边长
|
|
398
|
+
// * @param c 边长
|
|
399
|
+
// */
|
|
400
|
+
// static getAngles(a: number, b: number, c: number): [number, number, number];
|
|
401
|
+
// constructor(p1: Point, p2: Point, p3: Point): Triangle;
|
|
402
|
+
// /**
|
|
403
|
+
// * #### 获取三角形的边长
|
|
404
|
+
// */
|
|
405
|
+
// get side(): [number, number, number];
|
|
406
|
+
// /**
|
|
407
|
+
// * #### 获取三角形的内心点
|
|
408
|
+
// */
|
|
409
|
+
// get centroid(): Point;
|
|
410
|
+
// /**
|
|
411
|
+
// * #### 获取三角形的外切园心点
|
|
412
|
+
// */
|
|
413
|
+
// get circumcenter(): Point;
|
|
414
|
+
// /**
|
|
415
|
+
// * #### 获取三角形的内切园心点
|
|
416
|
+
// */
|
|
417
|
+
// get incenter(): Point;
|
|
418
|
+
// /**
|
|
419
|
+
// * #### 获取三角形的周长
|
|
420
|
+
// */
|
|
421
|
+
// perimeter(): number;
|
|
422
|
+
// /**
|
|
423
|
+
// * #### 获取三角形的面积
|
|
424
|
+
// */
|
|
425
|
+
// area(): number;
|
|
426
|
+
// /**
|
|
427
|
+
// * #### 判断点是否在三角形内
|
|
428
|
+
// * @param point
|
|
429
|
+
// */
|
|
430
|
+
// containsPoint(point: Point): boolean;
|
|
431
|
+
// }
|
|
432
|
+
enum TriangleType {
|
|
433
|
+
Equilateral = "equilateral", // 等边
|
|
434
|
+
Isosceles = "isosceles", // 等腰
|
|
435
|
+
Scalene = "scalene", // 不等边
|
|
436
|
+
}
|
|
437
|
+
interface Triangle {
|
|
438
|
+
readonly p1: Point;
|
|
439
|
+
readonly p2: Point;
|
|
440
|
+
readonly p3: Point;
|
|
405
441
|
/**
|
|
406
442
|
* #### 获取三角形的边长
|
|
407
443
|
*/
|
|
@@ -432,7 +468,35 @@ declare module "jc-structure" {
|
|
|
432
468
|
*/
|
|
433
469
|
containsPoint(point: Point): boolean;
|
|
434
470
|
}
|
|
471
|
+
interface TriangleConstructor {
|
|
472
|
+
new (p1: Point, p2: Point, p3: Point): Triangle;
|
|
473
|
+
readonly prototype: Triangle;
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* #### 判断三条边是否能构成三角形
|
|
477
|
+
* @param a
|
|
478
|
+
* @param b
|
|
479
|
+
* @param c
|
|
480
|
+
*/
|
|
481
|
+
isValid(a: number, b: number, c: number): boolean;
|
|
482
|
+
/**
|
|
483
|
+
* #### 计算三角形的面积,采用秦九昭公式或叫海伦面积公式
|
|
484
|
+
* @param a
|
|
485
|
+
* @param b
|
|
486
|
+
* @param c
|
|
487
|
+
*/
|
|
488
|
+
area(a: number, b: number, c: number): number;
|
|
489
|
+
/**
|
|
490
|
+
* #### 获取三角形的角度
|
|
491
|
+
* @param a
|
|
492
|
+
* @param b
|
|
493
|
+
* @param c
|
|
494
|
+
*/
|
|
495
|
+
getAngles(a: number, b: number, c: number): [number, number, number];
|
|
435
496
|
|
|
497
|
+
getTYpe(a: number, b: number, c: number): TriangleType;
|
|
498
|
+
}
|
|
499
|
+
declare var Triangle: TriangleConstructor;
|
|
436
500
|
/**
|
|
437
501
|
* ### 向量类
|
|
438
502
|
*/
|
package/package.json
CHANGED
package/types/heap.d.ts
CHANGED
package/types/queue.d.ts
CHANGED