modern-path2d 1.2.16 → 1.2.18
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/index.cjs +229 -106
- package/dist/index.d.cts +4 -3
- package/dist/index.d.mts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +2 -2
- package/dist/index.mjs +229 -106
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1062,7 +1062,7 @@ function fillTriangulate(points, options = {}) {
|
|
|
1062
1062
|
const RECURSION_LIMIT$1 = 8;
|
|
1063
1063
|
const FLT_EPSILON$1 = 11920929e-14;
|
|
1064
1064
|
const PATH_DISTANCE_EPSILON$1 = 1;
|
|
1065
|
-
function getAdaptiveCubicBezierCurvePoints(sX, sY, x1, y1, x2, y2, x, y, smoothness = 0.5, points) {
|
|
1065
|
+
function getAdaptiveCubicBezierCurvePoints(sX, sY, x1, y1, x2, y2, x, y, smoothness = 0.5, points = []) {
|
|
1066
1066
|
const scale = 1;
|
|
1067
1067
|
const smoothing = Math.min(
|
|
1068
1068
|
0.99,
|
|
@@ -1132,7 +1132,7 @@ function recursive$1(x1, y1, x2, y2, x3, y3, x4, y4, points, distanceTolerance,
|
|
|
1132
1132
|
const RECURSION_LIMIT = 8;
|
|
1133
1133
|
const FLT_EPSILON = 11920929e-14;
|
|
1134
1134
|
const PATH_DISTANCE_EPSILON = 1;
|
|
1135
|
-
function getAdaptiveQuadraticBezierCurvePoints(sX, sY, x1, y1, x, y, smoothness = 0.5, points) {
|
|
1135
|
+
function getAdaptiveQuadraticBezierCurvePoints(sX, sY, x1, y1, x, y, smoothness = 0.5, points = []) {
|
|
1136
1136
|
const scale = 1;
|
|
1137
1137
|
const smoothing = Math.min(
|
|
1138
1138
|
0.99,
|
|
@@ -1966,23 +1966,77 @@ class RoundCurve extends Curve {
|
|
|
1966
1966
|
return [this._center];
|
|
1967
1967
|
}
|
|
1968
1968
|
getAdaptivePointArray(output = []) {
|
|
1969
|
-
const { cx, cy, rx, ry, dx, dy
|
|
1969
|
+
const { cx, cy, rx, ry, dx, dy } = this;
|
|
1970
1970
|
if (!(rx >= 0 && ry >= 0 && dx >= 0 && dy >= 0)) {
|
|
1971
1971
|
return output;
|
|
1972
1972
|
}
|
|
1973
|
-
const
|
|
1974
|
-
const
|
|
1975
|
-
const
|
|
1976
|
-
const
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1973
|
+
const n = Math.ceil(2.3 * Math.sqrt(rx + ry));
|
|
1974
|
+
const x = cx;
|
|
1975
|
+
const y = cy;
|
|
1976
|
+
const m = n * 8 + (dx ? 4 : 0) + (dy ? 4 : 0);
|
|
1977
|
+
if (m === 0) {
|
|
1978
|
+
return output;
|
|
1979
|
+
}
|
|
1980
|
+
if (n === 0) {
|
|
1981
|
+
output[0] = output[6] = x + dx;
|
|
1982
|
+
output[1] = output[3] = y + dy;
|
|
1983
|
+
output[2] = output[4] = x - dx;
|
|
1984
|
+
output[5] = output[7] = y - dy;
|
|
1985
|
+
return output;
|
|
1986
|
+
}
|
|
1987
|
+
let j1 = 0;
|
|
1988
|
+
let j2 = n * 4 + (dx ? 2 : 0) + 2;
|
|
1989
|
+
let j3 = j2;
|
|
1990
|
+
let j4 = m;
|
|
1991
|
+
let x0 = dx + rx;
|
|
1992
|
+
let y0 = dy;
|
|
1993
|
+
let x1 = x + x0;
|
|
1994
|
+
let x2 = x - x0;
|
|
1995
|
+
let y1 = y + y0;
|
|
1996
|
+
output[j1++] = x1;
|
|
1997
|
+
output[j1++] = y1;
|
|
1998
|
+
output[--j2] = y1;
|
|
1999
|
+
output[--j2] = x2;
|
|
2000
|
+
if (dy) {
|
|
2001
|
+
const y22 = y - y0;
|
|
2002
|
+
output[j3++] = x2;
|
|
2003
|
+
output[j3++] = y22;
|
|
2004
|
+
output[--j4] = y22;
|
|
2005
|
+
output[--j4] = x1;
|
|
2006
|
+
}
|
|
2007
|
+
for (let i = 1; i < n; i++) {
|
|
2008
|
+
const a = Math.PI / 2 * (i / n);
|
|
2009
|
+
const x02 = dx + Math.cos(a) * rx;
|
|
2010
|
+
const y02 = dy + Math.sin(a) * ry;
|
|
2011
|
+
const x12 = x + x02;
|
|
2012
|
+
const x22 = x - x02;
|
|
2013
|
+
const y12 = y + y02;
|
|
2014
|
+
const y22 = y - y02;
|
|
2015
|
+
output[j1++] = x12;
|
|
2016
|
+
output[j1++] = y12;
|
|
2017
|
+
output[--j2] = y12;
|
|
2018
|
+
output[--j2] = x22;
|
|
2019
|
+
output[j3++] = x22;
|
|
2020
|
+
output[j3++] = y22;
|
|
2021
|
+
output[--j4] = y22;
|
|
2022
|
+
output[--j4] = x12;
|
|
2023
|
+
}
|
|
2024
|
+
x0 = dx;
|
|
2025
|
+
y0 = dy + ry;
|
|
2026
|
+
x1 = x + x0;
|
|
2027
|
+
x2 = x - x0;
|
|
2028
|
+
y1 = y + y0;
|
|
2029
|
+
const y2 = y - y0;
|
|
2030
|
+
output[j1++] = x1;
|
|
2031
|
+
output[j1++] = y1;
|
|
2032
|
+
output[--j4] = y2;
|
|
2033
|
+
output[--j4] = x1;
|
|
2034
|
+
if (dx) {
|
|
2035
|
+
output[j1++] = x2;
|
|
2036
|
+
output[j1++] = y1;
|
|
2037
|
+
output[--j4] = y2;
|
|
2038
|
+
output[--j4] = x2;
|
|
2039
|
+
}
|
|
1986
2040
|
return output;
|
|
1987
2041
|
}
|
|
1988
2042
|
fillTriangulate(options = {}) {
|
|
@@ -1990,8 +2044,8 @@ class RoundCurve extends Curve {
|
|
|
1990
2044
|
vertices = [],
|
|
1991
2045
|
indices = [],
|
|
1992
2046
|
verticesStride = 2,
|
|
1993
|
-
verticesOffset =
|
|
1994
|
-
indicesOffset =
|
|
2047
|
+
verticesOffset = vertices.length / verticesStride,
|
|
2048
|
+
indicesOffset = indices.length
|
|
1995
2049
|
} = options;
|
|
1996
2050
|
const points = this.getAdaptivePointArray();
|
|
1997
2051
|
if (points.length === 0) {
|
|
@@ -2203,7 +2257,7 @@ class ArcCurve extends RoundCurve {
|
|
|
2203
2257
|
super(
|
|
2204
2258
|
new Vector2(cx, cy),
|
|
2205
2259
|
new Vector2(radius, radius),
|
|
2206
|
-
new Vector2(
|
|
2260
|
+
new Vector2(),
|
|
2207
2261
|
0,
|
|
2208
2262
|
startAngle,
|
|
2209
2263
|
endAngle,
|
|
@@ -2247,6 +2301,121 @@ class ArcCurve extends RoundCurve {
|
|
|
2247
2301
|
}
|
|
2248
2302
|
}
|
|
2249
2303
|
|
|
2304
|
+
class LineCurve extends Curve {
|
|
2305
|
+
constructor(p1 = new Vector2(), p2 = new Vector2()) {
|
|
2306
|
+
super();
|
|
2307
|
+
this.p1 = p1;
|
|
2308
|
+
this.p2 = p2;
|
|
2309
|
+
}
|
|
2310
|
+
static from(p1x, p1y, p2x, p2y) {
|
|
2311
|
+
return new LineCurve(
|
|
2312
|
+
new Vector2(p1x, p1y),
|
|
2313
|
+
new Vector2(p2x, p2y)
|
|
2314
|
+
);
|
|
2315
|
+
}
|
|
2316
|
+
getPoint(t, output = new Vector2()) {
|
|
2317
|
+
if (t === 1) {
|
|
2318
|
+
output.copy(this.p2);
|
|
2319
|
+
} else {
|
|
2320
|
+
output.copy(this.p2).sub(this.p1).scale(t).add(this.p1);
|
|
2321
|
+
}
|
|
2322
|
+
return output;
|
|
2323
|
+
}
|
|
2324
|
+
getPointAt(u, output = new Vector2()) {
|
|
2325
|
+
return this.getPoint(u, output);
|
|
2326
|
+
}
|
|
2327
|
+
getTangent(_t, output = new Vector2()) {
|
|
2328
|
+
return output.subVectors(this.p2, this.p1).normalize();
|
|
2329
|
+
}
|
|
2330
|
+
getTangentAt(u, output = new Vector2()) {
|
|
2331
|
+
return this.getTangent(u, output);
|
|
2332
|
+
}
|
|
2333
|
+
getControlPointRefs() {
|
|
2334
|
+
return [this.p1, this.p2];
|
|
2335
|
+
}
|
|
2336
|
+
getAdaptivePointArray(output = []) {
|
|
2337
|
+
output.push(
|
|
2338
|
+
this.p1.x,
|
|
2339
|
+
this.p1.y,
|
|
2340
|
+
this.p2.x,
|
|
2341
|
+
this.p2.y
|
|
2342
|
+
);
|
|
2343
|
+
return output;
|
|
2344
|
+
}
|
|
2345
|
+
getMinMax(min = Vector2.MAX, max = Vector2.MIN) {
|
|
2346
|
+
const { p1, p2 } = this;
|
|
2347
|
+
min.x = Math.min(min.x, p1.x, p2.x);
|
|
2348
|
+
min.y = Math.min(min.y, p1.y, p2.y);
|
|
2349
|
+
max.x = Math.max(max.x, p1.x, p2.x);
|
|
2350
|
+
max.y = Math.max(max.y, p1.y, p2.y);
|
|
2351
|
+
return { min, max };
|
|
2352
|
+
}
|
|
2353
|
+
toCommands() {
|
|
2354
|
+
const { p1, p2 } = this;
|
|
2355
|
+
return [
|
|
2356
|
+
{ type: "M", x: p1.x, y: p1.y },
|
|
2357
|
+
{ type: "L", x: p2.x, y: p2.y }
|
|
2358
|
+
];
|
|
2359
|
+
}
|
|
2360
|
+
fillTriangulate(options = {}) {
|
|
2361
|
+
let {
|
|
2362
|
+
vertices = [],
|
|
2363
|
+
indices = [],
|
|
2364
|
+
verticesStride = 2,
|
|
2365
|
+
verticesOffset = vertices.length / verticesStride,
|
|
2366
|
+
indicesOffset = indices.length
|
|
2367
|
+
} = options;
|
|
2368
|
+
const x = this.p1.x;
|
|
2369
|
+
const y = this.p1.y;
|
|
2370
|
+
const width = this.p2.x - this.p1.x || 1;
|
|
2371
|
+
const height = this.p2.y - this.p2.y || 1;
|
|
2372
|
+
const points = [
|
|
2373
|
+
x,
|
|
2374
|
+
y,
|
|
2375
|
+
x + width,
|
|
2376
|
+
y,
|
|
2377
|
+
x + width,
|
|
2378
|
+
y + height,
|
|
2379
|
+
x,
|
|
2380
|
+
y + height
|
|
2381
|
+
];
|
|
2382
|
+
let count = 0;
|
|
2383
|
+
verticesOffset *= verticesStride;
|
|
2384
|
+
vertices[verticesOffset + count] = points[0];
|
|
2385
|
+
vertices[verticesOffset + count + 1] = points[1];
|
|
2386
|
+
count += verticesStride;
|
|
2387
|
+
vertices[verticesOffset + count] = points[2];
|
|
2388
|
+
vertices[verticesOffset + count + 1] = points[3];
|
|
2389
|
+
count += verticesStride;
|
|
2390
|
+
vertices[verticesOffset + count] = points[6];
|
|
2391
|
+
vertices[verticesOffset + count + 1] = points[7];
|
|
2392
|
+
count += verticesStride;
|
|
2393
|
+
vertices[verticesOffset + count] = points[4];
|
|
2394
|
+
vertices[verticesOffset + count + 1] = points[5];
|
|
2395
|
+
count += verticesStride;
|
|
2396
|
+
const verticesIndex = verticesOffset / verticesStride;
|
|
2397
|
+
indices[indicesOffset++] = verticesIndex;
|
|
2398
|
+
indices[indicesOffset++] = verticesIndex + 1;
|
|
2399
|
+
indices[indicesOffset++] = verticesIndex + 2;
|
|
2400
|
+
indices[indicesOffset++] = verticesIndex + 1;
|
|
2401
|
+
indices[indicesOffset++] = verticesIndex + 3;
|
|
2402
|
+
indices[indicesOffset++] = verticesIndex + 2;
|
|
2403
|
+
return { vertices, indices };
|
|
2404
|
+
}
|
|
2405
|
+
drawTo(ctx) {
|
|
2406
|
+
const { p1, p2 } = this;
|
|
2407
|
+
ctx.lineTo(p1.x, p1.y);
|
|
2408
|
+
ctx.lineTo(p2.x, p2.y);
|
|
2409
|
+
return this;
|
|
2410
|
+
}
|
|
2411
|
+
copy(source) {
|
|
2412
|
+
super.copy(source);
|
|
2413
|
+
this.p1.copy(source.p1);
|
|
2414
|
+
this.p2.copy(source.p2);
|
|
2415
|
+
return this;
|
|
2416
|
+
}
|
|
2417
|
+
}
|
|
2418
|
+
|
|
2250
2419
|
class CompositeCurve extends Curve {
|
|
2251
2420
|
constructor(curves = []) {
|
|
2252
2421
|
super();
|
|
@@ -2321,6 +2490,44 @@ class CompositeCurve extends Curve {
|
|
|
2321
2490
|
});
|
|
2322
2491
|
return output;
|
|
2323
2492
|
}
|
|
2493
|
+
fillTriangulate(options) {
|
|
2494
|
+
const indices = options?.indices ?? [];
|
|
2495
|
+
const vertices = options?.vertices ?? [];
|
|
2496
|
+
const lines = [];
|
|
2497
|
+
const fillLines = () => {
|
|
2498
|
+
if (lines.length) {
|
|
2499
|
+
const pointArray = [];
|
|
2500
|
+
lines.forEach((line) => {
|
|
2501
|
+
const x = line.p1.x;
|
|
2502
|
+
const y = line.p1.y;
|
|
2503
|
+
if (pointArray[pointArray.length - 2] !== x || pointArray[pointArray.length - 1] !== y) {
|
|
2504
|
+
pointArray.push(x, y);
|
|
2505
|
+
}
|
|
2506
|
+
pointArray.push(line.p2.x, line.p2.y);
|
|
2507
|
+
});
|
|
2508
|
+
fillTriangulate(pointArray, {
|
|
2509
|
+
...options,
|
|
2510
|
+
indices,
|
|
2511
|
+
vertices
|
|
2512
|
+
});
|
|
2513
|
+
lines.length = 0;
|
|
2514
|
+
}
|
|
2515
|
+
};
|
|
2516
|
+
this.curves.forEach((curve) => {
|
|
2517
|
+
if (curve instanceof LineCurve) {
|
|
2518
|
+
lines.push(curve);
|
|
2519
|
+
} else {
|
|
2520
|
+
fillLines();
|
|
2521
|
+
curve.fillTriangulate({
|
|
2522
|
+
...options,
|
|
2523
|
+
indices,
|
|
2524
|
+
vertices
|
|
2525
|
+
});
|
|
2526
|
+
}
|
|
2527
|
+
});
|
|
2528
|
+
fillLines();
|
|
2529
|
+
return { indices, vertices };
|
|
2530
|
+
}
|
|
2324
2531
|
applyTransform(transform) {
|
|
2325
2532
|
this.curves.forEach((curve) => curve.applyTransform(transform));
|
|
2326
2533
|
return this;
|
|
@@ -2479,76 +2686,6 @@ class EllipseCurve extends RoundCurve {
|
|
|
2479
2686
|
}
|
|
2480
2687
|
}
|
|
2481
2688
|
|
|
2482
|
-
class LineCurve extends Curve {
|
|
2483
|
-
constructor(p1 = new Vector2(), p2 = new Vector2()) {
|
|
2484
|
-
super();
|
|
2485
|
-
this.p1 = p1;
|
|
2486
|
-
this.p2 = p2;
|
|
2487
|
-
}
|
|
2488
|
-
static from(p1x, p1y, p2x, p2y) {
|
|
2489
|
-
return new LineCurve(
|
|
2490
|
-
new Vector2(p1x, p1y),
|
|
2491
|
-
new Vector2(p2x, p2y)
|
|
2492
|
-
);
|
|
2493
|
-
}
|
|
2494
|
-
getPoint(t, output = new Vector2()) {
|
|
2495
|
-
if (t === 1) {
|
|
2496
|
-
output.copy(this.p2);
|
|
2497
|
-
} else {
|
|
2498
|
-
output.copy(this.p2).sub(this.p1).scale(t).add(this.p1);
|
|
2499
|
-
}
|
|
2500
|
-
return output;
|
|
2501
|
-
}
|
|
2502
|
-
getPointAt(u, output = new Vector2()) {
|
|
2503
|
-
return this.getPoint(u, output);
|
|
2504
|
-
}
|
|
2505
|
-
getTangent(_t, output = new Vector2()) {
|
|
2506
|
-
return output.subVectors(this.p2, this.p1).normalize();
|
|
2507
|
-
}
|
|
2508
|
-
getTangentAt(u, output = new Vector2()) {
|
|
2509
|
-
return this.getTangent(u, output);
|
|
2510
|
-
}
|
|
2511
|
-
getControlPointRefs() {
|
|
2512
|
-
return [this.p1, this.p2];
|
|
2513
|
-
}
|
|
2514
|
-
getAdaptivePointArray(output = []) {
|
|
2515
|
-
output.push(
|
|
2516
|
-
this.p1.x,
|
|
2517
|
-
this.p1.y,
|
|
2518
|
-
this.p2.x,
|
|
2519
|
-
this.p2.y
|
|
2520
|
-
);
|
|
2521
|
-
return output;
|
|
2522
|
-
}
|
|
2523
|
-
getMinMax(min = Vector2.MAX, max = Vector2.MIN) {
|
|
2524
|
-
const { p1, p2 } = this;
|
|
2525
|
-
min.x = Math.min(min.x, p1.x, p2.x);
|
|
2526
|
-
min.y = Math.min(min.y, p1.y, p2.y);
|
|
2527
|
-
max.x = Math.max(max.x, p1.x, p2.x);
|
|
2528
|
-
max.y = Math.max(max.y, p1.y, p2.y);
|
|
2529
|
-
return { min, max };
|
|
2530
|
-
}
|
|
2531
|
-
toCommands() {
|
|
2532
|
-
const { p1, p2 } = this;
|
|
2533
|
-
return [
|
|
2534
|
-
{ type: "M", x: p1.x, y: p1.y },
|
|
2535
|
-
{ type: "L", x: p2.x, y: p2.y }
|
|
2536
|
-
];
|
|
2537
|
-
}
|
|
2538
|
-
drawTo(ctx) {
|
|
2539
|
-
const { p1, p2 } = this;
|
|
2540
|
-
ctx.lineTo(p1.x, p1.y);
|
|
2541
|
-
ctx.lineTo(p2.x, p2.y);
|
|
2542
|
-
return this;
|
|
2543
|
-
}
|
|
2544
|
-
copy(source) {
|
|
2545
|
-
super.copy(source);
|
|
2546
|
-
this.p1.copy(source.p1);
|
|
2547
|
-
this.p2.copy(source.p2);
|
|
2548
|
-
return this;
|
|
2549
|
-
}
|
|
2550
|
-
}
|
|
2551
|
-
|
|
2552
2689
|
class PloygonCurve extends CompositeCurve {
|
|
2553
2690
|
//
|
|
2554
2691
|
}
|
|
@@ -2702,8 +2839,8 @@ class RectangleCurve extends PloygonCurve {
|
|
|
2702
2839
|
vertices = [],
|
|
2703
2840
|
indices = [],
|
|
2704
2841
|
verticesStride = 2,
|
|
2705
|
-
verticesOffset =
|
|
2706
|
-
indicesOffset =
|
|
2842
|
+
verticesOffset = vertices.length / verticesStride,
|
|
2843
|
+
indicesOffset = indices.length
|
|
2707
2844
|
} = options;
|
|
2708
2845
|
const { x, y, width, height } = this;
|
|
2709
2846
|
const points = [
|
|
@@ -2768,11 +2905,9 @@ class RoundRectangleCurve extends RoundCurve {
|
|
|
2768
2905
|
const cy = y + halfHeight;
|
|
2769
2906
|
const rx = Math.max(0, Math.min(radius, Math.min(halfWidth, halfHeight)));
|
|
2770
2907
|
const ry = rx;
|
|
2771
|
-
const dx = halfWidth - rx;
|
|
2772
|
-
const dy = halfHeight - ry;
|
|
2773
2908
|
this._center = new Vector2(cx, cy);
|
|
2774
2909
|
this._radius = new Vector2(rx, ry);
|
|
2775
|
-
this._diff = new Vector2(
|
|
2910
|
+
this._diff = new Vector2(halfWidth - rx, halfHeight - ry);
|
|
2776
2911
|
return this;
|
|
2777
2912
|
}
|
|
2778
2913
|
drawTo(ctx) {
|
|
@@ -3290,18 +3425,6 @@ class Path2D extends CompositeCurve {
|
|
|
3290
3425
|
});
|
|
3291
3426
|
return { min, max };
|
|
3292
3427
|
}
|
|
3293
|
-
fillTriangulate(options) {
|
|
3294
|
-
const indices = options?.indices ?? [];
|
|
3295
|
-
const vertices = options?.vertices ?? [];
|
|
3296
|
-
this.curves.forEach((curve) => {
|
|
3297
|
-
curve.fillTriangulate({
|
|
3298
|
-
...options,
|
|
3299
|
-
indices,
|
|
3300
|
-
vertices
|
|
3301
|
-
});
|
|
3302
|
-
});
|
|
3303
|
-
return { indices, vertices };
|
|
3304
|
-
}
|
|
3305
3428
|
strokeTriangulate(options) {
|
|
3306
3429
|
const indices = options?.indices ?? [];
|
|
3307
3430
|
const vertices = options?.vertices ?? [];
|
package/dist/index.d.cts
CHANGED
|
@@ -21,9 +21,9 @@ interface FillTriangulatedResult {
|
|
|
21
21
|
}
|
|
22
22
|
declare function fillTriangulate(points: number[], options?: FillTriangulateOptions): FillTriangulatedResult;
|
|
23
23
|
|
|
24
|
-
declare function getAdaptiveCubicBezierCurvePoints(sX: number, sY: number, x1: number, y1: number, x2: number, y2: number, x: number, y: number, smoothness
|
|
24
|
+
declare function getAdaptiveCubicBezierCurvePoints(sX: number, sY: number, x1: number, y1: number, x2: number, y2: number, x: number, y: number, smoothness?: number, points?: number[]): number[];
|
|
25
25
|
|
|
26
|
-
declare function getAdaptiveQuadraticBezierCurvePoints(sX: number, sY: number, x1: number, y1: number, x: number, y: number, smoothness
|
|
26
|
+
declare function getAdaptiveQuadraticBezierCurvePoints(sX: number, sY: number, x1: number, y1: number, x: number, y: number, smoothness?: number, points?: number[]): number[];
|
|
27
27
|
|
|
28
28
|
declare function quadraticBezier(t: number, p0: number, p1: number, p2: number): number;
|
|
29
29
|
|
|
@@ -224,6 +224,7 @@ declare class CompositeCurve<T extends Curve = Curve> extends Curve {
|
|
|
224
224
|
protected _removeNextPointIfEqualPrevPoint(output: number[], offset: number): number[];
|
|
225
225
|
getSpacedPointArray(count?: number, output?: number[]): number[];
|
|
226
226
|
getAdaptivePointArray(output?: number[]): number[];
|
|
227
|
+
fillTriangulate(options?: FillTriangulateOptions): FillTriangulatedResult;
|
|
227
228
|
applyTransform(transform: Matrix3): this;
|
|
228
229
|
getMinMax(min?: Vector2, max?: Vector2): {
|
|
229
230
|
min: Vector2;
|
|
@@ -276,6 +277,7 @@ declare class LineCurve extends Curve {
|
|
|
276
277
|
max: Vector2;
|
|
277
278
|
};
|
|
278
279
|
toCommands(): Path2DCommand[];
|
|
280
|
+
fillTriangulate(options?: FillTriangulateOptions): FillTriangulatedResult;
|
|
279
281
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
280
282
|
copy(source: LineCurve): this;
|
|
281
283
|
}
|
|
@@ -494,7 +496,6 @@ declare class Path2D extends CompositeCurve<CurvePath> {
|
|
|
494
496
|
min: Vector2;
|
|
495
497
|
max: Vector2;
|
|
496
498
|
};
|
|
497
|
-
fillTriangulate(options?: FillTriangulateOptions): FillTriangulatedResult;
|
|
498
499
|
strokeTriangulate(options?: StrokeTriangulateOptions): StrokeTriangulatedResult;
|
|
499
500
|
getBoundingBox(withStyle?: boolean): BoundingBox;
|
|
500
501
|
drawTo(ctx: CanvasRenderingContext2D, style?: Partial<Path2DStyle>): this;
|
package/dist/index.d.mts
CHANGED
|
@@ -21,9 +21,9 @@ interface FillTriangulatedResult {
|
|
|
21
21
|
}
|
|
22
22
|
declare function fillTriangulate(points: number[], options?: FillTriangulateOptions): FillTriangulatedResult;
|
|
23
23
|
|
|
24
|
-
declare function getAdaptiveCubicBezierCurvePoints(sX: number, sY: number, x1: number, y1: number, x2: number, y2: number, x: number, y: number, smoothness
|
|
24
|
+
declare function getAdaptiveCubicBezierCurvePoints(sX: number, sY: number, x1: number, y1: number, x2: number, y2: number, x: number, y: number, smoothness?: number, points?: number[]): number[];
|
|
25
25
|
|
|
26
|
-
declare function getAdaptiveQuadraticBezierCurvePoints(sX: number, sY: number, x1: number, y1: number, x: number, y: number, smoothness
|
|
26
|
+
declare function getAdaptiveQuadraticBezierCurvePoints(sX: number, sY: number, x1: number, y1: number, x: number, y: number, smoothness?: number, points?: number[]): number[];
|
|
27
27
|
|
|
28
28
|
declare function quadraticBezier(t: number, p0: number, p1: number, p2: number): number;
|
|
29
29
|
|
|
@@ -224,6 +224,7 @@ declare class CompositeCurve<T extends Curve = Curve> extends Curve {
|
|
|
224
224
|
protected _removeNextPointIfEqualPrevPoint(output: number[], offset: number): number[];
|
|
225
225
|
getSpacedPointArray(count?: number, output?: number[]): number[];
|
|
226
226
|
getAdaptivePointArray(output?: number[]): number[];
|
|
227
|
+
fillTriangulate(options?: FillTriangulateOptions): FillTriangulatedResult;
|
|
227
228
|
applyTransform(transform: Matrix3): this;
|
|
228
229
|
getMinMax(min?: Vector2, max?: Vector2): {
|
|
229
230
|
min: Vector2;
|
|
@@ -276,6 +277,7 @@ declare class LineCurve extends Curve {
|
|
|
276
277
|
max: Vector2;
|
|
277
278
|
};
|
|
278
279
|
toCommands(): Path2DCommand[];
|
|
280
|
+
fillTriangulate(options?: FillTriangulateOptions): FillTriangulatedResult;
|
|
279
281
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
280
282
|
copy(source: LineCurve): this;
|
|
281
283
|
}
|
|
@@ -494,7 +496,6 @@ declare class Path2D extends CompositeCurve<CurvePath> {
|
|
|
494
496
|
min: Vector2;
|
|
495
497
|
max: Vector2;
|
|
496
498
|
};
|
|
497
|
-
fillTriangulate(options?: FillTriangulateOptions): FillTriangulatedResult;
|
|
498
499
|
strokeTriangulate(options?: StrokeTriangulateOptions): StrokeTriangulatedResult;
|
|
499
500
|
getBoundingBox(withStyle?: boolean): BoundingBox;
|
|
500
501
|
drawTo(ctx: CanvasRenderingContext2D, style?: Partial<Path2DStyle>): this;
|
package/dist/index.d.ts
CHANGED
|
@@ -21,9 +21,9 @@ interface FillTriangulatedResult {
|
|
|
21
21
|
}
|
|
22
22
|
declare function fillTriangulate(points: number[], options?: FillTriangulateOptions): FillTriangulatedResult;
|
|
23
23
|
|
|
24
|
-
declare function getAdaptiveCubicBezierCurvePoints(sX: number, sY: number, x1: number, y1: number, x2: number, y2: number, x: number, y: number, smoothness
|
|
24
|
+
declare function getAdaptiveCubicBezierCurvePoints(sX: number, sY: number, x1: number, y1: number, x2: number, y2: number, x: number, y: number, smoothness?: number, points?: number[]): number[];
|
|
25
25
|
|
|
26
|
-
declare function getAdaptiveQuadraticBezierCurvePoints(sX: number, sY: number, x1: number, y1: number, x: number, y: number, smoothness
|
|
26
|
+
declare function getAdaptiveQuadraticBezierCurvePoints(sX: number, sY: number, x1: number, y1: number, x: number, y: number, smoothness?: number, points?: number[]): number[];
|
|
27
27
|
|
|
28
28
|
declare function quadraticBezier(t: number, p0: number, p1: number, p2: number): number;
|
|
29
29
|
|
|
@@ -224,6 +224,7 @@ declare class CompositeCurve<T extends Curve = Curve> extends Curve {
|
|
|
224
224
|
protected _removeNextPointIfEqualPrevPoint(output: number[], offset: number): number[];
|
|
225
225
|
getSpacedPointArray(count?: number, output?: number[]): number[];
|
|
226
226
|
getAdaptivePointArray(output?: number[]): number[];
|
|
227
|
+
fillTriangulate(options?: FillTriangulateOptions): FillTriangulatedResult;
|
|
227
228
|
applyTransform(transform: Matrix3): this;
|
|
228
229
|
getMinMax(min?: Vector2, max?: Vector2): {
|
|
229
230
|
min: Vector2;
|
|
@@ -276,6 +277,7 @@ declare class LineCurve extends Curve {
|
|
|
276
277
|
max: Vector2;
|
|
277
278
|
};
|
|
278
279
|
toCommands(): Path2DCommand[];
|
|
280
|
+
fillTriangulate(options?: FillTriangulateOptions): FillTriangulatedResult;
|
|
279
281
|
drawTo(ctx: CanvasRenderingContext2D): this;
|
|
280
282
|
copy(source: LineCurve): this;
|
|
281
283
|
}
|
|
@@ -494,7 +496,6 @@ declare class Path2D extends CompositeCurve<CurvePath> {
|
|
|
494
496
|
min: Vector2;
|
|
495
497
|
max: Vector2;
|
|
496
498
|
};
|
|
497
|
-
fillTriangulate(options?: FillTriangulateOptions): FillTriangulatedResult;
|
|
498
499
|
strokeTriangulate(options?: StrokeTriangulateOptions): StrokeTriangulatedResult;
|
|
499
500
|
getBoundingBox(withStyle?: boolean): BoundingBox;
|
|
500
501
|
drawTo(ctx: CanvasRenderingContext2D, style?: Partial<Path2DStyle>): this;
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(v,R){typeof exports=="object"&&typeof module<"u"?R(exports):typeof define=="function"&&define.amd?define(["exports"],R):(v=typeof globalThis<"u"?globalThis:v||self,R(v.modernPath2d={}))})(this,function(v){"use strict";var En=Object.defineProperty;var Ln=(v,R,nt)=>R in v?En(v,R,{enumerable:!0,configurable:!0,writable:!0,value:nt}):v[R]=nt;var X=(v,R,nt)=>Ln(v,typeof R!="symbol"?R+"":R,nt);function R(i,e,t,n={}){const{radius:r=1}=n;i.moveTo(e,t),i.arc(e,t,r,0,Math.PI*2)}const nt={arcs:"bevel",bevel:"bevel",miter:"miter","miter-clip":"miter",round:"round"};function Ct(i,e){const{fill:t="#000",stroke:n="none",strokeWidth:r=n==="none"?0:1,strokeLinecap:o="round",strokeLinejoin:s="miter",strokeMiterlimit:h=0,strokeDasharray:c=[],strokeDashoffset:a=0,shadowOffsetX:l=0,shadowOffsetY:y=0,shadowBlur:f=0,shadowColor:x="rgba(0, 0, 0, 0)"}=e;i.fillStyle=t,i.strokeStyle=n,i.lineWidth=r,i.lineCap=o,i.lineJoin=nt[s],i.miterLimit=h,i.setLineDash(c),i.lineDashOffset=a,i.shadowOffsetX=l,i.shadowOffsetY=y,i.shadowBlur=f,i.shadowColor=x}class p{constructor(e=0,t=0){this.x=e,this.y=t}static get MAX(){return new p(1/0,1/0)}static get MIN(){return new p(-1/0,-1/0)}get array(){return[this.x,this.y]}set(e,t){return this.x=e,this.y=t,this}add(e){return this.x+=e.x,this.y+=e.y,this}sub(e){return this.x-=e.x,this.y-=e.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}divide(e){return this.x/=e.x,this.y/=e.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}rotate(e,t={x:0,y:0}){const n=-e/180*Math.PI,r=this.x-t.x,o=-(this.y-t.y),s=Math.sin(n),h=Math.cos(n);return this.set(t.x+(r*h-o*s),t.y-(r*s+o*h)),this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y;return t*t+n*n}lengthSquared(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.lengthSquared())}scale(e,t=e,n={x:0,y:0}){const r=e<0?n.x-this.x+n.x:this.x,o=t<0?n.y-this.y+n.y:this.y;return this.x=r*Math.abs(e),this.y=o*Math.abs(t),this}skew(e,t=0,n={x:0,y:0}){const r=this.x-n.x,o=this.y-n.y;return this.x=n.x+(r+Math.tan(e)*o),this.y=n.y+(o+Math.tan(t)*r),this}min(...e){return this.x=Math.min(this.x,...e.map(t=>t.x)),this.y=Math.min(this.y,...e.map(t=>t.y)),this}max(...e){return this.x=Math.max(this.x,...e.map(t=>t.x)),this.y=Math.max(this.y,...e.map(t=>t.y)),this}normalize(){return this.scale(1/(this.length()||1))}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this}divideVectors(e,t){return this.x=e.x/t.x,this.y=e.y/t.y,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return this.x===e.x&&this.y===e.y}applyMatrix3(e){const t=this.x,n=this.y,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6],this.y=r[1]*t+r[4]*n+r[7],this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new p(this.x,this.y)}}class V{constructor(e=0,t=0,n=0,r=0){this.left=e,this.top=t,this.width=n,this.height=r}get x(){return this.left}set x(e){this.left=e}get y(){return this.top}set y(e){this.top=e}get right(){return this.left+this.width}get bottom(){return this.top+this.height}get center(){return new p((this.left+this.right)/2,(this.top+this.bottom)/2)}get array(){return[this.left,this.top,this.width,this.height]}static from(...e){if(e.length===0)return new V;if(e.length===1)return e[0].clone();const t=e[0],n=e.slice(1).reduce((r,o)=>(r.left=Math.min(r.left,o.left),r.top=Math.min(r.top,o.top),r.right=Math.max(r.right,o.right),r.bottom=Math.max(r.bottom,o.bottom),r),{left:(t==null?void 0:t.left)??0,top:(t==null?void 0:t.top)??0,right:(t==null?void 0:t.right)??0,bottom:(t==null?void 0:t.bottom)??0});return new V(n.left,n.top,n.right-n.left,n.bottom-n.top)}translate(e,t){return this.left+=e,this.top+=t,this}copy(e){return this.left=e.left,this.top=e.top,this.width=e.width,this.height=e.height,this}clone(){return new V(this.left,this.top,this.width,this.height)}}class z{constructor(e=1,t=0,n=0,r=0,o=1,s=0,h=0,c=0,a=1){X(this,"elements",[]);this.set(e,t,n,r,o,s,h,c,a)}set(e,t,n,r,o,s,h,c,a){const l=this.elements;return l[0]=e,l[1]=r,l[2]=h,l[3]=t,l[4]=o,l[5]=c,l[6]=n,l[7]=s,l[8]=a,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,r=t.elements,o=this.elements,s=n[0],h=n[3],c=n[6],a=n[1],l=n[4],y=n[7],f=n[2],x=n[5],u=n[8],m=r[0],M=r[3],k=r[6],S=r[1],P=r[4],w=r[7],I=r[2],E=r[5],g=r[8];return o[0]=s*m+h*S+c*I,o[3]=s*M+h*P+c*E,o[6]=s*k+h*w+c*g,o[1]=a*m+l*S+y*I,o[4]=a*M+l*P+y*E,o[7]=a*k+l*w+y*g,o[2]=f*m+x*S+u*I,o[5]=f*M+x*P+u*E,o[8]=f*k+x*w+u*g,this}invert(){const e=this.elements,t=e[0],n=e[1],r=e[2],o=e[3],s=e[4],h=e[5],c=e[6],a=e[7],l=e[8],y=l*s-h*a,f=h*c-l*o,x=a*o-s*c,u=t*y+n*f+r*x;if(u===0)return this.set(0,0,0,0,0,0,0,0,0);const m=1/u;return e[0]=y*m,e[1]=(r*a-l*n)*m,e[2]=(h*n-r*s)*m,e[3]=f*m,e[4]=(l*t-r*c)*m,e[5]=(r*o-h*t)*m,e[6]=x*m,e[7]=(n*c-a*t)*m,e[8]=(s*t-n*o)*m,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}scale(e,t){return this.premultiply(bt.makeScale(e,t)),this}rotate(e){return this.premultiply(bt.makeRotation(-e)),this}translate(e,t){return this.premultiply(bt.makeTranslation(e,t)),this}makeTranslation(e,t){return this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}clone(){return new this.constructor().fromArray(this.elements)}}const bt=new z;function zt(i,e,t,n){const r=i*t+e*n,o=Math.sqrt(i*i+e*e)*Math.sqrt(t*t+n*n);let s=Math.acos(Math.max(-1,Math.min(1,r/o)));return i*n-e*t<0&&(s=-s),s}function Zt(i,e,t,n,r,o,s,h){if(e===0||t===0){i.lineTo(h.x,h.y);return}n=n*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const c=(s.x-h.x)/2,a=(s.y-h.y)/2,l=Math.cos(n)*c+Math.sin(n)*a,y=-Math.sin(n)*c+Math.cos(n)*a;let f=e*e,x=t*t;const u=l*l,m=y*y,M=u/f+m/x;if(M>1){const O=Math.sqrt(M);e=O*e,t=O*t,f=e*e,x=t*t}const k=f*m+x*u,S=(f*x-k)/k;let P=Math.sqrt(Math.max(0,S));r===o&&(P=-P);const w=P*e*y/t,I=-P*t*l/e,E=Math.cos(n)*w-Math.sin(n)*I+(s.x+h.x)/2,g=Math.sin(n)*w+Math.cos(n)*I+(s.y+h.y)/2,d=zt(1,0,(l-w)/e,(y-I)/t),F=zt((l-w)/e,(y-I)/t,(-l-w)/e,(-y-I)/t)%(Math.PI*2);i.ellipse(E,g,e,t,n,d,d+F,o===0)}const _={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function Z(i,e,t=0){let h=0,c=!0,a="",l="";const y=[];function f(M,k,S){const P=new SyntaxError(`Unexpected character "${M}" at index ${k}.`);throw P.partial=S,P}function x(){a!==""&&(l===""?y.push(Number(a)):y.push(Number(a)*10**Number(l))),a="",l=""}let u;const m=i.length;for(let M=0;M<m;M++){if(u=i[M],Array.isArray(e)&&e.includes(y.length%t)&&_.FLAGS.test(u)){h=1,a=u,x();continue}if(h===0){if(_.WHITESPACE.test(u))continue;if(_.DIGIT.test(u)||_.SIGN.test(u)){h=1,a=u;continue}if(_.POINT.test(u)){h=2,a=u;continue}_.COMMA.test(u)&&(c&&f(u,M,y),c=!0)}if(h===1){if(_.DIGIT.test(u)){a+=u;continue}if(_.POINT.test(u)){a+=u,h=2;continue}if(_.EXP.test(u)){h=3;continue}_.SIGN.test(u)&&a.length===1&&_.SIGN.test(a[0])&&f(u,M,y)}if(h===2){if(_.DIGIT.test(u)){a+=u;continue}if(_.EXP.test(u)){h=3;continue}_.POINT.test(u)&&a[a.length-1]==="."&&f(u,M,y)}if(h===3){if(_.DIGIT.test(u)){l+=u;continue}if(_.SIGN.test(u)){if(l===""){l+=u;continue}l.length===1&&_.SIGN.test(l)&&f(u,M,y)}}_.WHITESPACE.test(u)?(x(),h=0,c=!1):_.COMMA.test(u)?(x(),h=0,c=!0):_.SIGN.test(u)?(x(),h=1,a=u):_.POINT.test(u)?(x(),h=2,a=u):f(u,M,y)}return x(),y}function st(i,e){return i-(e-i)}function kt(i,e){const t=new p,n=new p;for(let r=0,o=i.length;r<o;r++){const s=i[r];if(s.type==="m"||s.type==="M")s.type==="m"?t.add(s):t.copy(s),e.moveTo(t.x,t.y),n.copy(t);else if(s.type==="h"||s.type==="H")s.type==="h"?t.x+=s.x:t.x=s.x,e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="v"||s.type==="V")s.type==="v"?t.y+=s.y:t.y=s.y,e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="l"||s.type==="L")s.type==="l"?t.add(s):t.copy(s),e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="c"||s.type==="C")s.type==="c"?(e.bezierCurveTo(t.x+s.x1,t.y+s.y1,t.x+s.x2,t.y+s.y2,t.x+s.x,t.y+s.y),n.x=t.x+s.x2,n.y=t.y+s.y2,t.add(s)):(e.bezierCurveTo(s.x1,s.y1,s.x2,s.y2,s.x,s.y),n.x=s.x2,n.y=s.y2,t.copy(s));else if(s.type==="s"||s.type==="S")s.type==="s"?(e.bezierCurveTo(st(t.x,n.x),st(t.y,n.y),t.x+s.x2,t.y+s.y2,t.x+s.x,t.y+s.y),n.x=t.x+s.x2,n.y=t.y+s.y2,t.add(s)):(e.bezierCurveTo(st(t.x,n.x),st(t.y,n.y),s.x2,s.y2,s.x,s.y),n.x=s.x2,n.y=s.y2,t.copy(s));else if(s.type==="q"||s.type==="Q")s.type==="q"?(e.quadraticCurveTo(t.x+s.x1,t.y+s.y1,t.x+s.x,t.y+s.y),n.x=t.x+s.x1,n.y=t.y+s.y1,t.add(s)):(e.quadraticCurveTo(s.x1,s.y1,s.x,s.y),n.x=s.x1,n.y=s.y1,t.copy(s));else if(s.type==="t"||s.type==="T"){const h=st(t.x,n.x),c=st(t.y,n.y);n.x=h,n.y=c,s.type==="t"?(e.quadraticCurveTo(h,c,t.x+s.x,t.y+s.y),t.add(s)):(e.quadraticCurveTo(h,c,s.x,s.y),t.copy(s))}else if(s.type==="a"||s.type==="A"){const h=t.clone();if(s.type==="a"){if(s.x===0&&s.y===0)continue;t.add(s)}else{if(t.equals(s))continue;t.copy(s)}n.copy(t),Zt(e,s.rx,s.ry,s.angle,s.largeArcFlag,s.sweepFlag,h,t)}else s.type==="z"||s.type==="Z"?(e.startPoint&&t.copy(e.startPoint),e.closePath()):console.warn("Unsupported commands",s)}}function Gt(i){let e,t;const n=[];for(let r=0,o=i.length;r<o;r++){const s=i[r];switch(s.type){case"m":case"M":if(s.x.toFixed(4)===(t==null?void 0:t.x.toFixed(4))&&s.y.toFixed(4)===(t==null?void 0:t.y.toFixed(4)))continue;n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y},e={x:s.x,y:s.y};break;case"h":case"H":n.push(`${s.type} ${s.x}`),t={x:s.x,y:(t==null?void 0:t.y)??0};break;case"v":case"V":n.push(`${s.type} ${s.y}`),t={x:(t==null?void 0:t.x)??0,y:s.y};break;case"l":case"L":n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"c":case"C":n.push(`${s.type} ${s.x1} ${s.y1} ${s.x2} ${s.y2} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"s":case"S":n.push(`${s.type} ${s.x2} ${s.y2} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"q":case"Q":n.push(`${s.type} ${s.x1} ${s.y1} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"t":case"T":n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"a":case"A":n.push(`${s.type} ${s.rx} ${s.ry} ${s.angle} ${s.largeArcFlag} ${s.sweepFlag} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"z":case"Z":n.push(s.type),e&&(t={x:e.x,y:e.y});break}}return n.join(" ")}const Ae=/[a-df-z][^a-df-z]*/gi;function It(i){const e=[],t=i.match(Ae);if(!t)return e;for(let n=0,r=t.length;n<r;n++){const o=t[n],s=o.charAt(0),h=o.slice(1).trim();let c;switch(s){case"m":case"M":c=Z(h);for(let a=0,l=c.length;a<l;a+=2)a===0?e.push({type:s,x:c[a],y:c[a+1]}):e.push({type:s==="m"?"l":"L",x:c[a],y:c[a+1]});break;case"h":case"H":c=Z(h);for(let a=0,l=c.length;a<l;a++)e.push({type:s,x:c[a]});break;case"v":case"V":c=Z(h);for(let a=0,l=c.length;a<l;a++)e.push({type:s,y:c[a]});break;case"l":case"L":c=Z(h);for(let a=0,l=c.length;a<l;a+=2)e.push({type:s,x:c[a],y:c[a+1]});break;case"c":case"C":c=Z(h);for(let a=0,l=c.length;a<l;a+=6)e.push({type:s,x1:c[a],y1:c[a+1],x2:c[a+2],y2:c[a+3],x:c[a+4],y:c[a+5]});break;case"s":case"S":c=Z(h);for(let a=0,l=c.length;a<l;a+=4)e.push({type:s,x2:c[a],y2:c[a+1],x:c[a+2],y:c[a+3]});break;case"q":case"Q":c=Z(h);for(let a=0,l=c.length;a<l;a+=4)e.push({type:s,x1:c[a],y1:c[a+1],x:c[a+2],y:c[a+3]});break;case"t":case"T":c=Z(h);for(let a=0,l=c.length;a<l;a+=2)e.push({type:s,x:c[a],y:c[a+1]});break;case"a":case"A":c=Z(h,[3,4],7);for(let a=0,l=c.length;a<l;a+=7)e.push({type:s,rx:c[a],ry:c[a+1],angle:c[a+2],largeArcFlag:c[a+3],sweepFlag:c[a+4],x:c[a+5],y:c[a+6]});break;case"z":case"Z":e.push({type:s});break;default:console.warn(o)}}return e}function St(i,e,t,n,r){const o=(n-e)*.5,s=(r-t)*.5,h=i*i,c=i*h;return(2*t-2*n+o+s)*c+(-3*t+3*n-2*o-s)*h+o*i+t}function Ce(i,e){const t=1-i;return t*t*t*e}function be(i,e){const t=1-i;return 3*t*t*i*e}function ke(i,e){return 3*(1-i)*i*i*e}function Ie(i,e){return i*i*i*e}function Et(i,e,t,n,r){return Ce(i,e)+be(i,t)+ke(i,n)+Ie(i,r)}function Se(i,e,t=2){const n=e&&e.length,r=n?e[0]*t:i.length;let o=Bt(i,0,r,t,!0);const s=[];if(!o||o.next===o.prev)return s;let h,c,a;if(n&&(o=_e(i,e,o,t)),i.length>80*t){h=1/0,c=1/0;let l=-1/0,y=-1/0;for(let f=t;f<r;f+=t){const x=i[f],u=i[f+1];x<h&&(h=x),u<c&&(c=u),x>l&&(l=x),u>y&&(y=u)}a=Math.max(l-h,y-c),a=a!==0?32767/a:0}return ot(o,s,t,h,c,a,0),s}function Bt(i,e,t,n,r){let o;if(r===Ue(i,e,t,n)>0)for(let s=e;s<t;s+=n)o=Xt(s/n|0,i[s],i[s+1],o);else for(let s=t-n;s>=e;s-=n)o=Xt(s/n|0,i[s],i[s+1],o);return o&&it(o,o.next)&&(at(o),o=o.next),o}function H(i,e){if(!i)return i;e||(e=i);let t=i,n;do if(n=!1,!t.steiner&&(it(t,t.next)||N(t.prev,t,t.next)===0)){if(at(t),t=e=t.prev,t===t.next)break;n=!0}else t=t.next;while(n||t!==e);return e}function ot(i,e,t,n,r,o,s){if(!i)return;!s&&o&&Re(i,n,r,o);let h=i;for(;i.prev!==i.next;){const c=i.prev,a=i.next;if(o?Le(i,n,r,o):Ee(i)){e.push(c.i,i.i,a.i),at(i),i=a.next,h=a.next;continue}if(i=a,i===h){s?s===1?(i=$e(H(i),e),ot(i,e,t,n,r,o,2)):s===2&&Ne(i,e,t,n,r,o):ot(H(i),e,t,n,r,o,1);break}}}function Ee(i){const e=i.prev,t=i,n=i.next;if(N(e,t,n)>=0)return!1;const r=e.x,o=t.x,s=n.x,h=e.y,c=t.y,a=n.y,l=Math.min(r,o,s),y=Math.min(h,c,a),f=Math.max(r,o,s),x=Math.max(h,c,a);let u=n.next;for(;u!==e;){if(u.x>=l&&u.x<=f&&u.y>=y&&u.y<=x&&ct(r,h,o,c,s,a,u.x,u.y)&&N(u.prev,u,u.next)>=0)return!1;u=u.next}return!0}function Le(i,e,t,n){const r=i.prev,o=i,s=i.next;if(N(r,o,s)>=0)return!1;const h=r.x,c=o.x,a=s.x,l=r.y,y=o.y,f=s.y,x=Math.min(h,c,a),u=Math.min(l,y,f),m=Math.max(h,c,a),M=Math.max(l,y,f),k=Lt(x,u,e,t,n),S=Lt(m,M,e,t,n);let P=i.prevZ,w=i.nextZ;for(;P&&P.z>=k&&w&&w.z<=S;){if(P.x>=x&&P.x<=m&&P.y>=u&&P.y<=M&&P!==r&&P!==s&&ct(h,l,c,y,a,f,P.x,P.y)&&N(P.prev,P,P.next)>=0||(P=P.prevZ,w.x>=x&&w.x<=m&&w.y>=u&&w.y<=M&&w!==r&&w!==s&&ct(h,l,c,y,a,f,w.x,w.y)&&N(w.prev,w,w.next)>=0))return!1;w=w.nextZ}for(;P&&P.z>=k;){if(P.x>=x&&P.x<=m&&P.y>=u&&P.y<=M&&P!==r&&P!==s&&ct(h,l,c,y,a,f,P.x,P.y)&&N(P.prev,P,P.next)>=0)return!1;P=P.prevZ}for(;w&&w.z<=S;){if(w.x>=x&&w.x<=m&&w.y>=u&&w.y<=M&&w!==r&&w!==s&&ct(h,l,c,y,a,f,w.x,w.y)&&N(w.prev,w,w.next)>=0)return!1;w=w.nextZ}return!0}function $e(i,e){let t=i;do{const n=t.prev,r=t.next.next;!it(n,r)&&Ut(n,t,t.next,r)&&ht(n,r)&&ht(r,n)&&(e.push(n.i,t.i,r.i),at(t),at(t.next),t=i=r),t=t.next}while(t!==i);return H(t)}function Ne(i,e,t,n,r,o){let s=i;do{let h=s.next.next;for(;h!==s.prev;){if(s.i!==h.i&&Ge(s,h)){let c=Vt(s,h);s=H(s,s.next),c=H(c,c.next),ot(s,e,t,n,r,o,0),ot(c,e,t,n,r,o,0);return}h=h.next}s=s.next}while(s!==i)}function _e(i,e,t,n){const r=[];for(let o=0,s=e.length;o<s;o++){const h=e[o]*n,c=o<s-1?e[o+1]*n:i.length,a=Bt(i,h,c,n,!1);a===a.next&&(a.steiner=!0),r.push(Ze(a))}r.sort(De);for(let o=0;o<r.length;o++)t=qe(r[o],t);return t}function De(i,e){let t=i.x-e.x;if(t===0&&(t=i.y-e.y,t===0)){const n=(i.next.y-i.y)/(i.next.x-i.x),r=(e.next.y-e.y)/(e.next.x-e.x);t=n-r}return t}function qe(i,e){const t=Fe(i,e);if(!t)return e;const n=Vt(t,i);return H(n,n.next),H(t,t.next)}function Fe(i,e){let t=e;const n=i.x,r=i.y;let o=-1/0,s;if(it(i,t))return t;do{if(it(i,t.next))return t.next;if(r<=t.y&&r>=t.next.y&&t.next.y!==t.y){const y=t.x+(r-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(y<=n&&y>o&&(o=y,s=t.x<t.next.x?t:t.next,y===n))return s}t=t.next}while(t!==e);if(!s)return null;const h=s,c=s.x,a=s.y;let l=1/0;t=s;do{if(n>=t.x&&t.x>=c&&n!==t.x&&jt(r<a?n:o,r,c,a,r<a?o:n,r,t.x,t.y)){const y=Math.abs(r-t.y)/(n-t.x);ht(t,i)&&(y<l||y===l&&(t.x>s.x||t.x===s.x&&Oe(s,t)))&&(s=t,l=y)}t=t.next}while(t!==h);return s}function Oe(i,e){return N(i.prev,i,e.prev)<0&&N(e.next,i,i.next)<0}function Re(i,e,t,n){let r=i;do r.z===0&&(r.z=Lt(r.x,r.y,e,t,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next;while(r!==i);r.prevZ.nextZ=null,r.prevZ=null,ze(r)}function ze(i){let e,t=1;do{let n=i,r;i=null;let o=null;for(e=0;n;){e++;let s=n,h=0;for(let a=0;a<t&&(h++,s=s.nextZ,!!s);a++);let c=t;for(;h>0||c>0&&s;)h!==0&&(c===0||!s||n.z<=s.z)?(r=n,n=n.nextZ,h--):(r=s,s=s.nextZ,c--),o?o.nextZ=r:i=r,r.prevZ=o,o=r;n=s}o.nextZ=null,t*=2}while(e>1);return i}function Lt(i,e,t,n,r){return i=(i-t)*r|0,e=(e-n)*r|0,i=(i|i<<8)&16711935,i=(i|i<<4)&252645135,i=(i|i<<2)&858993459,i=(i|i<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,i|e<<1}function Ze(i){let e=i,t=i;do(e.x<t.x||e.x===t.x&&e.y<t.y)&&(t=e),e=e.next;while(e!==i);return t}function jt(i,e,t,n,r,o,s,h){return(r-s)*(e-h)>=(i-s)*(o-h)&&(i-s)*(n-h)>=(t-s)*(e-h)&&(t-s)*(o-h)>=(r-s)*(n-h)}function ct(i,e,t,n,r,o,s,h){return!(i===s&&e===h)&&jt(i,e,t,n,r,o,s,h)}function Ge(i,e){return i.next.i!==e.i&&i.prev.i!==e.i&&!Be(i,e)&&(ht(i,e)&&ht(e,i)&&je(i,e)&&(N(i.prev,i,e.prev)||N(i,e.prev,e))||it(i,e)&&N(i.prev,i,i.next)>0&&N(e.prev,e,e.next)>0)}function N(i,e,t){return(e.y-i.y)*(t.x-e.x)-(e.x-i.x)*(t.y-e.y)}function it(i,e){return i.x===e.x&&i.y===e.y}function Ut(i,e,t,n){const r=gt(N(i,e,t)),o=gt(N(i,e,n)),s=gt(N(t,n,i)),h=gt(N(t,n,e));return!!(r!==o&&s!==h||r===0&&pt(i,t,e)||o===0&&pt(i,n,e)||s===0&&pt(t,i,n)||h===0&&pt(t,e,n))}function pt(i,e,t){return e.x<=Math.max(i.x,t.x)&&e.x>=Math.min(i.x,t.x)&&e.y<=Math.max(i.y,t.y)&&e.y>=Math.min(i.y,t.y)}function gt(i){return i>0?1:i<0?-1:0}function Be(i,e){let t=i;do{if(t.i!==i.i&&t.next.i!==i.i&&t.i!==e.i&&t.next.i!==e.i&&Ut(t,t.next,i,e))return!0;t=t.next}while(t!==i);return!1}function ht(i,e){return N(i.prev,i,i.next)<0?N(i,e,i.next)>=0&&N(i,i.prev,e)>=0:N(i,e,i.prev)<0||N(i,i.next,e)<0}function je(i,e){let t=i,n=!1;const r=(i.x+e.x)/2,o=(i.y+e.y)/2;do t.y>o!=t.next.y>o&&t.next.y!==t.y&&r<(t.next.x-t.x)*(o-t.y)/(t.next.y-t.y)+t.x&&(n=!n),t=t.next;while(t!==i);return n}function Vt(i,e){const t=$t(i.i,i.x,i.y),n=$t(e.i,e.x,e.y),r=i.next,o=e.prev;return i.next=e,e.prev=i,t.next=r,r.prev=t,n.next=t,t.prev=n,o.next=n,n.prev=o,n}function Xt(i,e,t,n){const r=$t(i,e,t);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function at(i){i.next.prev=i.prev,i.prev.next=i.next,i.prevZ&&(i.prevZ.nextZ=i.nextZ),i.nextZ&&(i.nextZ.prevZ=i.prevZ)}function $t(i,e,t){return{i,x:e,y:t,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function Ue(i,e,t,n){let r=0;for(let o=e,s=t-n;o<t;o+=n)r+=(i[s]-i[o])*(i[o+1]+i[s+1]),s=o;return r}function Wt(i,e={}){let{vertices:t=[],indices:n=[],holes:r=[],verticesStride:o=2,verticesOffset:s=t.length/o,indicesOffset:h=n.length}=e;const c=Se(i,r,2);if(c){for(let l=0;l<c.length;l+=3)n[h++]=c[l]+s,n[h++]=c[l+1]+s,n[h++]=c[l+2]+s;let a=s*o;for(let l=0;l<i.length;l+=2)t[a]=i[l],t[a+1]=i[l+1],a+=o}return{vertices:t,indices:n}}const Ve=8,dt=11920929e-14,Xe=1;function Ht(i,e,t,n,r,o,s,h,c=.5,a){const y=Math.min(.99,Math.max(0,c));let f=(Xe-y)/1;return f*=f,Nt(i,e,t,n,r,o,s,h,a,f,0),a.push(s,h),a}function Nt(i,e,t,n,r,o,s,h,c,a,l){if(l>Ve)return;const y=(i+t)/2,f=(e+n)/2,x=(t+r)/2,u=(n+o)/2,m=(r+s)/2,M=(o+h)/2,k=(y+x)/2,S=(f+u)/2,P=(x+m)/2,w=(u+M)/2,I=(k+P)/2,E=(S+w)/2;if(l>0){let g=s-i,d=h-e;const F=Math.abs((t-s)*d-(n-h)*g),O=Math.abs((r-s)*d-(o-h)*g);if(F>dt&&O>dt){if((F+O)*(F+O)<=a*(g*g+d*d)){c.push(I,E);return}}else if(F>dt){if(F*F<=a*(g*g+d*d)){c.push(I,E);return}}else if(O>dt){if(O*O<=a*(g*g+d*d)){c.push(I,E);return}}else if(g=I-(i+s)/2,d=E-(e+h)/2,g*g+d*d<=a){c.push(I,E);return}}Nt(i,e,y,f,k,S,I,E,c,a,l+1),Nt(I,E,P,w,m,M,s,h,c,a,l+1)}const We=8,He=11920929e-14,Qe=1;function Qt(i,e,t,n,r,o,s=.5,h){const a=Math.min(.99,Math.max(0,s));let l=(Qe-a)/1;return l*=l,_t(h,i,e,t,n,r,o,l,0),h.push(r,o),h}function _t(i,e,t,n,r,o,s,h,c){if(c>We)return;const a=(e+n)/2,l=(t+r)/2,y=(n+o)/2,f=(r+s)/2,x=(a+y)/2,u=(l+f)/2;let m=o-e,M=s-t;const k=Math.abs((n-o)*M-(r-s)*m);if(k>He){if(k*k<=h*(m*m+M*M)){i.push(x,u);return}}else if(m=x-(e+o)/2,M=u-(t+s)/2,m*m+M*M<=h){i.push(x,u);return}_t(i,e,t,a,l,x,u,h,c+1),_t(i,x,u,y,f,o,s,h,c+1)}function Ye(i,e){const t=1-i;return t*t*e}function Je(i,e){return 2*(1-i)*i*e}function Ke(i,e){return i*i*e}function Dt(i,e,t,n){return Ye(i,e)+Je(i,t)+Ke(i,n)}const tn=1e-4,Yt=1e-4;function Jt(i,e={}){const{vertices:t=[],indices:n=[],lineStyle:r={alignment:.5,cap:"butt",join:"miter",width:1,miterLimit:10},flipAlignment:o=!1,closed:s=!0}=e,h=tn;if(i.length===0)return{vertices:t,indices:n};const c=r;let a=c.alignment;if(r.alignment!==.5){let $=en(i);o&&($*=-1),a=(a-.5)*$+.5}const l={x:i[0],y:i[1]},y={x:i[i.length-2],y:i[i.length-1]},f=s,x=Math.abs(l.x-y.x)<h&&Math.abs(l.y-y.y)<h;if(f){i=i.slice(),x&&(i.pop(),i.pop(),y.x=i[i.length-2],y.y=i[i.length-1]);const $=(l.x+y.x)*.5,W=(y.y+l.y)*.5;i.unshift($,W),i.push($,W)}const u=t,m=i.length/2;let M=i.length;const k=u.length/2,S=c.width/2,P=S*S,w=c.miterLimit*c.miterLimit;let I=i[0],E=i[1],g=i[2],d=i[3],F=0,O=0,A=-(E-d),C=I-g,D=0,q=0,B=Math.sqrt(A*A+C*C);A/=B,C/=B,A*=S,C*=S;const Me=a,T=(1-Me)*2,b=Me*2;f||(c.cap==="round"?M+=Q(I-A*(T-b)*.5,E-C*(T-b)*.5,I-A*T,E-C*T,I+A*b,E+C*b,u,!0)+2:c.cap==="square"&&(M+=Kt(I,E,A,C,T,b,!0,u))),u.push(I-A*T,E-C*T),u.push(I+A*b,E+C*b);for(let $=1;$<m-1;++$){I=i[($-1)*2],E=i[($-1)*2+1],g=i[$*2],d=i[$*2+1],F=i[($+1)*2],O=i[($+1)*2+1],A=-(E-d),C=I-g,B=Math.sqrt(A*A+C*C),A/=B,C/=B,A*=S,C*=S,D=-(d-O),q=g-F,B=Math.sqrt(D*D+q*q),D/=B,q/=B,D*=S,q*=S;const W=g-I,ut=E-d,yt=g-F,ft=O-d,Pe=W*yt+ut*ft,vt=ut*yt-ft*W,xt=vt<0;if(Math.abs(vt)<.001*Math.abs(Pe)){u.push(g-A*T,d-C*T),u.push(g+A*b,d+C*b),Pe>=0&&(c.join==="round"?M+=Q(g,d,g-A*T,d-C*T,g-D*T,d-q*T,u,!1)+4:M+=2,u.push(g-D*b,d-q*b),u.push(g+D*T,d+q*T));continue}const we=(-A+I)*(-C+d)-(-A+g)*(-C+E),ve=(-D+F)*(-q+d)-(-D+g)*(-q+O),Tt=(W*ve-yt*we)/vt,At=(ft*we-ut*ve)/vt,Rt=(Tt-g)*(Tt-g)+(At-d)*(At-d),J=g+(Tt-g)*T,K=d+(At-d)*T,tt=g-(Tt-g)*b,et=d-(At-d)*b,In=Math.min(W*W+ut*ut,yt*yt+ft*ft),Te=xt?T:b,Sn=In+Te*Te*P;Rt<=Sn?c.join==="bevel"||Rt/P>w?(xt?(u.push(J,K),u.push(g+A*b,d+C*b),u.push(J,K),u.push(g+D*b,d+q*b)):(u.push(g-A*T,d-C*T),u.push(tt,et),u.push(g-D*T,d-q*T),u.push(tt,et)),M+=2):c.join==="round"?xt?(u.push(J,K),u.push(g+A*b,d+C*b),M+=Q(g,d,g+A*b,d+C*b,g+D*b,d+q*b,u,!0)+4,u.push(J,K),u.push(g+D*b,d+q*b)):(u.push(g-A*T,d-C*T),u.push(tt,et),M+=Q(g,d,g-A*T,d-C*T,g-D*T,d-q*T,u,!1)+4,u.push(g-D*T,d-q*T),u.push(tt,et)):(u.push(J,K),u.push(tt,et)):(u.push(g-A*T,d-C*T),u.push(g+A*b,d+C*b),c.join==="round"?xt?M+=Q(g,d,g+A*b,d+C*b,g+D*b,d+q*b,u,!0)+2:M+=Q(g,d,g-A*T,d-C*T,g-D*T,d-q*T,u,!1)+2:c.join==="miter"&&Rt/P<=w&&(xt?(u.push(tt,et),u.push(tt,et)):(u.push(J,K),u.push(J,K)),M+=2),u.push(g-D*T,d-q*T),u.push(g+D*b,d+q*b),M+=2)}I=i[(m-2)*2],E=i[(m-2)*2+1],g=i[(m-1)*2],d=i[(m-1)*2+1],A=-(E-d),C=I-g,B=Math.sqrt(A*A+C*C),A/=B,C/=B,A*=S,C*=S,u.push(g-A*T,d-C*T),u.push(g+A*b,d+C*b),f||(c.cap==="round"?M+=Q(g-A*(T-b)*.5,d-C*(T-b)*.5,g-A*T,d-C*T,g+A*b,d+C*b,u,!1)+2:c.cap==="square"&&(M+=Kt(g,d,A,C,T,b,!1,u)));const kn=Yt*Yt;for(let $=k;$<M+k-2;++$)I=u[$*2],E=u[$*2+1],g=u[($+1)*2],d=u[($+1)*2+1],F=u[($+2)*2],O=u[($+2)*2+1],!(Math.abs(I*(d-O)+g*(O-E)+F*(E-d))<kn)&&n.push($,$+1,$+2);return{vertices:t,indices:n}}function en(i){const e=i.length;if(e<6)return 1;let t=0;for(let n=0,r=i[e-2],o=i[e-1];n<e;n+=2){const s=i[n],h=i[n+1];t+=(s-r)*(h+o),r=s,o=h}return t<0?-1:1}function Kt(i,e,t,n,r,o,s,h){const c=i-t*r,a=e-n*r,l=i+t*o,y=e+n*o;let f,x;s?(f=n,x=-t):(f=-n,x=t);const u=c+f,m=a+x,M=l+f,k=y+x;return h.push(u,m),h.push(M,k),2}function Q(i,e,t,n,r,o,s,h){const c=t-i,a=n-e;let l=Math.atan2(c,a),y=Math.atan2(r-i,o-e);h&&l<y?l+=Math.PI*2:!h&&l>y&&(y+=Math.PI*2);let f=l;const x=y-l,u=Math.abs(x),m=Math.sqrt(c*c+a*a),M=(15*u*Math.sqrt(m)/Math.PI>>0)+1,k=x/M;if(f+=k,h){s.push(i,e),s.push(t,n);for(let S=1,P=f;S<M;S++,P+=k)s.push(i,e),s.push(i+Math.sin(P)*m,e+Math.cos(P)*m);s.push(i,e),s.push(r,o)}else{s.push(t,n),s.push(i,e);for(let S=1,P=f;S<M;S++,P+=k)s.push(i+Math.sin(P)*m,e+Math.cos(P)*m),s.push(i,e);s.push(r,o),s.push(i,e)}return M*2}class Y{constructor(){X(this,"arcLengthDivision",200);X(this,"_arcLengths")}getPointAt(e,t=new p){return this.getPoint(this.getUToTMapping(e),t)}isClockwise(){const e=this.getPoint(1),t=this.getPoint(.5),n=this.getPoint(1);return(t.x-e.x)*(n.y-t.y)-(t.y-e.y)*(n.x-t.x)<0}getControlPointRefs(){return[]}applyTransform(e){return this.getControlPointRefs().forEach(t=>{t.applyMatrix3(e)}),this}getUnevenPointArray(e=5,t=[]){const n=new p;for(let r=0,o=Math.max(1,e)-1;r<=o;r++)this.getPoint(r/o,n),t.push(n.x,n.y);return t}getSpacedPointArray(e=5,t=[]){const n=new p;for(let r=0,o=Math.max(1,e)-1;r<=o;r++)this.getPointAt(r/o,n),t.push(n.x,n.y);return t}getAdaptivePointArray(e=[]){return this.getUnevenPointArray(5,e)}_pointArrayToPoint(e,t=[]){for(let n=0,r=e.length;n<r;n+=2){const o=e[n],s=e[n+1];t.push(new p(o,s))}return t}getSpacedPoints(e,t=[]){const n=this.getSpacedPointArray(e);return this._pointArrayToPoint(n,t),t}getUnevenPoints(e,t=[]){const n=this.getUnevenPointArray(e);return this._pointArrayToPoint(n,t),t}getAdaptivePoints(e=[]){const t=this.getAdaptivePointArray();return this._pointArrayToPoint(t,e),e}getPoints(e,t=[]){let n;return e?n=this.getUnevenPointArray(e):n=this.getAdaptivePointArray(),this._pointArrayToPoint(n,t),t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(){return(!this._arcLengths||this._arcLengths.length!==this.arcLengthDivision+1)&&this.updateLengths(),this._arcLengths}updateLengths(){const e=this.arcLengthDivision,t=[0];for(let n=0,r=this.getPoint(0),o=1;o<=e;o++){const s=this.getPoint(o/e);n+=s.distanceTo(r),t.push(n),r=s}this._arcLengths=t}getUToTMapping(e,t){const n=this.getLengths(),r=n.length,o=t??e*n[r-1];if(r<2)return o/n[0];let s=0,h=0,c=r-1,a;for(;h<=c;)if(s=Math.floor(h+(c-h)/2),a=n[s]-o,a<0)h=s+1;else if(a>0)c=s-1;else{c=s;break}if(s=c,n[s]===o)return s/(r-1);const l=n[s],f=n[s+1]-l,x=(o-l)/f;return(s+x)/(r-1)}getTangent(e,t=new p){const r=Math.max(0,e-1e-4),o=Math.min(1,e+1e-4);return t.copy(this.getPoint(o).sub(this.getPoint(r)).normalize())}getTangentAt(e,t){return this.getTangent(this.getUToTMapping(e),t)}getNormal(e,t=new p){return this.getTangent(e,t),t.set(-t.y,t.x).normalize()}getNormalAt(e,t){return this.getNormal(this.getUToTMapping(e),t)}getTForPoint(e,t=.001){let n=0,r=1,o=(n+r)/2;for(;r-n>t;){o=(n+r)/2;const s=this.getPoint(o);if(s.distanceTo(e)<t)return o;s.x<e.x?n=o:r=o}return o}getMinMax(e=p.MAX,t=p.MIN){const n=this.getPoints();for(let r=0,o=n.length;r<o;r++){const s=n[r];e.min(s),t.max(s)}return{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new V(e.x,e.y,t.x-e.x,t.y-e.y)}fillTriangulate(e){return Wt(this.getAdaptivePointArray(),e)}strokeTriangulate(e){return Jt(this.getAdaptivePointArray(),e)}toTriangulatedSVGString(e=this.fillTriangulate(),t=0){const{vertices:n,indices:r}=e,o={x:-t,y:-t},s={x:t,y:t},h=l=>{const y=n[l*2],f=n[l*2+1];return o.x=Math.min(o.x,y+t),s.x=Math.max(s.x,y+t),o.y=Math.min(o.y,f+t),s.y=Math.max(s.y,f+t),[y,f]};let c="";for(let l=0,y=r.length;l<y;l+=3){const f=h(r[l]),x=h(r[l+1]),u=h(r[l+2]);c+=`<polygon points="${f.join(",")} ${x.join(",")} ${u.join(",")}" fill="none" stroke="black" />`}const a=[o.x,o.y,s.x-o.x,s.y-o.y];return`<svg width="${a[2]}" height="${a[3]}" viewBox="${a.join(" ")}" xmlns="http://www.w3.org/2000/svg">${c}</svg>`}toTriangulatedSVG(e,t){return new DOMParser().parseFromString(this.toTriangulatedSVGString(e,t),"image/svg+xml").documentElement}toCommands(){const e=[],t=this.getPoints();for(let n=0,r=t.length;n<r;n++){const o=t[n];n===0?e.push({type:"M",x:o.x,y:o.y}):e.push({type:"L",x:o.x,y:o.y})}return e}toData(){return Gt(this.toCommands())}drawTo(e){return this.toCommands().forEach(t=>{switch(t.type){case"M":e.moveTo(t.x,t.y);break;case"L":e.lineTo(t.x,t.y);break}}),this}copy(e){return this.arcLengthDivision=e.arcLengthDivision,this}clone(){return new this.constructor().copy(this)}}const nn=new z,te=new z,ee=new z,mt=new p;class qt extends Y{constructor(e=new p,t=new p,n=new p,r=0,o=0,s=Math.PI*2,h=!1){super(),this._center=e,this._radius=t,this._diff=n,this.rotate=r,this.startAngle=o,this.endAngle=s,this.clockwise=h}get cx(){return this._center.x}set cx(e){this._center.x=e}get cy(){return this._center.y}set cy(e){this._center.y=e}get rx(){return this._radius.x}set rx(e){this._radius.x=e}get ry(){return this._radius.y}set ry(e){this._radius.y=e}get dx(){return this._diff.x}set dx(e){this._diff.x=e}get dy(){return this._diff.y}set dy(e){this._diff.y=e}isClockwise(){return this.clockwise}_getDeltaAngle(){const e=Math.PI*2;let t=this.endAngle-this.startAngle;const n=Math.abs(t)<Number.EPSILON;return t=(t%e+e)%e,n?t=0:this.clockwise||(t=t===0?-e:t-e),t}getPoint(e,t=new p){const n=this._getDeltaAngle(),r=this.startAngle+e*n;let o=this.cx+this.rx*Math.cos(r),s=this.cy+this.ry*Math.sin(r);if(this.rotate!==0){const h=Math.cos(this.rotate),c=Math.sin(this.rotate),a=o-this.cx,l=s-this.cy;o=a*h-l*c+this.cx,s=a*c+l*h+this.cy}return t.set(o,s)}toCommands(){const{cx:e,cy:t,rx:n,ry:r,startAngle:o,endAngle:s,clockwise:h,rotate:c}=this,a=e+n*Math.cos(o)*Math.cos(c)-r*Math.sin(o)*Math.sin(c),l=t+n*Math.cos(o)*Math.sin(c)+r*Math.sin(o)*Math.cos(c),y=Math.abs(o-s),f=y>Math.PI?1:0,x=h?1:0,u=c*180/Math.PI;if(y>=2*Math.PI){const m=o+Math.PI,M=e+n*Math.cos(m)*Math.cos(c)-r*Math.sin(m)*Math.sin(c),k=t+n*Math.cos(m)*Math.sin(c)+r*Math.sin(m)*Math.cos(c);return[{type:"M",x:a,y:l},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:0,sweepFlag:x,x:M,y:k},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:0,sweepFlag:x,x:a,y:l}]}else{const m=e+n*Math.cos(s)*Math.cos(c)-r*Math.sin(s)*Math.sin(c),M=t+n*Math.cos(s)*Math.sin(c)+r*Math.sin(s)*Math.cos(c);return[{type:"M",x:a,y:l},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:f,sweepFlag:x,x:m,y:M}]}}drawTo(e){const{cx:t,cy:n,rx:r,ry:o,rotate:s,startAngle:h,endAngle:c,clockwise:a}=this;return e.ellipse(t,n,r,o,s,h,c,!a),this}applyTransform(e){return mt.set(this.cx,this.cy),mt.applyMatrix3(e),this.cx=mt.x,this.cy=mt.y,on(e)?sn(this,e):rn(this,e),this}getControlPointRefs(){return[this._center]}getAdaptivePointArray(e=[]){const{cx:t,cy:n,rx:r,ry:o,dx:s,dy:h,startAngle:c}=this;if(!(r>=0&&o>=0&&s>=0&&h>=0))return e;const a=Math.PI*2,l=this._getDeltaAngle(),y=Math.abs(l)/a,f=Math.ceil(2.3*Math.sqrt(r+o)*y),x=[];for(let u=0;u<=f;u++){const m=u/f,M=c+m*l,k=t+s+Math.cos(M)*r,S=n+h+Math.sin(M)*o;x.push(k,S)}return Array.prototype.push.apply(e,x),e}fillTriangulate(e={}){let{vertices:t=[],indices:n=[],verticesStride:r=2,verticesOffset:o=0,indicesOffset:s=0}=e;const h=this.getAdaptivePointArray();if(h.length===0)return{vertices:t,indices:n};let c=0,a=0;for(let f=0;f<h.length;f+=2)c+=h[f],a+=h[f+1];c/=h.length/2,a/=h.length/2;let l=o;t[l*r]=c,t[l*r+1]=a;const y=l++;for(let f=0;f<h.length;f+=2)t[l*r]=h[f],t[l*r+1]=h[f+1],f>0&&(n[s++]=l,n[s++]=y,n[s++]=l-1),l++;return n[s++]=y+1,n[s++]=y,n[s++]=l-1,{vertices:t,indices:n}}getMinMax(e=p.MAX,t=p.MIN){const{cx:n,cy:r,rx:o,ry:s,rotate:h}=this,c=Math.cos(h),a=Math.sin(h),l=Math.sqrt(o*o*c*c+s*s*a*a),y=Math.sqrt(o*o*a*a+s*s*c*c);return e.x=Math.min(e.x,n-l),e.y=Math.min(e.y,r-y),t.x=Math.max(t.x,n+l),t.y=Math.max(t.y,r+y),{min:e,max:t}}copy(e){return super.copy(e),this.cx=e.cx,this.cy=e.cy,this.rx=e.rx,this.ry=e.ry,this.dx=e.dx,this.dy=e.dy,this.startAngle=e.startAngle,this.endAngle=e.endAngle,this.clockwise=e.clockwise,this.rotate=e.rotate,this}}function sn(i,e){const t=i.rx,n=i.ry,r=Math.cos(i.rotate),o=Math.sin(i.rotate),s=new p(t*r,t*o),h=new p(-n*o,n*r),c=s.applyMatrix3(e),a=h.applyMatrix3(e),l=nn.set(c.x,a.x,0,c.y,a.y,0,0,0,1),y=te.copy(l).invert(),u=ee.copy(y).transpose().multiply(y).elements,m=cn(u[0],u[1],u[4]),M=Math.sqrt(m.rt1),k=Math.sqrt(m.rt2);if(i.rx=1/M,i.ry=1/k,i.rotate=Math.atan2(m.sn,m.cs),!((i.endAngle-i.startAngle)%(2*Math.PI)<Number.EPSILON)){const P=te.set(M,0,0,0,k,0,0,0,1),w=ee.set(m.cs,m.sn,0,-m.sn,m.cs,0,0,0,1),I=P.multiply(w).multiply(l),E=g=>{const{x:d,y:F}=new p(Math.cos(g),Math.sin(g)).applyMatrix3(I);return Math.atan2(F,d)};i.startAngle=E(i.startAngle),i.endAngle=E(i.endAngle),ne(e)&&(i.clockwise=!i.clockwise)}}function rn(i,e){const t=se(e),n=ie(e);i.rx*=t,i.ry*=n;const r=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);i.rotate+=r,ne(e)&&(i.startAngle*=-1,i.endAngle*=-1,i.clockwise=!i.clockwise)}function ne(i){const e=i.elements;return e[0]*e[4]-e[1]*e[3]<0}function on(i){const e=i.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const n=se(i),r=ie(i);return Math.abs(t/(n*r))>Number.EPSILON}function se(i){const e=i.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function ie(i){const e=i.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function cn(i,e,t){let n,r,o,s,h;const c=i+t,a=i-t,l=Math.sqrt(a*a+4*e*e);return c>0?(n=.5*(c+l),h=1/n,r=i*h*t-e*h*e):c<0?r=.5*(c-l):(n=.5*l,r=-.5*l),a>0?o=a+l:o=a-l,Math.abs(o)>2*Math.abs(e)?(h=-2*e/o,s=1/Math.sqrt(1+h*h),o=h*s):Math.abs(e)===0?(o=1,s=0):(h=-.5*o/e,o=1/Math.sqrt(1+h*h),s=h*o),a>0&&(h=o,o=-s,s=h),{rt1:n,rt2:r,cs:o,sn:s}}class re extends qt{constructor(e=0,t=0,n=1,r=0,o=Math.PI*2,s=!1){super(new p(e,t),new p(n,n),new p(0,0),0,r,o,s)}drawTo(e){const{cx:t,cy:n,rx:r,startAngle:o,endAngle:s,clockwise:h}=this;return e.arc(t,n,r,o,s,!h),this}getAdaptivePointArray(e=[]){const{cx:t,cy:n,rx:r,startAngle:o,endAngle:s,clockwise:h}=this;let c=Math.abs(o-s);(!h&&o>s||h&&s>o)&&(c=2*Math.PI-c);let a=Math.max(6,Math.floor(6*r**(1/3)*(c/Math.PI)));a=Math.max(a,3);let l=c/a,y=o;l*=h?1:-1;for(let f=0;f<a+1;f++){const x=Math.cos(y),u=Math.sin(y),m=t+x*r,M=n+u*r;e.push(m,M),y+=l}return e}}class rt extends Y{constructor(e=[]){super(),this.curves=e}getFlatCurves(){return this.curves.flatMap(e=>e instanceof rt?e.getFlatCurves():e)}addCurve(e){return this.curves.push(e),this}getPoint(e,t=new p){const n=e*this.getLength(),r=this.getLengths();let o=0;for(;o<r.length;){if(r[o]>=n){const s=r[o]-n,h=this.curves[o],c=h.getLength();return h.getPointAt(c===0?0:1-s/c,t)}o++}return t}updateLengths(){const e=[];for(let t=0,n=0,r=this.curves.length;t<r;t++)n+=this.curves[t].getLength(),e.push(n);this._arcLengths=e}getControlPointRefs(){return this.curves.flatMap(e=>e.getControlPointRefs())}_removeNextPointIfEqualPrevPoint(e,t){return e[t-1]===e[t+1]&&e[t]===e[t+2]&&e.splice(t+1,2),e}getSpacedPointArray(e=5,t=[]){let n;return this.curves.forEach(r=>{r.getSpacedPointArray(e,t),n&&this._removeNextPointIfEqualPrevPoint(t,n),n=t.length-1}),t}getAdaptivePointArray(e=[]){let t;return this.curves.forEach(n=>{n.getAdaptivePointArray(e),t&&this._removeNextPointIfEqualPrevPoint(e,t),t=e.length-1}),e}applyTransform(e){return this.curves.forEach(t=>t.applyTransform(e)),this}getMinMax(e=p.MAX,t=p.MIN){return this.curves.forEach(n=>n.getMinMax(e,t)),{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new V(e.x,e.y,t.x-e.x,t.y-e.y)}toCommands(){return this.curves.flatMap(e=>e.toCommands())}drawTo(e){var n;const t=(n=this.curves[0])==null?void 0:n.getPoint(0);return t&&e.moveTo(t.x,t.y),this.curves.forEach(r=>r.drawTo(e)),this}copy(e){return super.copy(e),this.curves=e.curves.map(t=>t.clone()),this}}class Mt extends Y{constructor(e=new p,t=new p,n=new p,r=new p){super(),this.p1=e,this.cp1=t,this.cp2=n,this.p2=r}static from(e,t,n,r,o,s,h,c){return new Mt(new p(e,t),new p(n,r),new p(o,s),new p(h,c))}getPoint(e,t=new p){const{p1:n,cp1:r,cp2:o,p2:s}=this;return t.set(Et(e,n.x,r.x,o.x,s.x),Et(e,n.y,r.y,o.y,s.y))}getAdaptivePointArray(e=[]){return Ht(this.p1.x,this.p1.y,this.cp1.x,this.cp1.y,this.cp2.x,this.cp2.y,this.p2.x,this.p2.y,.5,e)}getControlPointRefs(){return[this.p1,this.cp1,this.cp2,this.p2]}_solveQuadratic(e,t,n){const r=t*t-4*e*n;if(r<0)return[];const o=Math.sqrt(r),s=(-t+o)/(2*e),h=(-t-o)/(2*e);return[s,h].filter(c=>c>=0&&c<=1)}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,cp1:r,cp2:o,p2:s}=this,h=this._solveQuadratic(3*(r.x-n.x),6*(o.x-r.x),3*(s.x-o.x)),c=this._solveQuadratic(3*(r.y-n.y),6*(o.y-r.y),3*(s.y-o.y)),a=[0,1,...h,...c];return((y,f)=>{for(const x of y)for(let u=0;u<=f;u++){const m=u/f-.5,M=Math.min(1,Math.max(0,x+m)),k=this.getPoint(M);e.x=Math.min(e.x,k.x),e.y=Math.min(e.y,k.y),t.x=Math.max(t.x,k.x),t.y=Math.max(t.y,k.y)}})(a,10),{min:e,max:t}}toCommands(){const{p1:e,cp1:t,cp2:n,p2:r}=this;return[{type:"M",x:e.x,y:e.y},{type:"C",x1:t.x,y1:t.y,x2:n.x,y2:n.y,x:r.x,y:r.y}]}drawTo(e){const{p1:t,cp1:n,cp2:r,p2:o}=this;return e.lineTo(t.x,t.y),e.bezierCurveTo(n.x,n.y,r.x,r.y,o.x,o.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.cp1.copy(e.cp1),this.cp2.copy(e.cp2),this.p2.copy(e.p2),this}}class oe extends qt{constructor(e=0,t=0,n=1,r=1,o=0,s=0,h=Math.PI*2,c=!1){super(new p(e,t),new p(n,r),new p,o,s,h,c)}drawTo(e){return e.ellipse(this.cx,this.cy,this.rx,this.ry,this.rotate,this.startAngle,this.endAngle,!this.clockwise),this}}class j extends Y{constructor(e=new p,t=new p){super(),this.p1=e,this.p2=t}static from(e,t,n,r){return new j(new p(e,t),new p(n,r))}getPoint(e,t=new p){return e===1?t.copy(this.p2):t.copy(this.p2).sub(this.p1).scale(e).add(this.p1),t}getPointAt(e,t=new p){return this.getPoint(e,t)}getTangent(e,t=new p){return t.subVectors(this.p2,this.p1).normalize()}getTangentAt(e,t=new p){return this.getTangent(e,t)}getControlPointRefs(){return[this.p1,this.p2]}getAdaptivePointArray(e=[]){return e.push(this.p1.x,this.p1.y,this.p2.x,this.p2.y),e}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,p2:r}=this;return e.x=Math.min(e.x,n.x,r.x),e.y=Math.min(e.y,n.y,r.y),t.x=Math.max(t.x,n.x,r.x),t.y=Math.max(t.y,n.y,r.y),{min:e,max:t}}toCommands(){const{p1:e,p2:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}drawTo(e){const{p1:t,p2:n}=this;return e.lineTo(t.x,t.y),e.lineTo(n.x,n.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.p2.copy(e.p2),this}}class Ft extends rt{}class hn extends Ft{constructor(e=0,t=0,n=1,r=3){super(),this.cx=e,this.cy=t,this.radius=n,this.sideCount=r,this.update()}update(){const{cx:e,cy:t,radius:n,sideCount:r}=this,o=[];for(let h=0;h<r;h++){const c=h*2*Math.PI/r-.5*Math.PI;o.push(new p(n*Math.cos(c),n*Math.sin(c)).add({x:e,y:t}))}const s=[];for(let h=0;h<r;h++)s.push(new j(o[h],o[(h+1)%r]));return this.curves=s,this}copy(e){return super.copy(e),this.cx=e.cx,this.cy=e.cy,this.radius=e.radius,this.sideCount=e.sideCount,this.update(),this}}class Pt extends Y{constructor(e=new p,t=new p,n=new p){super(),this.p1=e,this.cp=t,this.p2=n}static from(e,t,n,r,o,s){return new Pt(new p(e,t),new p(n,r),new p(o,s))}getPoint(e,t=new p){const{p1:n,cp:r,p2:o}=this;return t.set(Dt(e,n.x,r.x,o.x),Dt(e,n.y,r.y,o.y)),t}getControlPointRefs(){return[this.p1,this.cp,this.p2]}getAdaptivePointArray(e=[]){return Qt(this.p1.x,this.p1.y,this.cp.x,this.cp.y,this.p2.x,this.p2.y,.5,e)}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,cp:r,p2:o}=this,s=.5*(n.x+r.x),h=.5*(n.y+r.y),c=.5*(n.x+o.x),a=.5*(n.y+o.y);return e.x=Math.min(e.x,n.x,o.x,s,c),e.y=Math.min(e.y,n.y,o.y,h,a),t.x=Math.max(t.x,n.x,o.x,s,c),t.y=Math.max(t.y,n.y,o.y,h,a),{min:e,max:t}}toCommands(){const{p1:e,cp:t,p2:n}=this;return[{type:"M",x:e.x,y:e.y},{type:"Q",x1:t.x,y1:t.y,x:n.x,y:n.y}]}drawTo(e){const{p1:t,cp:n,p2:r}=this;return e.lineTo(t.x,t.y),e.quadraticCurveTo(n.x,n.y,r.x,r.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.cp.copy(e.cp),this.p2.copy(e.p2),this}}class ce extends Ft{constructor(e=0,t=0,n=0,r=0){super(),this.x=e,this.y=t,this.width=n,this.height=r,this.update()}update(){const{x:e,y:t,width:n,height:r}=this,o=[new p(e,t),new p(e+n,t),new p(e+n,t+r),new p(e,t+r)];return this.curves=[new j(o[0],o[1]),new j(o[1],o[2]),new j(o[2],o[3]),new j(o[3],o[0])],this}drawTo(e){return e.rect(this.x,this.y,this.width,this.height),this}fillTriangulate(e={}){let{vertices:t=[],indices:n=[],verticesStride:r=2,verticesOffset:o=0,indicesOffset:s=0}=e;const{x:h,y:c,width:a,height:l}=this,y=[h,c,h+a,c,h+a,c+l,h,c+l];let f=0;o*=r,t[o+f]=y[0],t[o+f+1]=y[1],f+=r,t[o+f]=y[2],t[o+f+1]=y[3],f+=r,t[o+f]=y[6],t[o+f+1]=y[7],f+=r,t[o+f]=y[4],t[o+f+1]=y[5],f+=r;const x=o/r;return n[s++]=x,n[s++]=x+1,n[s++]=x+2,n[s++]=x+1,n[s++]=x+3,n[s++]=x+2,{vertices:t,indices:n}}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.update(),this}}class he extends qt{constructor(e=0,t=0,n=1,r=1,o=1){super(),this.x=e,this.y=t,this.width=n,this.height=r,this.radius=o,this.update()}update(){const{x:e,y:t,width:n,height:r,radius:o}=this,s=n/2,h=r/2,c=e+s,a=t+h,l=Math.max(0,Math.min(o,Math.min(s,h))),y=l,f=s-l,x=h-y;return this._center=new p(c,a),this._radius=new p(l,y),this._diff=new p(f,x),this}drawTo(e){const{x:t,y:n,width:r,height:o,radius:s}=this;return e.roundRect(t,n,r,o,s),this}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.radius=e.radius,this.update(),this}}class ae extends Y{constructor(e=[]){super(),this.points=e}getPoint(e,t=new p){const{points:n}=this,r=(n.length-1)*e,o=Math.floor(r),s=r-o,h=n[o===0?o:o-1],c=n[o],a=n[o>n.length-2?n.length-1:o+1],l=n[o>n.length-3?n.length-1:o+2];return t.set(St(s,h.x,c.x,a.x,l.x),St(s,h.y,c.y,a.y,l.y)),t}getControlPointRefs(){return this.points}copy(e){super.copy(e),this.points=[];for(let t=0,n=e.points.length;t<n;t++)this.points.push(e.points[t].clone());return this}}class lt extends rt{constructor(t){super();X(this,"startPoint");X(this,"currentPoint");X(this,"autoClose",!1);t&&this.addPoints(t)}addPoints(t){this.moveTo(t[0].x,t[0].y);for(let n=1,r=t.length;n<r;n++){const{x:o,y:s}=t[n];this.lineTo(o,s)}return this}addCommands(t){return kt(t,this),this}addData(t){return this.addCommands(It(t)),this}_closePointArray(t){return this.autoClose&&t.length>=4&&t[0]!==t[t.length-2]&&t[1]!==t[t.length-1]&&t.push(t[0],t[1]),t}getUnevenPointArray(t=40,n=[]){return this._closePointArray(super.getUnevenPointArray(t,n))}getSpacedPointArray(t=40,n=[]){return this._closePointArray(super.getSpacedPointArray(t,n))}getAdaptivePointArray(t=[]){return this._closePointArray(super.getAdaptivePointArray(t))}_setCurrentPoint(t){return this.currentPoint=new p(t.x,t.y),this.startPoint||(this.startPoint=this.currentPoint.clone()),this}_connetLineTo(t){if(this.curves.length>0){const n=t.getPoint(0);(!this.currentPoint||!n.equals(this.currentPoint))&&this.lineTo(n.x,n.y)}return this}closePath(){const t=this.startPoint;if(t){const n=this.currentPoint;n&&!t.equals(n)&&(this.curves.push(new j(n.clone(),t.clone())),n.copy(t)),this.startPoint=void 0}return this}moveTo(t,n){return this.currentPoint=new p(t,n),this.startPoint=this.currentPoint.clone(),this}lineTo(t,n){const r=this.currentPoint;return r!=null&&r.equals({x:t,y:n})||this.curves.push(j.from((r==null?void 0:r.x)??0,(r==null?void 0:r.y)??0,t,n)),this._setCurrentPoint({x:t,y:n}),this}bezierCurveTo(t,n,r,o,s,h){const c=this.currentPoint;return c!=null&&c.equals({x:s,y:h})||this.curves.push(Mt.from((c==null?void 0:c.x)??0,(c==null?void 0:c.y)??0,t,n,r,o,s,h)),this._setCurrentPoint({x:s,y:h}),this}quadraticCurveTo(t,n,r,o){const s=this.currentPoint;return s!=null&&s.equals({x:r,y:o})||this.curves.push(Pt.from((s==null?void 0:s.x)??0,(s==null?void 0:s.y)??0,t,n,r,o)),this._setCurrentPoint({x:r,y:o}),this}arc(t,n,r,o,s,h){const c=new re(t,n,r,o,s,!h);return this._connetLineTo(c),this.curves.push(c),this._setCurrentPoint(c.getPoint(1)),this}relativeArc(t,n,r,o,s,h){var c,a;return t+=((c=this.currentPoint)==null?void 0:c.x)??0,n+=((a=this.currentPoint)==null?void 0:a.y)??0,this.arc(t,n,r,o,s,h),this}arcTo(t,n,r,o,s){return console.warn("Method arcTo not supported yet"),this}ellipse(t,n,r,o,s,h,c,a=!0){const l=new oe(t,n,r,o,s,h,c,!a);return this._connetLineTo(l),this.curves.push(l),this._setCurrentPoint(l.getPoint(1)),this}relativeEllipse(t,n,r,o,s,h,c,a){var l,y;return t+=((l=this.currentPoint)==null?void 0:l.x)??0,n+=((y=this.currentPoint)==null?void 0:y.y)??0,this.ellipse(t,n,r,o,s,h,c,a),this}rect(t,n,r,o){const s=new ce(t,n,r,o);return this._connetLineTo(s),this.curves.push(s),this._setCurrentPoint({x:t,y:n}),this}roundRect(t,n,r,o,s){const h=new he(t,n,r,o,s);return this._connetLineTo(h),this.curves.push(h),this._setCurrentPoint({x:t,y:n}),this}splineThru(t){const n=this.currentPoint??new p;return this.curves.push(new ae([n].concat(t))),this._setCurrentPoint(t[t.length-1]),this}drawTo(t){var r;const n=(r=this.curves[0])==null?void 0:r.getPoint(0);return n&&t.moveTo(n.x,n.y),this.curves.forEach(o=>o.drawTo(t)),this.autoClose&&t.closePath(),this}copy(t){var n;return super.copy(t),this.autoClose=t.autoClose,this.currentPoint=(n=t.currentPoint)==null?void 0:n.clone(),this}}function an(i){return i.replace(/[^a-z0-9]/gi,"-").replace(/\B([A-Z])/g,"-$1").toLowerCase()}function ln(i,e,t,n){const r=e.clone().sub(i),o=n.clone().sub(t),s=t.clone().sub(i),h=r.cross(o);if(h===0)return new p((i.x+t.x)/2,(i.y+t.y)/2);const c=s.cross(o)/h;return Math.abs(c)>1?new p((i.x+t.x)/2,(i.y+t.y)/2):new p(i.x+c*r.x,i.y+c*r.y)}class G extends rt{constructor(t,n={}){super();X(this,"currentCurve",new lt);X(this,"style");this.curves.push(this.currentCurve),this.style=n,t&&(t instanceof G?this.addPath(t):Array.isArray(t)?this.addCommands(t):this.addData(t))}get startPoint(){return this.currentCurve.startPoint}get currentPoint(){return this.currentCurve.currentPoint}get strokeWidth(){return this.style.strokeWidth??((this.style.stroke??"none")==="none"?0:1)}addPath(t){const n=this.curves.findIndex(r=>r===this.currentCurve);return n>-1&&this.curves.splice(n,1),t instanceof G?this.curves.push(...t.curves.filter(r=>r.curves.length).map(r=>r.clone())):t.curves.length&&this.curves.push(t),this.curves.push(this.currentCurve),this}closePath(){const t=this.startPoint;return t&&(this.currentCurve.closePath(),this.currentCurve.curves.length&&(this.currentCurve=new lt().moveTo(t.x,t.y),this.curves.push(this.currentCurve))),this}moveTo(t,n){var r;return(r=this.currentCurve.currentPoint)!=null&&r.equals({x:t,y:n})||(this.currentCurve.curves.length&&(this.currentCurve=new lt,this.curves.push(this.currentCurve)),this.currentCurve.moveTo(t,n)),this}lineTo(t,n){return this.currentCurve.lineTo(t,n),this}bezierCurveTo(t,n,r,o,s,h){return this.currentCurve.bezierCurveTo(t,n,r,o,s,h),this}quadraticCurveTo(t,n,r,o){return this.currentCurve.quadraticCurveTo(t,n,r,o),this}arc(t,n,r,o,s,h){return this.currentCurve.arc(t,n,r,o,s,h),this}arcTo(t,n,r,o,s){return this.currentCurve.arcTo(t,n,r,o,s),this}ellipse(t,n,r,o,s,h,c,a){return this.currentCurve.ellipse(t,n,r,o,s,h,c,a),this}rect(t,n,r,o){return this.currentCurve.rect(t,n,r,o),this}roundRect(t,n,r,o,s){return this.currentCurve.roundRect(t,n,r,o,s),this}reset(){return this.currentCurve=new lt,this.curves=[this.currentCurve],this.style={},this}addCommands(t){return kt(t,this),this}addData(t){return this.addCommands(It(t)),this}splineThru(t){return this.currentCurve.splineThru(t),this}scale(t,n=t,r={x:0,y:0}){return this.getControlPointRefs().forEach(o=>{o.scale(t,n,r)}),this}skew(t,n=0,r={x:0,y:0}){return this.getControlPointRefs().forEach(o=>{o.skew(t,n,r)}),this}rotate(t,n={x:0,y:0}){return this.getControlPointRefs().forEach(r=>{r.rotate(t,n)}),this}bold(t){if(t===0)return this;const n=this.getFlatCurves(),r=[],o=[],s=[];n.forEach((c,a)=>{const l=c.getControlPointRefs(),y=c.isClockwise();s[a]=l,o[a]=y;const f=l[0],x=l[l.length-1]??f;r.push({start:y?x:f,end:y?f:x,index:a})});const h=[];return r.forEach((c,a)=>{h[a]=[],r.forEach((l,y)=>{var f;l.start&&c.end&&y!==a&&((f=l.start)!=null&&f.equals(c.end))&&h[a].push(l.index)})}),n.forEach((c,a)=>{const l=o[a];s[a].forEach(y=>{y.add(c.getNormal(c.getTForPoint(y)).scale(l?t:-t))})}),h.forEach((c,a)=>{const l=s[a];c.forEach(y=>{const f=s[y],x=ln(l[l.length-1],l[l.length-2]??l[l.length-1],f[0],f[1]??f[0]);x&&(l[l.length-1].copy(x),f[0].copy(x))})}),this}getMinMax(t=p.MAX,n=p.MIN,r=!0){const o=this.strokeWidth;return this.curves.forEach(s=>{if(s.getMinMax(t,n),r&&o>1){const h=o/2,c=s.isClockwise(),a=[];for(let l=0;l<=1;l+=1/s.arcLengthDivision){const y=s.getPoint(l),f=s.getNormal(l),x=f.clone().scale(c?h:-h),u=f.clone().scale(c?-h:h);a.push(y.clone().add(x),y.clone().add(u),y.clone().add({x:h,y:0}),y.clone().add({x:-h,y:0}),y.clone().add({x:0,y:h}),y.clone().add({x:0,y:-h}),y.clone().add({x:h,y:h}),y.clone().add({x:-h,y:-h}))}t.min(...a),n.max(...a)}}),{min:t,max:n}}fillTriangulate(t){const n=(t==null?void 0:t.indices)??[],r=(t==null?void 0:t.vertices)??[];return this.curves.forEach(o=>{o.fillTriangulate({...t,indices:n,vertices:r})}),{indices:n,vertices:r}}strokeTriangulate(t){const n=(t==null?void 0:t.indices)??[],r=(t==null?void 0:t.vertices)??[];return this.curves.forEach(o=>{o.strokeTriangulate({...t,indices:n,vertices:r})}),{indices:n,vertices:r}}getBoundingBox(t=!0){const{min:n,max:r}=this.getMinMax(void 0,void 0,t);return new V(n.x,n.y,r.x-n.x,r.y-n.y)}drawTo(t,n={}){n={...this.style,...n};const{fill:r="#000",stroke:o="none"}=n;return t.beginPath(),t.save(),Ct(t,n),this.curves.forEach(s=>{s.drawTo(t)}),r!=="none"&&t.fill(),o!=="none"&&t.stroke(),t.restore(),this}drawControlPointsTo(t,n={}){n={...this.style,...n};const{fill:r="#000",stroke:o="none"}=n;return t.beginPath(),t.save(),Ct(t,n),this.getControlPointRefs().forEach(s=>{R(t,s.x,s.y,{radius:4})}),r!=="none"&&t.fill(),o!=="none"&&t.stroke(),t.restore(),this}toCommands(){return this.curves.flatMap(t=>t.toCommands())}toData(){return this.curves.filter(t=>t.curves.length).map(t=>t.toData()).join(" ")}toSVGPathString(){const t={...this.style,fill:this.style.fill??"#000",stroke:this.style.stroke??"none"},n={};for(const o in t)t[o]!==void 0&&(n[an(o)]=t[o]);Object.assign(n,{"stroke-width":`${this.strokeWidth}px`});let r="";for(const o in n)n[o]!==void 0&&(r+=`${o}:${n[o]};`);return`<path d="${this.toData()}" style="${r}"></path>`}copy(t){return super.copy(t),this.currentCurve=t.currentCurve.clone(),this.style={...t.style},this}}class le{constructor(e=[],t){this.paths=e,this.viewBox=t}getBoundingBox(e=!0){if(!this.paths.length)return;const t=p.MAX,n=p.MIN;return this.paths.forEach(r=>r.getMinMax(t,n,e)),new V(t.x,t.y,n.x-t.x,n.y-t.y)}toSVGString(){const{x:e,y:t,width:n,height:r}=this.getBoundingBox(),o=this.paths.map(s=>s.toSVGPathString()).join("");return`<svg viewBox="${e} ${t} ${n} ${r}" width="${n}px" height="${r}px" xmlns="http://www.w3.org/2000/svg">${o}</svg>`}toSVGUrl(){return`data:image/svg+xml;base64,${btoa(this.toSVGString())}`}toSVG(){return new DOMParser().parseFromString(this.toSVGString(),"image/svg+xml").documentElement}toCanvas(e={}){const{pixelRatio:t=2,...n}=e,{left:r,top:o,width:s,height:h}=this.getBoundingBox(),c=document.createElement("canvas");c.width=s*t,c.height=h*t,c.style.width=`${s}px`,c.style.height=`${h}px`;const a=c.getContext("2d");return a&&(a.scale(t,t),a.translate(-r,-o),this.paths.forEach(l=>{l.drawTo(a,n)})),c}}const ue="data:image/svg+xml;",ye=`${ue}base64,`,fe=`${ue}charset=utf8,`;function xe(i){if(typeof i=="string"){let e;i.startsWith(ye)?(i=i.substring(ye.length,i.length),e=atob(i)):i.startsWith(fe)?(i=i.substring(fe.length,i.length),e=decodeURIComponent(i)):e=i;const t=new DOMParser().parseFromString(e,"text/xml"),n=t.querySelector("parsererror");if(n)throw new Error(`${n.textContent??"parser error"}
|
|
2
|
-
${e}`);return t.documentElement}else return i}const un="px",yn=90,pe=["mm","cm","in","pt","pc","px"],ge={mm:{mm:1,cm:.1,in:1/25.4,pt:72/25.4,pc:6/25.4,px:-1},cm:{mm:10,cm:1,in:1/2.54,pt:72/2.54,pc:6/2.54,px:-1},in:{mm:25.4,cm:2.54,in:1,pt:72,pc:6,px:-1},pt:{mm:25.4/72,cm:2.54/72,in:1/72,pt:1,pc:6/72,px:-1},pc:{mm:25.4/6,cm:2.54/6,in:1/6,pt:72/6,pc:1,px:-1},px:{px:1}};function L(i){let e="px";if(typeof i=="string"||i instanceof String)for(let n=0,r=pe.length;n<r;n++){const o=pe[n];if(i.endsWith(o)){e=o,i=i.substring(0,i.length-o.length);break}}let t;return t=ge[e][un],t<0&&(t=ge[e].in*yn),t*Number.parseFloat(i)}const fn=new z,wt=new z,de=new z,me=new z;function xn(i,e,t){if(!(i.hasAttribute("transform")||i.nodeName==="use"&&(i.hasAttribute("x")||i.hasAttribute("y"))))return null;const n=pn(i);return t.length>0&&n.premultiply(t[t.length-1]),e.copy(n),t.push(n),n}function pn(i){const e=new z,t=fn;if(i.nodeName==="use"&&(i.hasAttribute("x")||i.hasAttribute("y"))&&e.translate(L(i.getAttribute("x")),L(i.getAttribute("y"))),i.hasAttribute("transform")){const n=i.getAttribute("transform").split(")");for(let r=n.length-1;r>=0;r--){const o=n[r].trim();if(o==="")continue;const s=o.indexOf("("),
|
|
1
|
+
(function(v,R){typeof exports=="object"&&typeof module<"u"?R(exports):typeof define=="function"&&define.amd?define(["exports"],R):(v=typeof globalThis<"u"?globalThis:v||self,R(v.modernPath2d={}))})(this,function(v){"use strict";var En=Object.defineProperty;var Ln=(v,R,nt)=>R in v?En(v,R,{enumerable:!0,configurable:!0,writable:!0,value:nt}):v[R]=nt;var X=(v,R,nt)=>Ln(v,typeof R!="symbol"?R+"":R,nt);function R(i,e,t,n={}){const{radius:r=1}=n;i.moveTo(e,t),i.arc(e,t,r,0,Math.PI*2)}const nt={arcs:"bevel",bevel:"bevel",miter:"miter","miter-clip":"miter",round:"round"};function Ct(i,e){const{fill:t="#000",stroke:n="none",strokeWidth:r=n==="none"?0:1,strokeLinecap:o="round",strokeLinejoin:s="miter",strokeMiterlimit:c=0,strokeDasharray:h=[],strokeDashoffset:a=0,shadowOffsetX:l=0,shadowOffsetY:y=0,shadowBlur:f=0,shadowColor:x="rgba(0, 0, 0, 0)"}=e;i.fillStyle=t,i.strokeStyle=n,i.lineWidth=r,i.lineCap=o,i.lineJoin=nt[s],i.miterLimit=c,i.setLineDash(h),i.lineDashOffset=a,i.shadowOffsetX=l,i.shadowOffsetY=y,i.shadowBlur=f,i.shadowColor=x}class p{constructor(e=0,t=0){this.x=e,this.y=t}static get MAX(){return new p(1/0,1/0)}static get MIN(){return new p(-1/0,-1/0)}get array(){return[this.x,this.y]}set(e,t){return this.x=e,this.y=t,this}add(e){return this.x+=e.x,this.y+=e.y,this}sub(e){return this.x-=e.x,this.y-=e.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}divide(e){return this.x/=e.x,this.y/=e.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}rotate(e,t={x:0,y:0}){const n=-e/180*Math.PI,r=this.x-t.x,o=-(this.y-t.y),s=Math.sin(n),c=Math.cos(n);return this.set(t.x+(r*c-o*s),t.y-(r*s+o*c)),this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y;return t*t+n*n}lengthSquared(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.lengthSquared())}scale(e,t=e,n={x:0,y:0}){const r=e<0?n.x-this.x+n.x:this.x,o=t<0?n.y-this.y+n.y:this.y;return this.x=r*Math.abs(e),this.y=o*Math.abs(t),this}skew(e,t=0,n={x:0,y:0}){const r=this.x-n.x,o=this.y-n.y;return this.x=n.x+(r+Math.tan(e)*o),this.y=n.y+(o+Math.tan(t)*r),this}min(...e){return this.x=Math.min(this.x,...e.map(t=>t.x)),this.y=Math.min(this.y,...e.map(t=>t.y)),this}max(...e){return this.x=Math.max(this.x,...e.map(t=>t.x)),this.y=Math.max(this.y,...e.map(t=>t.y)),this}normalize(){return this.scale(1/(this.length()||1))}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this}divideVectors(e,t){return this.x=e.x/t.x,this.y=e.y/t.y,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return this.x===e.x&&this.y===e.y}applyMatrix3(e){const t=this.x,n=this.y,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6],this.y=r[1]*t+r[4]*n+r[7],this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new p(this.x,this.y)}}class V{constructor(e=0,t=0,n=0,r=0){this.left=e,this.top=t,this.width=n,this.height=r}get x(){return this.left}set x(e){this.left=e}get y(){return this.top}set y(e){this.top=e}get right(){return this.left+this.width}get bottom(){return this.top+this.height}get center(){return new p((this.left+this.right)/2,(this.top+this.bottom)/2)}get array(){return[this.left,this.top,this.width,this.height]}static from(...e){if(e.length===0)return new V;if(e.length===1)return e[0].clone();const t=e[0],n=e.slice(1).reduce((r,o)=>(r.left=Math.min(r.left,o.left),r.top=Math.min(r.top,o.top),r.right=Math.max(r.right,o.right),r.bottom=Math.max(r.bottom,o.bottom),r),{left:(t==null?void 0:t.left)??0,top:(t==null?void 0:t.top)??0,right:(t==null?void 0:t.right)??0,bottom:(t==null?void 0:t.bottom)??0});return new V(n.left,n.top,n.right-n.left,n.bottom-n.top)}translate(e,t){return this.left+=e,this.top+=t,this}copy(e){return this.left=e.left,this.top=e.top,this.width=e.width,this.height=e.height,this}clone(){return new V(this.left,this.top,this.width,this.height)}}class z{constructor(e=1,t=0,n=0,r=0,o=1,s=0,c=0,h=0,a=1){X(this,"elements",[]);this.set(e,t,n,r,o,s,c,h,a)}set(e,t,n,r,o,s,c,h,a){const l=this.elements;return l[0]=e,l[1]=r,l[2]=c,l[3]=t,l[4]=o,l[5]=h,l[6]=n,l[7]=s,l[8]=a,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,r=t.elements,o=this.elements,s=n[0],c=n[3],h=n[6],a=n[1],l=n[4],y=n[7],f=n[2],x=n[5],u=n[8],d=r[0],M=r[3],b=r[6],E=r[1],P=r[4],w=r[7],S=r[2],I=r[5],g=r[8];return o[0]=s*d+c*E+h*S,o[3]=s*M+c*P+h*I,o[6]=s*b+c*w+h*g,o[1]=a*d+l*E+y*S,o[4]=a*M+l*P+y*I,o[7]=a*b+l*w+y*g,o[2]=f*d+x*E+u*S,o[5]=f*M+x*P+u*I,o[8]=f*b+x*w+u*g,this}invert(){const e=this.elements,t=e[0],n=e[1],r=e[2],o=e[3],s=e[4],c=e[5],h=e[6],a=e[7],l=e[8],y=l*s-c*a,f=c*h-l*o,x=a*o-s*h,u=t*y+n*f+r*x;if(u===0)return this.set(0,0,0,0,0,0,0,0,0);const d=1/u;return e[0]=y*d,e[1]=(r*a-l*n)*d,e[2]=(c*n-r*s)*d,e[3]=f*d,e[4]=(l*t-r*h)*d,e[5]=(r*o-c*t)*d,e[6]=x*d,e[7]=(n*h-a*t)*d,e[8]=(s*t-n*o)*d,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}scale(e,t){return this.premultiply(bt.makeScale(e,t)),this}rotate(e){return this.premultiply(bt.makeRotation(-e)),this}translate(e,t){return this.premultiply(bt.makeTranslation(e,t)),this}makeTranslation(e,t){return this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}clone(){return new this.constructor().fromArray(this.elements)}}const bt=new z;function Zt(i,e,t,n){const r=i*t+e*n,o=Math.sqrt(i*i+e*e)*Math.sqrt(t*t+n*n);let s=Math.acos(Math.max(-1,Math.min(1,r/o)));return i*n-e*t<0&&(s=-s),s}function jt(i,e,t,n,r,o,s,c){if(e===0||t===0){i.lineTo(c.x,c.y);return}n=n*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const h=(s.x-c.x)/2,a=(s.y-c.y)/2,l=Math.cos(n)*h+Math.sin(n)*a,y=-Math.sin(n)*h+Math.cos(n)*a;let f=e*e,x=t*t;const u=l*l,d=y*y,M=u/f+d/x;if(M>1){const F=Math.sqrt(M);e=F*e,t=F*t,f=e*e,x=t*t}const b=f*d+x*u,E=(f*x-b)/b;let P=Math.sqrt(Math.max(0,E));r===o&&(P=-P);const w=P*e*y/t,S=-P*t*l/e,I=Math.cos(n)*w-Math.sin(n)*S+(s.x+c.x)/2,g=Math.sin(n)*w+Math.cos(n)*S+(s.y+c.y)/2,m=Zt(1,0,(l-w)/e,(y-S)/t),q=Zt((l-w)/e,(y-S)/t,(-l-w)/e,(-y-S)/t)%(Math.PI*2);i.ellipse(I,g,e,t,n,m,m+q,o===0)}const D={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function Z(i,e,t=0){let c=0,h=!0,a="",l="";const y=[];function f(M,b,E){const P=new SyntaxError(`Unexpected character "${M}" at index ${b}.`);throw P.partial=E,P}function x(){a!==""&&(l===""?y.push(Number(a)):y.push(Number(a)*10**Number(l))),a="",l=""}let u;const d=i.length;for(let M=0;M<d;M++){if(u=i[M],Array.isArray(e)&&e.includes(y.length%t)&&D.FLAGS.test(u)){c=1,a=u,x();continue}if(c===0){if(D.WHITESPACE.test(u))continue;if(D.DIGIT.test(u)||D.SIGN.test(u)){c=1,a=u;continue}if(D.POINT.test(u)){c=2,a=u;continue}D.COMMA.test(u)&&(h&&f(u,M,y),h=!0)}if(c===1){if(D.DIGIT.test(u)){a+=u;continue}if(D.POINT.test(u)){a+=u,c=2;continue}if(D.EXP.test(u)){c=3;continue}D.SIGN.test(u)&&a.length===1&&D.SIGN.test(a[0])&&f(u,M,y)}if(c===2){if(D.DIGIT.test(u)){a+=u;continue}if(D.EXP.test(u)){c=3;continue}D.POINT.test(u)&&a[a.length-1]==="."&&f(u,M,y)}if(c===3){if(D.DIGIT.test(u)){l+=u;continue}if(D.SIGN.test(u)){if(l===""){l+=u;continue}l.length===1&&D.SIGN.test(l)&&f(u,M,y)}}D.WHITESPACE.test(u)?(x(),c=0,h=!1):D.COMMA.test(u)?(x(),c=0,h=!0):D.SIGN.test(u)?(x(),c=1,a=u):D.POINT.test(u)?(x(),c=2,a=u):f(u,M,y)}return x(),y}function st(i,e){return i-(e-i)}function kt(i,e){const t=new p,n=new p;for(let r=0,o=i.length;r<o;r++){const s=i[r];if(s.type==="m"||s.type==="M")s.type==="m"?t.add(s):t.copy(s),e.moveTo(t.x,t.y),n.copy(t);else if(s.type==="h"||s.type==="H")s.type==="h"?t.x+=s.x:t.x=s.x,e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="v"||s.type==="V")s.type==="v"?t.y+=s.y:t.y=s.y,e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="l"||s.type==="L")s.type==="l"?t.add(s):t.copy(s),e.lineTo(t.x,t.y),n.copy(t);else if(s.type==="c"||s.type==="C")s.type==="c"?(e.bezierCurveTo(t.x+s.x1,t.y+s.y1,t.x+s.x2,t.y+s.y2,t.x+s.x,t.y+s.y),n.x=t.x+s.x2,n.y=t.y+s.y2,t.add(s)):(e.bezierCurveTo(s.x1,s.y1,s.x2,s.y2,s.x,s.y),n.x=s.x2,n.y=s.y2,t.copy(s));else if(s.type==="s"||s.type==="S")s.type==="s"?(e.bezierCurveTo(st(t.x,n.x),st(t.y,n.y),t.x+s.x2,t.y+s.y2,t.x+s.x,t.y+s.y),n.x=t.x+s.x2,n.y=t.y+s.y2,t.add(s)):(e.bezierCurveTo(st(t.x,n.x),st(t.y,n.y),s.x2,s.y2,s.x,s.y),n.x=s.x2,n.y=s.y2,t.copy(s));else if(s.type==="q"||s.type==="Q")s.type==="q"?(e.quadraticCurveTo(t.x+s.x1,t.y+s.y1,t.x+s.x,t.y+s.y),n.x=t.x+s.x1,n.y=t.y+s.y1,t.add(s)):(e.quadraticCurveTo(s.x1,s.y1,s.x,s.y),n.x=s.x1,n.y=s.y1,t.copy(s));else if(s.type==="t"||s.type==="T"){const c=st(t.x,n.x),h=st(t.y,n.y);n.x=c,n.y=h,s.type==="t"?(e.quadraticCurveTo(c,h,t.x+s.x,t.y+s.y),t.add(s)):(e.quadraticCurveTo(c,h,s.x,s.y),t.copy(s))}else if(s.type==="a"||s.type==="A"){const c=t.clone();if(s.type==="a"){if(s.x===0&&s.y===0)continue;t.add(s)}else{if(t.equals(s))continue;t.copy(s)}n.copy(t),jt(e,s.rx,s.ry,s.angle,s.largeArcFlag,s.sweepFlag,c,t)}else s.type==="z"||s.type==="Z"?(e.startPoint&&t.copy(e.startPoint),e.closePath()):console.warn("Unsupported commands",s)}}function Gt(i){let e,t;const n=[];for(let r=0,o=i.length;r<o;r++){const s=i[r];switch(s.type){case"m":case"M":if(s.x.toFixed(4)===(t==null?void 0:t.x.toFixed(4))&&s.y.toFixed(4)===(t==null?void 0:t.y.toFixed(4)))continue;n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y},e={x:s.x,y:s.y};break;case"h":case"H":n.push(`${s.type} ${s.x}`),t={x:s.x,y:(t==null?void 0:t.y)??0};break;case"v":case"V":n.push(`${s.type} ${s.y}`),t={x:(t==null?void 0:t.x)??0,y:s.y};break;case"l":case"L":n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"c":case"C":n.push(`${s.type} ${s.x1} ${s.y1} ${s.x2} ${s.y2} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"s":case"S":n.push(`${s.type} ${s.x2} ${s.y2} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"q":case"Q":n.push(`${s.type} ${s.x1} ${s.y1} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"t":case"T":n.push(`${s.type} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"a":case"A":n.push(`${s.type} ${s.rx} ${s.ry} ${s.angle} ${s.largeArcFlag} ${s.sweepFlag} ${s.x} ${s.y}`),t={x:s.x,y:s.y};break;case"z":case"Z":n.push(s.type),e&&(t={x:e.x,y:e.y});break}}return n.join(" ")}const Ae=/[a-df-z][^a-df-z]*/gi;function It(i){const e=[],t=i.match(Ae);if(!t)return e;for(let n=0,r=t.length;n<r;n++){const o=t[n],s=o.charAt(0),c=o.slice(1).trim();let h;switch(s){case"m":case"M":h=Z(c);for(let a=0,l=h.length;a<l;a+=2)a===0?e.push({type:s,x:h[a],y:h[a+1]}):e.push({type:s==="m"?"l":"L",x:h[a],y:h[a+1]});break;case"h":case"H":h=Z(c);for(let a=0,l=h.length;a<l;a++)e.push({type:s,x:h[a]});break;case"v":case"V":h=Z(c);for(let a=0,l=h.length;a<l;a++)e.push({type:s,y:h[a]});break;case"l":case"L":h=Z(c);for(let a=0,l=h.length;a<l;a+=2)e.push({type:s,x:h[a],y:h[a+1]});break;case"c":case"C":h=Z(c);for(let a=0,l=h.length;a<l;a+=6)e.push({type:s,x1:h[a],y1:h[a+1],x2:h[a+2],y2:h[a+3],x:h[a+4],y:h[a+5]});break;case"s":case"S":h=Z(c);for(let a=0,l=h.length;a<l;a+=4)e.push({type:s,x2:h[a],y2:h[a+1],x:h[a+2],y:h[a+3]});break;case"q":case"Q":h=Z(c);for(let a=0,l=h.length;a<l;a+=4)e.push({type:s,x1:h[a],y1:h[a+1],x:h[a+2],y:h[a+3]});break;case"t":case"T":h=Z(c);for(let a=0,l=h.length;a<l;a+=2)e.push({type:s,x:h[a],y:h[a+1]});break;case"a":case"A":h=Z(c,[3,4],7);for(let a=0,l=h.length;a<l;a+=7)e.push({type:s,rx:h[a],ry:h[a+1],angle:h[a+2],largeArcFlag:h[a+3],sweepFlag:h[a+4],x:h[a+5],y:h[a+6]});break;case"z":case"Z":e.push({type:s});break;default:console.warn(o)}}return e}function St(i,e,t,n,r){const o=(n-e)*.5,s=(r-t)*.5,c=i*i,h=i*c;return(2*t-2*n+o+s)*h+(-3*t+3*n-2*o-s)*c+o*i+t}function Ce(i,e){const t=1-i;return t*t*t*e}function be(i,e){const t=1-i;return 3*t*t*i*e}function ke(i,e){return 3*(1-i)*i*i*e}function Ie(i,e){return i*i*i*e}function Et(i,e,t,n,r){return Ce(i,e)+be(i,t)+ke(i,n)+Ie(i,r)}function Se(i,e,t=2){const n=e&&e.length,r=n?e[0]*t:i.length;let o=Bt(i,0,r,t,!0);const s=[];if(!o||o.next===o.prev)return s;let c,h,a;if(n&&(o=_e(i,e,o,t)),i.length>80*t){c=1/0,h=1/0;let l=-1/0,y=-1/0;for(let f=t;f<r;f+=t){const x=i[f],u=i[f+1];x<c&&(c=x),u<h&&(h=u),x>l&&(l=x),u>y&&(y=u)}a=Math.max(l-c,y-h),a=a!==0?32767/a:0}return ot(o,s,t,c,h,a,0),s}function Bt(i,e,t,n,r){let o;if(r===Ue(i,e,t,n)>0)for(let s=e;s<t;s+=n)o=Wt(s/n|0,i[s],i[s+1],o);else for(let s=t-n;s>=e;s-=n)o=Wt(s/n|0,i[s],i[s+1],o);return o&&it(o,o.next)&&(at(o),o=o.next),o}function H(i,e){if(!i)return i;e||(e=i);let t=i,n;do if(n=!1,!t.steiner&&(it(t,t.next)||N(t.prev,t,t.next)===0)){if(at(t),t=e=t.prev,t===t.next)break;n=!0}else t=t.next;while(n||t!==e);return e}function ot(i,e,t,n,r,o,s){if(!i)return;!s&&o&&Re(i,n,r,o);let c=i;for(;i.prev!==i.next;){const h=i.prev,a=i.next;if(o?Le(i,n,r,o):Ee(i)){e.push(h.i,i.i,a.i),at(i),i=a.next,c=a.next;continue}if(i=a,i===c){s?s===1?(i=$e(H(i),e),ot(i,e,t,n,r,o,2)):s===2&&Ne(i,e,t,n,r,o):ot(H(i),e,t,n,r,o,1);break}}}function Ee(i){const e=i.prev,t=i,n=i.next;if(N(e,t,n)>=0)return!1;const r=e.x,o=t.x,s=n.x,c=e.y,h=t.y,a=n.y,l=Math.min(r,o,s),y=Math.min(c,h,a),f=Math.max(r,o,s),x=Math.max(c,h,a);let u=n.next;for(;u!==e;){if(u.x>=l&&u.x<=f&&u.y>=y&&u.y<=x&&ct(r,c,o,h,s,a,u.x,u.y)&&N(u.prev,u,u.next)>=0)return!1;u=u.next}return!0}function Le(i,e,t,n){const r=i.prev,o=i,s=i.next;if(N(r,o,s)>=0)return!1;const c=r.x,h=o.x,a=s.x,l=r.y,y=o.y,f=s.y,x=Math.min(c,h,a),u=Math.min(l,y,f),d=Math.max(c,h,a),M=Math.max(l,y,f),b=Lt(x,u,e,t,n),E=Lt(d,M,e,t,n);let P=i.prevZ,w=i.nextZ;for(;P&&P.z>=b&&w&&w.z<=E;){if(P.x>=x&&P.x<=d&&P.y>=u&&P.y<=M&&P!==r&&P!==s&&ct(c,l,h,y,a,f,P.x,P.y)&&N(P.prev,P,P.next)>=0||(P=P.prevZ,w.x>=x&&w.x<=d&&w.y>=u&&w.y<=M&&w!==r&&w!==s&&ct(c,l,h,y,a,f,w.x,w.y)&&N(w.prev,w,w.next)>=0))return!1;w=w.nextZ}for(;P&&P.z>=b;){if(P.x>=x&&P.x<=d&&P.y>=u&&P.y<=M&&P!==r&&P!==s&&ct(c,l,h,y,a,f,P.x,P.y)&&N(P.prev,P,P.next)>=0)return!1;P=P.prevZ}for(;w&&w.z<=E;){if(w.x>=x&&w.x<=d&&w.y>=u&&w.y<=M&&w!==r&&w!==s&&ct(c,l,h,y,a,f,w.x,w.y)&&N(w.prev,w,w.next)>=0)return!1;w=w.nextZ}return!0}function $e(i,e){let t=i;do{const n=t.prev,r=t.next.next;!it(n,r)&&Vt(n,t,t.next,r)&&ht(n,r)&&ht(r,n)&&(e.push(n.i,t.i,r.i),at(t),at(t.next),t=i=r),t=t.next}while(t!==i);return H(t)}function Ne(i,e,t,n,r,o){let s=i;do{let c=s.next.next;for(;c!==s.prev;){if(s.i!==c.i&&je(s,c)){let h=Xt(s,c);s=H(s,s.next),h=H(h,h.next),ot(s,e,t,n,r,o,0),ot(h,e,t,n,r,o,0);return}c=c.next}s=s.next}while(s!==i)}function _e(i,e,t,n){const r=[];for(let o=0,s=e.length;o<s;o++){const c=e[o]*n,h=o<s-1?e[o+1]*n:i.length,a=Bt(i,c,h,n,!1);a===a.next&&(a.steiner=!0),r.push(Ze(a))}r.sort(De);for(let o=0;o<r.length;o++)t=qe(r[o],t);return t}function De(i,e){let t=i.x-e.x;if(t===0&&(t=i.y-e.y,t===0)){const n=(i.next.y-i.y)/(i.next.x-i.x),r=(e.next.y-e.y)/(e.next.x-e.x);t=n-r}return t}function qe(i,e){const t=Fe(i,e);if(!t)return e;const n=Xt(t,i);return H(n,n.next),H(t,t.next)}function Fe(i,e){let t=e;const n=i.x,r=i.y;let o=-1/0,s;if(it(i,t))return t;do{if(it(i,t.next))return t.next;if(r<=t.y&&r>=t.next.y&&t.next.y!==t.y){const y=t.x+(r-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(y<=n&&y>o&&(o=y,s=t.x<t.next.x?t:t.next,y===n))return s}t=t.next}while(t!==e);if(!s)return null;const c=s,h=s.x,a=s.y;let l=1/0;t=s;do{if(n>=t.x&&t.x>=h&&n!==t.x&&Ut(r<a?n:o,r,h,a,r<a?o:n,r,t.x,t.y)){const y=Math.abs(r-t.y)/(n-t.x);ht(t,i)&&(y<l||y===l&&(t.x>s.x||t.x===s.x&&Oe(s,t)))&&(s=t,l=y)}t=t.next}while(t!==c);return s}function Oe(i,e){return N(i.prev,i,e.prev)<0&&N(e.next,i,i.next)<0}function Re(i,e,t,n){let r=i;do r.z===0&&(r.z=Lt(r.x,r.y,e,t,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next;while(r!==i);r.prevZ.nextZ=null,r.prevZ=null,ze(r)}function ze(i){let e,t=1;do{let n=i,r;i=null;let o=null;for(e=0;n;){e++;let s=n,c=0;for(let a=0;a<t&&(c++,s=s.nextZ,!!s);a++);let h=t;for(;c>0||h>0&&s;)c!==0&&(h===0||!s||n.z<=s.z)?(r=n,n=n.nextZ,c--):(r=s,s=s.nextZ,h--),o?o.nextZ=r:i=r,r.prevZ=o,o=r;n=s}o.nextZ=null,t*=2}while(e>1);return i}function Lt(i,e,t,n,r){return i=(i-t)*r|0,e=(e-n)*r|0,i=(i|i<<8)&16711935,i=(i|i<<4)&252645135,i=(i|i<<2)&858993459,i=(i|i<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,i|e<<1}function Ze(i){let e=i,t=i;do(e.x<t.x||e.x===t.x&&e.y<t.y)&&(t=e),e=e.next;while(e!==i);return t}function Ut(i,e,t,n,r,o,s,c){return(r-s)*(e-c)>=(i-s)*(o-c)&&(i-s)*(n-c)>=(t-s)*(e-c)&&(t-s)*(o-c)>=(r-s)*(n-c)}function ct(i,e,t,n,r,o,s,c){return!(i===s&&e===c)&&Ut(i,e,t,n,r,o,s,c)}function je(i,e){return i.next.i!==e.i&&i.prev.i!==e.i&&!Ge(i,e)&&(ht(i,e)&&ht(e,i)&&Be(i,e)&&(N(i.prev,i,e.prev)||N(i,e.prev,e))||it(i,e)&&N(i.prev,i,i.next)>0&&N(e.prev,e,e.next)>0)}function N(i,e,t){return(e.y-i.y)*(t.x-e.x)-(e.x-i.x)*(t.y-e.y)}function it(i,e){return i.x===e.x&&i.y===e.y}function Vt(i,e,t,n){const r=gt(N(i,e,t)),o=gt(N(i,e,n)),s=gt(N(t,n,i)),c=gt(N(t,n,e));return!!(r!==o&&s!==c||r===0&&pt(i,t,e)||o===0&&pt(i,n,e)||s===0&&pt(t,i,n)||c===0&&pt(t,e,n))}function pt(i,e,t){return e.x<=Math.max(i.x,t.x)&&e.x>=Math.min(i.x,t.x)&&e.y<=Math.max(i.y,t.y)&&e.y>=Math.min(i.y,t.y)}function gt(i){return i>0?1:i<0?-1:0}function Ge(i,e){let t=i;do{if(t.i!==i.i&&t.next.i!==i.i&&t.i!==e.i&&t.next.i!==e.i&&Vt(t,t.next,i,e))return!0;t=t.next}while(t!==i);return!1}function ht(i,e){return N(i.prev,i,i.next)<0?N(i,e,i.next)>=0&&N(i,i.prev,e)>=0:N(i,e,i.prev)<0||N(i,i.next,e)<0}function Be(i,e){let t=i,n=!1;const r=(i.x+e.x)/2,o=(i.y+e.y)/2;do t.y>o!=t.next.y>o&&t.next.y!==t.y&&r<(t.next.x-t.x)*(o-t.y)/(t.next.y-t.y)+t.x&&(n=!n),t=t.next;while(t!==i);return n}function Xt(i,e){const t=$t(i.i,i.x,i.y),n=$t(e.i,e.x,e.y),r=i.next,o=e.prev;return i.next=e,e.prev=i,t.next=r,r.prev=t,n.next=t,t.prev=n,o.next=n,n.prev=o,n}function Wt(i,e,t,n){const r=$t(i,e,t);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function at(i){i.next.prev=i.prev,i.prev.next=i.next,i.prevZ&&(i.prevZ.nextZ=i.nextZ),i.nextZ&&(i.nextZ.prevZ=i.prevZ)}function $t(i,e,t){return{i,x:e,y:t,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function Ue(i,e,t,n){let r=0;for(let o=e,s=t-n;o<t;o+=n)r+=(i[s]-i[o])*(i[o+1]+i[s+1]),s=o;return r}function Nt(i,e={}){let{vertices:t=[],indices:n=[],holes:r=[],verticesStride:o=2,verticesOffset:s=t.length/o,indicesOffset:c=n.length}=e;const h=Se(i,r,2);if(h){for(let l=0;l<h.length;l+=3)n[c++]=h[l]+s,n[c++]=h[l+1]+s,n[c++]=h[l+2]+s;let a=s*o;for(let l=0;l<i.length;l+=2)t[a]=i[l],t[a+1]=i[l+1],a+=o}return{vertices:t,indices:n}}const Ve=8,dt=11920929e-14,Xe=1;function Ht(i,e,t,n,r,o,s,c,h=.5,a=[]){const y=Math.min(.99,Math.max(0,h));let f=(Xe-y)/1;return f*=f,_t(i,e,t,n,r,o,s,c,a,f,0),a.push(s,c),a}function _t(i,e,t,n,r,o,s,c,h,a,l){if(l>Ve)return;const y=(i+t)/2,f=(e+n)/2,x=(t+r)/2,u=(n+o)/2,d=(r+s)/2,M=(o+c)/2,b=(y+x)/2,E=(f+u)/2,P=(x+d)/2,w=(u+M)/2,S=(b+P)/2,I=(E+w)/2;if(l>0){let g=s-i,m=c-e;const q=Math.abs((t-s)*m-(n-c)*g),F=Math.abs((r-s)*m-(o-c)*g);if(q>dt&&F>dt){if((q+F)*(q+F)<=a*(g*g+m*m)){h.push(S,I);return}}else if(q>dt){if(q*q<=a*(g*g+m*m)){h.push(S,I);return}}else if(F>dt){if(F*F<=a*(g*g+m*m)){h.push(S,I);return}}else if(g=S-(i+s)/2,m=I-(e+c)/2,g*g+m*m<=a){h.push(S,I);return}}_t(i,e,y,f,b,E,S,I,h,a,l+1),_t(S,I,P,w,d,M,s,c,h,a,l+1)}const We=8,He=11920929e-14,Qe=1;function Qt(i,e,t,n,r,o,s=.5,c=[]){const a=Math.min(.99,Math.max(0,s));let l=(Qe-a)/1;return l*=l,Dt(c,i,e,t,n,r,o,l,0),c.push(r,o),c}function Dt(i,e,t,n,r,o,s,c,h){if(h>We)return;const a=(e+n)/2,l=(t+r)/2,y=(n+o)/2,f=(r+s)/2,x=(a+y)/2,u=(l+f)/2;let d=o-e,M=s-t;const b=Math.abs((n-o)*M-(r-s)*d);if(b>He){if(b*b<=c*(d*d+M*M)){i.push(x,u);return}}else if(d=x-(e+o)/2,M=u-(t+s)/2,d*d+M*M<=c){i.push(x,u);return}Dt(i,e,t,a,l,x,u,c,h+1),Dt(i,x,u,y,f,o,s,c,h+1)}function Ye(i,e){const t=1-i;return t*t*e}function Je(i,e){return 2*(1-i)*i*e}function Ke(i,e){return i*i*e}function qt(i,e,t,n){return Ye(i,e)+Je(i,t)+Ke(i,n)}const tn=1e-4,Yt=1e-4;function Jt(i,e={}){const{vertices:t=[],indices:n=[],lineStyle:r={alignment:.5,cap:"butt",join:"miter",width:1,miterLimit:10},flipAlignment:o=!1,closed:s=!0}=e,c=tn;if(i.length===0)return{vertices:t,indices:n};const h=r;let a=h.alignment;if(r.alignment!==.5){let $=en(i);o&&($*=-1),a=(a-.5)*$+.5}const l={x:i[0],y:i[1]},y={x:i[i.length-2],y:i[i.length-1]},f=s,x=Math.abs(l.x-y.x)<c&&Math.abs(l.y-y.y)<c;if(f){i=i.slice(),x&&(i.pop(),i.pop(),y.x=i[i.length-2],y.y=i[i.length-1]);const $=(l.x+y.x)*.5,W=(y.y+l.y)*.5;i.unshift($,W),i.push($,W)}const u=t,d=i.length/2;let M=i.length;const b=u.length/2,E=h.width/2,P=E*E,w=h.miterLimit*h.miterLimit;let S=i[0],I=i[1],g=i[2],m=i[3],q=0,F=0,A=-(I-m),C=S-g,_=0,O=0,B=Math.sqrt(A*A+C*C);A/=B,C/=B,A*=E,C*=E;const Me=a,T=(1-Me)*2,k=Me*2;f||(h.cap==="round"?M+=Q(S-A*(T-k)*.5,I-C*(T-k)*.5,S-A*T,I-C*T,S+A*k,I+C*k,u,!0)+2:h.cap==="square"&&(M+=Kt(S,I,A,C,T,k,!0,u))),u.push(S-A*T,I-C*T),u.push(S+A*k,I+C*k);for(let $=1;$<d-1;++$){S=i[($-1)*2],I=i[($-1)*2+1],g=i[$*2],m=i[$*2+1],q=i[($+1)*2],F=i[($+1)*2+1],A=-(I-m),C=S-g,B=Math.sqrt(A*A+C*C),A/=B,C/=B,A*=E,C*=E,_=-(m-F),O=g-q,B=Math.sqrt(_*_+O*O),_/=B,O/=B,_*=E,O*=E;const W=g-S,ut=I-m,yt=g-q,ft=F-m,Pe=W*yt+ut*ft,vt=ut*yt-ft*W,xt=vt<0;if(Math.abs(vt)<.001*Math.abs(Pe)){u.push(g-A*T,m-C*T),u.push(g+A*k,m+C*k),Pe>=0&&(h.join==="round"?M+=Q(g,m,g-A*T,m-C*T,g-_*T,m-O*T,u,!1)+4:M+=2,u.push(g-_*k,m-O*k),u.push(g+_*T,m+O*T));continue}const we=(-A+S)*(-C+m)-(-A+g)*(-C+I),ve=(-_+q)*(-O+m)-(-_+g)*(-O+F),Tt=(W*ve-yt*we)/vt,At=(ft*we-ut*ve)/vt,zt=(Tt-g)*(Tt-g)+(At-m)*(At-m),J=g+(Tt-g)*T,K=m+(At-m)*T,tt=g-(Tt-g)*k,et=m-(At-m)*k,In=Math.min(W*W+ut*ut,yt*yt+ft*ft),Te=xt?T:k,Sn=In+Te*Te*P;zt<=Sn?h.join==="bevel"||zt/P>w?(xt?(u.push(J,K),u.push(g+A*k,m+C*k),u.push(J,K),u.push(g+_*k,m+O*k)):(u.push(g-A*T,m-C*T),u.push(tt,et),u.push(g-_*T,m-O*T),u.push(tt,et)),M+=2):h.join==="round"?xt?(u.push(J,K),u.push(g+A*k,m+C*k),M+=Q(g,m,g+A*k,m+C*k,g+_*k,m+O*k,u,!0)+4,u.push(J,K),u.push(g+_*k,m+O*k)):(u.push(g-A*T,m-C*T),u.push(tt,et),M+=Q(g,m,g-A*T,m-C*T,g-_*T,m-O*T,u,!1)+4,u.push(g-_*T,m-O*T),u.push(tt,et)):(u.push(J,K),u.push(tt,et)):(u.push(g-A*T,m-C*T),u.push(g+A*k,m+C*k),h.join==="round"?xt?M+=Q(g,m,g+A*k,m+C*k,g+_*k,m+O*k,u,!0)+2:M+=Q(g,m,g-A*T,m-C*T,g-_*T,m-O*T,u,!1)+2:h.join==="miter"&&zt/P<=w&&(xt?(u.push(tt,et),u.push(tt,et)):(u.push(J,K),u.push(J,K)),M+=2),u.push(g-_*T,m-O*T),u.push(g+_*k,m+O*k),M+=2)}S=i[(d-2)*2],I=i[(d-2)*2+1],g=i[(d-1)*2],m=i[(d-1)*2+1],A=-(I-m),C=S-g,B=Math.sqrt(A*A+C*C),A/=B,C/=B,A*=E,C*=E,u.push(g-A*T,m-C*T),u.push(g+A*k,m+C*k),f||(h.cap==="round"?M+=Q(g-A*(T-k)*.5,m-C*(T-k)*.5,g-A*T,m-C*T,g+A*k,m+C*k,u,!1)+2:h.cap==="square"&&(M+=Kt(g,m,A,C,T,k,!1,u)));const kn=Yt*Yt;for(let $=b;$<M+b-2;++$)S=u[$*2],I=u[$*2+1],g=u[($+1)*2],m=u[($+1)*2+1],q=u[($+2)*2],F=u[($+2)*2+1],!(Math.abs(S*(m-F)+g*(F-I)+q*(I-m))<kn)&&n.push($,$+1,$+2);return{vertices:t,indices:n}}function en(i){const e=i.length;if(e<6)return 1;let t=0;for(let n=0,r=i[e-2],o=i[e-1];n<e;n+=2){const s=i[n],c=i[n+1];t+=(s-r)*(c+o),r=s,o=c}return t<0?-1:1}function Kt(i,e,t,n,r,o,s,c){const h=i-t*r,a=e-n*r,l=i+t*o,y=e+n*o;let f,x;s?(f=n,x=-t):(f=-n,x=t);const u=h+f,d=a+x,M=l+f,b=y+x;return c.push(u,d),c.push(M,b),2}function Q(i,e,t,n,r,o,s,c){const h=t-i,a=n-e;let l=Math.atan2(h,a),y=Math.atan2(r-i,o-e);c&&l<y?l+=Math.PI*2:!c&&l>y&&(y+=Math.PI*2);let f=l;const x=y-l,u=Math.abs(x),d=Math.sqrt(h*h+a*a),M=(15*u*Math.sqrt(d)/Math.PI>>0)+1,b=x/M;if(f+=b,c){s.push(i,e),s.push(t,n);for(let E=1,P=f;E<M;E++,P+=b)s.push(i,e),s.push(i+Math.sin(P)*d,e+Math.cos(P)*d);s.push(i,e),s.push(r,o)}else{s.push(t,n),s.push(i,e);for(let E=1,P=f;E<M;E++,P+=b)s.push(i+Math.sin(P)*d,e+Math.cos(P)*d),s.push(i,e);s.push(r,o),s.push(i,e)}return M*2}class Y{constructor(){X(this,"arcLengthDivision",200);X(this,"_arcLengths")}getPointAt(e,t=new p){return this.getPoint(this.getUToTMapping(e),t)}isClockwise(){const e=this.getPoint(1),t=this.getPoint(.5),n=this.getPoint(1);return(t.x-e.x)*(n.y-t.y)-(t.y-e.y)*(n.x-t.x)<0}getControlPointRefs(){return[]}applyTransform(e){return this.getControlPointRefs().forEach(t=>{t.applyMatrix3(e)}),this}getUnevenPointArray(e=5,t=[]){const n=new p;for(let r=0,o=Math.max(1,e)-1;r<=o;r++)this.getPoint(r/o,n),t.push(n.x,n.y);return t}getSpacedPointArray(e=5,t=[]){const n=new p;for(let r=0,o=Math.max(1,e)-1;r<=o;r++)this.getPointAt(r/o,n),t.push(n.x,n.y);return t}getAdaptivePointArray(e=[]){return this.getUnevenPointArray(5,e)}_pointArrayToPoint(e,t=[]){for(let n=0,r=e.length;n<r;n+=2){const o=e[n],s=e[n+1];t.push(new p(o,s))}return t}getSpacedPoints(e,t=[]){const n=this.getSpacedPointArray(e);return this._pointArrayToPoint(n,t),t}getUnevenPoints(e,t=[]){const n=this.getUnevenPointArray(e);return this._pointArrayToPoint(n,t),t}getAdaptivePoints(e=[]){const t=this.getAdaptivePointArray();return this._pointArrayToPoint(t,e),e}getPoints(e,t=[]){let n;return e?n=this.getUnevenPointArray(e):n=this.getAdaptivePointArray(),this._pointArrayToPoint(n,t),t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(){return(!this._arcLengths||this._arcLengths.length!==this.arcLengthDivision+1)&&this.updateLengths(),this._arcLengths}updateLengths(){const e=this.arcLengthDivision,t=[0];for(let n=0,r=this.getPoint(0),o=1;o<=e;o++){const s=this.getPoint(o/e);n+=s.distanceTo(r),t.push(n),r=s}this._arcLengths=t}getUToTMapping(e,t){const n=this.getLengths(),r=n.length,o=t??e*n[r-1];if(r<2)return o/n[0];let s=0,c=0,h=r-1,a;for(;c<=h;)if(s=Math.floor(c+(h-c)/2),a=n[s]-o,a<0)c=s+1;else if(a>0)h=s-1;else{h=s;break}if(s=h,n[s]===o)return s/(r-1);const l=n[s],f=n[s+1]-l,x=(o-l)/f;return(s+x)/(r-1)}getTangent(e,t=new p){const r=Math.max(0,e-1e-4),o=Math.min(1,e+1e-4);return t.copy(this.getPoint(o).sub(this.getPoint(r)).normalize())}getTangentAt(e,t){return this.getTangent(this.getUToTMapping(e),t)}getNormal(e,t=new p){return this.getTangent(e,t),t.set(-t.y,t.x).normalize()}getNormalAt(e,t){return this.getNormal(this.getUToTMapping(e),t)}getTForPoint(e,t=.001){let n=0,r=1,o=(n+r)/2;for(;r-n>t;){o=(n+r)/2;const s=this.getPoint(o);if(s.distanceTo(e)<t)return o;s.x<e.x?n=o:r=o}return o}getMinMax(e=p.MAX,t=p.MIN){const n=this.getPoints();for(let r=0,o=n.length;r<o;r++){const s=n[r];e.min(s),t.max(s)}return{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new V(e.x,e.y,t.x-e.x,t.y-e.y)}fillTriangulate(e){return Nt(this.getAdaptivePointArray(),e)}strokeTriangulate(e){return Jt(this.getAdaptivePointArray(),e)}toTriangulatedSVGString(e=this.fillTriangulate(),t=0){const{vertices:n,indices:r}=e,o={x:-t,y:-t},s={x:t,y:t},c=l=>{const y=n[l*2],f=n[l*2+1];return o.x=Math.min(o.x,y+t),s.x=Math.max(s.x,y+t),o.y=Math.min(o.y,f+t),s.y=Math.max(s.y,f+t),[y,f]};let h="";for(let l=0,y=r.length;l<y;l+=3){const f=c(r[l]),x=c(r[l+1]),u=c(r[l+2]);h+=`<polygon points="${f.join(",")} ${x.join(",")} ${u.join(",")}" fill="none" stroke="black" />`}const a=[o.x,o.y,s.x-o.x,s.y-o.y];return`<svg width="${a[2]}" height="${a[3]}" viewBox="${a.join(" ")}" xmlns="http://www.w3.org/2000/svg">${h}</svg>`}toTriangulatedSVG(e,t){return new DOMParser().parseFromString(this.toTriangulatedSVGString(e,t),"image/svg+xml").documentElement}toCommands(){const e=[],t=this.getPoints();for(let n=0,r=t.length;n<r;n++){const o=t[n];n===0?e.push({type:"M",x:o.x,y:o.y}):e.push({type:"L",x:o.x,y:o.y})}return e}toData(){return Gt(this.toCommands())}drawTo(e){return this.toCommands().forEach(t=>{switch(t.type){case"M":e.moveTo(t.x,t.y);break;case"L":e.lineTo(t.x,t.y);break}}),this}copy(e){return this.arcLengthDivision=e.arcLengthDivision,this}clone(){return new this.constructor().copy(this)}}const nn=new z,te=new z,ee=new z,mt=new p;class Ft extends Y{constructor(e=new p,t=new p,n=new p,r=0,o=0,s=Math.PI*2,c=!1){super(),this._center=e,this._radius=t,this._diff=n,this.rotate=r,this.startAngle=o,this.endAngle=s,this.clockwise=c}get cx(){return this._center.x}set cx(e){this._center.x=e}get cy(){return this._center.y}set cy(e){this._center.y=e}get rx(){return this._radius.x}set rx(e){this._radius.x=e}get ry(){return this._radius.y}set ry(e){this._radius.y=e}get dx(){return this._diff.x}set dx(e){this._diff.x=e}get dy(){return this._diff.y}set dy(e){this._diff.y=e}isClockwise(){return this.clockwise}_getDeltaAngle(){const e=Math.PI*2;let t=this.endAngle-this.startAngle;const n=Math.abs(t)<Number.EPSILON;return t=(t%e+e)%e,n?t=0:this.clockwise||(t=t===0?-e:t-e),t}getPoint(e,t=new p){const n=this._getDeltaAngle(),r=this.startAngle+e*n;let o=this.cx+this.rx*Math.cos(r),s=this.cy+this.ry*Math.sin(r);if(this.rotate!==0){const c=Math.cos(this.rotate),h=Math.sin(this.rotate),a=o-this.cx,l=s-this.cy;o=a*c-l*h+this.cx,s=a*h+l*c+this.cy}return t.set(o,s)}toCommands(){const{cx:e,cy:t,rx:n,ry:r,startAngle:o,endAngle:s,clockwise:c,rotate:h}=this,a=e+n*Math.cos(o)*Math.cos(h)-r*Math.sin(o)*Math.sin(h),l=t+n*Math.cos(o)*Math.sin(h)+r*Math.sin(o)*Math.cos(h),y=Math.abs(o-s),f=y>Math.PI?1:0,x=c?1:0,u=h*180/Math.PI;if(y>=2*Math.PI){const d=o+Math.PI,M=e+n*Math.cos(d)*Math.cos(h)-r*Math.sin(d)*Math.sin(h),b=t+n*Math.cos(d)*Math.sin(h)+r*Math.sin(d)*Math.cos(h);return[{type:"M",x:a,y:l},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:0,sweepFlag:x,x:M,y:b},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:0,sweepFlag:x,x:a,y:l}]}else{const d=e+n*Math.cos(s)*Math.cos(h)-r*Math.sin(s)*Math.sin(h),M=t+n*Math.cos(s)*Math.sin(h)+r*Math.sin(s)*Math.cos(h);return[{type:"M",x:a,y:l},{type:"A",rx:n,ry:r,angle:u,largeArcFlag:f,sweepFlag:x,x:d,y:M}]}}drawTo(e){const{cx:t,cy:n,rx:r,ry:o,rotate:s,startAngle:c,endAngle:h,clockwise:a}=this;return e.ellipse(t,n,r,o,s,c,h,!a),this}applyTransform(e){return mt.set(this.cx,this.cy),mt.applyMatrix3(e),this.cx=mt.x,this.cy=mt.y,on(e)?sn(this,e):rn(this,e),this}getControlPointRefs(){return[this._center]}getAdaptivePointArray(e=[]){const{cx:t,cy:n,rx:r,ry:o,dx:s,dy:c}=this;if(!(r>=0&&o>=0&&s>=0&&c>=0))return e;const h=Math.ceil(2.3*Math.sqrt(r+o)),a=t,l=n,y=h*8+(s?4:0)+(c?4:0);if(y===0)return e;if(h===0)return e[0]=e[6]=a+s,e[1]=e[3]=l+c,e[2]=e[4]=a-s,e[5]=e[7]=l-c,e;let f=0,x=h*4+(s?2:0)+2,u=x,d=y,M=s+r,b=c,E=a+M,P=a-M,w=l+b;if(e[f++]=E,e[f++]=w,e[--x]=w,e[--x]=P,c){const I=l-b;e[u++]=P,e[u++]=I,e[--d]=I,e[--d]=E}for(let I=1;I<h;I++){const g=Math.PI/2*(I/h),m=s+Math.cos(g)*r,q=c+Math.sin(g)*o,F=a+m,A=a-m,C=l+q,_=l-q;e[f++]=F,e[f++]=C,e[--x]=C,e[--x]=A,e[u++]=A,e[u++]=_,e[--d]=_,e[--d]=F}M=s,b=c+o,E=a+M,P=a-M,w=l+b;const S=l-b;return e[f++]=E,e[f++]=w,e[--d]=S,e[--d]=E,s&&(e[f++]=P,e[f++]=w,e[--d]=S,e[--d]=P),e}fillTriangulate(e={}){let{vertices:t=[],indices:n=[],verticesStride:r=2,verticesOffset:o=t.length/r,indicesOffset:s=n.length}=e;const c=this.getAdaptivePointArray();if(c.length===0)return{vertices:t,indices:n};let h=0,a=0;for(let f=0;f<c.length;f+=2)h+=c[f],a+=c[f+1];h/=c.length/2,a/=c.length/2;let l=o;t[l*r]=h,t[l*r+1]=a;const y=l++;for(let f=0;f<c.length;f+=2)t[l*r]=c[f],t[l*r+1]=c[f+1],f>0&&(n[s++]=l,n[s++]=y,n[s++]=l-1),l++;return n[s++]=y+1,n[s++]=y,n[s++]=l-1,{vertices:t,indices:n}}getMinMax(e=p.MAX,t=p.MIN){const{cx:n,cy:r,rx:o,ry:s,rotate:c}=this,h=Math.cos(c),a=Math.sin(c),l=Math.sqrt(o*o*h*h+s*s*a*a),y=Math.sqrt(o*o*a*a+s*s*h*h);return e.x=Math.min(e.x,n-l),e.y=Math.min(e.y,r-y),t.x=Math.max(t.x,n+l),t.y=Math.max(t.y,r+y),{min:e,max:t}}copy(e){return super.copy(e),this.cx=e.cx,this.cy=e.cy,this.rx=e.rx,this.ry=e.ry,this.dx=e.dx,this.dy=e.dy,this.startAngle=e.startAngle,this.endAngle=e.endAngle,this.clockwise=e.clockwise,this.rotate=e.rotate,this}}function sn(i,e){const t=i.rx,n=i.ry,r=Math.cos(i.rotate),o=Math.sin(i.rotate),s=new p(t*r,t*o),c=new p(-n*o,n*r),h=s.applyMatrix3(e),a=c.applyMatrix3(e),l=nn.set(h.x,a.x,0,h.y,a.y,0,0,0,1),y=te.copy(l).invert(),u=ee.copy(y).transpose().multiply(y).elements,d=cn(u[0],u[1],u[4]),M=Math.sqrt(d.rt1),b=Math.sqrt(d.rt2);if(i.rx=1/M,i.ry=1/b,i.rotate=Math.atan2(d.sn,d.cs),!((i.endAngle-i.startAngle)%(2*Math.PI)<Number.EPSILON)){const P=te.set(M,0,0,0,b,0,0,0,1),w=ee.set(d.cs,d.sn,0,-d.sn,d.cs,0,0,0,1),S=P.multiply(w).multiply(l),I=g=>{const{x:m,y:q}=new p(Math.cos(g),Math.sin(g)).applyMatrix3(S);return Math.atan2(q,m)};i.startAngle=I(i.startAngle),i.endAngle=I(i.endAngle),ne(e)&&(i.clockwise=!i.clockwise)}}function rn(i,e){const t=se(e),n=ie(e);i.rx*=t,i.ry*=n;const r=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);i.rotate+=r,ne(e)&&(i.startAngle*=-1,i.endAngle*=-1,i.clockwise=!i.clockwise)}function ne(i){const e=i.elements;return e[0]*e[4]-e[1]*e[3]<0}function on(i){const e=i.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const n=se(i),r=ie(i);return Math.abs(t/(n*r))>Number.EPSILON}function se(i){const e=i.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function ie(i){const e=i.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function cn(i,e,t){let n,r,o,s,c;const h=i+t,a=i-t,l=Math.sqrt(a*a+4*e*e);return h>0?(n=.5*(h+l),c=1/n,r=i*c*t-e*c*e):h<0?r=.5*(h-l):(n=.5*l,r=-.5*l),a>0?o=a+l:o=a-l,Math.abs(o)>2*Math.abs(e)?(c=-2*e/o,s=1/Math.sqrt(1+c*c),o=c*s):Math.abs(e)===0?(o=1,s=0):(c=-.5*o/e,o=1/Math.sqrt(1+c*c),s=c*o),a>0&&(c=o,o=-s,s=c),{rt1:n,rt2:r,cs:o,sn:s}}class re extends Ft{constructor(e=0,t=0,n=1,r=0,o=Math.PI*2,s=!1){super(new p(e,t),new p(n,n),new p,0,r,o,s)}drawTo(e){const{cx:t,cy:n,rx:r,startAngle:o,endAngle:s,clockwise:c}=this;return e.arc(t,n,r,o,s,!c),this}getAdaptivePointArray(e=[]){const{cx:t,cy:n,rx:r,startAngle:o,endAngle:s,clockwise:c}=this;let h=Math.abs(o-s);(!c&&o>s||c&&s>o)&&(h=2*Math.PI-h);let a=Math.max(6,Math.floor(6*r**(1/3)*(h/Math.PI)));a=Math.max(a,3);let l=h/a,y=o;l*=c?1:-1;for(let f=0;f<a+1;f++){const x=Math.cos(y),u=Math.sin(y),d=t+x*r,M=n+u*r;e.push(d,M),y+=l}return e}}class j extends Y{constructor(e=new p,t=new p){super(),this.p1=e,this.p2=t}static from(e,t,n,r){return new j(new p(e,t),new p(n,r))}getPoint(e,t=new p){return e===1?t.copy(this.p2):t.copy(this.p2).sub(this.p1).scale(e).add(this.p1),t}getPointAt(e,t=new p){return this.getPoint(e,t)}getTangent(e,t=new p){return t.subVectors(this.p2,this.p1).normalize()}getTangentAt(e,t=new p){return this.getTangent(e,t)}getControlPointRefs(){return[this.p1,this.p2]}getAdaptivePointArray(e=[]){return e.push(this.p1.x,this.p1.y,this.p2.x,this.p2.y),e}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,p2:r}=this;return e.x=Math.min(e.x,n.x,r.x),e.y=Math.min(e.y,n.y,r.y),t.x=Math.max(t.x,n.x,r.x),t.y=Math.max(t.y,n.y,r.y),{min:e,max:t}}toCommands(){const{p1:e,p2:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}fillTriangulate(e={}){let{vertices:t=[],indices:n=[],verticesStride:r=2,verticesOffset:o=t.length/r,indicesOffset:s=n.length}=e;const c=this.p1.x,h=this.p1.y,a=this.p2.x-this.p1.x||1,l=this.p2.y-this.p2.y||1,y=[c,h,c+a,h,c+a,h+l,c,h+l];let f=0;o*=r,t[o+f]=y[0],t[o+f+1]=y[1],f+=r,t[o+f]=y[2],t[o+f+1]=y[3],f+=r,t[o+f]=y[6],t[o+f+1]=y[7],f+=r,t[o+f]=y[4],t[o+f+1]=y[5],f+=r;const x=o/r;return n[s++]=x,n[s++]=x+1,n[s++]=x+2,n[s++]=x+1,n[s++]=x+3,n[s++]=x+2,{vertices:t,indices:n}}drawTo(e){const{p1:t,p2:n}=this;return e.lineTo(t.x,t.y),e.lineTo(n.x,n.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.p2.copy(e.p2),this}}class rt extends Y{constructor(e=[]){super(),this.curves=e}getFlatCurves(){return this.curves.flatMap(e=>e instanceof rt?e.getFlatCurves():e)}addCurve(e){return this.curves.push(e),this}getPoint(e,t=new p){const n=e*this.getLength(),r=this.getLengths();let o=0;for(;o<r.length;){if(r[o]>=n){const s=r[o]-n,c=this.curves[o],h=c.getLength();return c.getPointAt(h===0?0:1-s/h,t)}o++}return t}updateLengths(){const e=[];for(let t=0,n=0,r=this.curves.length;t<r;t++)n+=this.curves[t].getLength(),e.push(n);this._arcLengths=e}getControlPointRefs(){return this.curves.flatMap(e=>e.getControlPointRefs())}_removeNextPointIfEqualPrevPoint(e,t){return e[t-1]===e[t+1]&&e[t]===e[t+2]&&e.splice(t+1,2),e}getSpacedPointArray(e=5,t=[]){let n;return this.curves.forEach(r=>{r.getSpacedPointArray(e,t),n&&this._removeNextPointIfEqualPrevPoint(t,n),n=t.length-1}),t}getAdaptivePointArray(e=[]){let t;return this.curves.forEach(n=>{n.getAdaptivePointArray(e),t&&this._removeNextPointIfEqualPrevPoint(e,t),t=e.length-1}),e}fillTriangulate(e){const t=(e==null?void 0:e.indices)??[],n=(e==null?void 0:e.vertices)??[],r=[],o=()=>{if(r.length){const s=[];r.forEach(c=>{const h=c.p1.x,a=c.p1.y;(s[s.length-2]!==h||s[s.length-1]!==a)&&s.push(h,a),s.push(c.p2.x,c.p2.y)}),Nt(s,{...e,indices:t,vertices:n}),r.length=0}};return this.curves.forEach(s=>{s instanceof j?r.push(s):(o(),s.fillTriangulate({...e,indices:t,vertices:n}))}),o(),{indices:t,vertices:n}}applyTransform(e){return this.curves.forEach(t=>t.applyTransform(e)),this}getMinMax(e=p.MAX,t=p.MIN){return this.curves.forEach(n=>n.getMinMax(e,t)),{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new V(e.x,e.y,t.x-e.x,t.y-e.y)}toCommands(){return this.curves.flatMap(e=>e.toCommands())}drawTo(e){var n;const t=(n=this.curves[0])==null?void 0:n.getPoint(0);return t&&e.moveTo(t.x,t.y),this.curves.forEach(r=>r.drawTo(e)),this}copy(e){return super.copy(e),this.curves=e.curves.map(t=>t.clone()),this}}class Mt extends Y{constructor(e=new p,t=new p,n=new p,r=new p){super(),this.p1=e,this.cp1=t,this.cp2=n,this.p2=r}static from(e,t,n,r,o,s,c,h){return new Mt(new p(e,t),new p(n,r),new p(o,s),new p(c,h))}getPoint(e,t=new p){const{p1:n,cp1:r,cp2:o,p2:s}=this;return t.set(Et(e,n.x,r.x,o.x,s.x),Et(e,n.y,r.y,o.y,s.y))}getAdaptivePointArray(e=[]){return Ht(this.p1.x,this.p1.y,this.cp1.x,this.cp1.y,this.cp2.x,this.cp2.y,this.p2.x,this.p2.y,.5,e)}getControlPointRefs(){return[this.p1,this.cp1,this.cp2,this.p2]}_solveQuadratic(e,t,n){const r=t*t-4*e*n;if(r<0)return[];const o=Math.sqrt(r),s=(-t+o)/(2*e),c=(-t-o)/(2*e);return[s,c].filter(h=>h>=0&&h<=1)}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,cp1:r,cp2:o,p2:s}=this,c=this._solveQuadratic(3*(r.x-n.x),6*(o.x-r.x),3*(s.x-o.x)),h=this._solveQuadratic(3*(r.y-n.y),6*(o.y-r.y),3*(s.y-o.y)),a=[0,1,...c,...h];return((y,f)=>{for(const x of y)for(let u=0;u<=f;u++){const d=u/f-.5,M=Math.min(1,Math.max(0,x+d)),b=this.getPoint(M);e.x=Math.min(e.x,b.x),e.y=Math.min(e.y,b.y),t.x=Math.max(t.x,b.x),t.y=Math.max(t.y,b.y)}})(a,10),{min:e,max:t}}toCommands(){const{p1:e,cp1:t,cp2:n,p2:r}=this;return[{type:"M",x:e.x,y:e.y},{type:"C",x1:t.x,y1:t.y,x2:n.x,y2:n.y,x:r.x,y:r.y}]}drawTo(e){const{p1:t,cp1:n,cp2:r,p2:o}=this;return e.lineTo(t.x,t.y),e.bezierCurveTo(n.x,n.y,r.x,r.y,o.x,o.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.cp1.copy(e.cp1),this.cp2.copy(e.cp2),this.p2.copy(e.p2),this}}class oe extends Ft{constructor(e=0,t=0,n=1,r=1,o=0,s=0,c=Math.PI*2,h=!1){super(new p(e,t),new p(n,r),new p,o,s,c,h)}drawTo(e){return e.ellipse(this.cx,this.cy,this.rx,this.ry,this.rotate,this.startAngle,this.endAngle,!this.clockwise),this}}class Ot extends rt{}class hn extends Ot{constructor(e=0,t=0,n=1,r=3){super(),this.cx=e,this.cy=t,this.radius=n,this.sideCount=r,this.update()}update(){const{cx:e,cy:t,radius:n,sideCount:r}=this,o=[];for(let c=0;c<r;c++){const h=c*2*Math.PI/r-.5*Math.PI;o.push(new p(n*Math.cos(h),n*Math.sin(h)).add({x:e,y:t}))}const s=[];for(let c=0;c<r;c++)s.push(new j(o[c],o[(c+1)%r]));return this.curves=s,this}copy(e){return super.copy(e),this.cx=e.cx,this.cy=e.cy,this.radius=e.radius,this.sideCount=e.sideCount,this.update(),this}}class Pt extends Y{constructor(e=new p,t=new p,n=new p){super(),this.p1=e,this.cp=t,this.p2=n}static from(e,t,n,r,o,s){return new Pt(new p(e,t),new p(n,r),new p(o,s))}getPoint(e,t=new p){const{p1:n,cp:r,p2:o}=this;return t.set(qt(e,n.x,r.x,o.x),qt(e,n.y,r.y,o.y)),t}getControlPointRefs(){return[this.p1,this.cp,this.p2]}getAdaptivePointArray(e=[]){return Qt(this.p1.x,this.p1.y,this.cp.x,this.cp.y,this.p2.x,this.p2.y,.5,e)}getMinMax(e=p.MAX,t=p.MIN){const{p1:n,cp:r,p2:o}=this,s=.5*(n.x+r.x),c=.5*(n.y+r.y),h=.5*(n.x+o.x),a=.5*(n.y+o.y);return e.x=Math.min(e.x,n.x,o.x,s,h),e.y=Math.min(e.y,n.y,o.y,c,a),t.x=Math.max(t.x,n.x,o.x,s,h),t.y=Math.max(t.y,n.y,o.y,c,a),{min:e,max:t}}toCommands(){const{p1:e,cp:t,p2:n}=this;return[{type:"M",x:e.x,y:e.y},{type:"Q",x1:t.x,y1:t.y,x:n.x,y:n.y}]}drawTo(e){const{p1:t,cp:n,p2:r}=this;return e.lineTo(t.x,t.y),e.quadraticCurveTo(n.x,n.y,r.x,r.y),this}copy(e){return super.copy(e),this.p1.copy(e.p1),this.cp.copy(e.cp),this.p2.copy(e.p2),this}}class ce extends Ot{constructor(e=0,t=0,n=0,r=0){super(),this.x=e,this.y=t,this.width=n,this.height=r,this.update()}update(){const{x:e,y:t,width:n,height:r}=this,o=[new p(e,t),new p(e+n,t),new p(e+n,t+r),new p(e,t+r)];return this.curves=[new j(o[0],o[1]),new j(o[1],o[2]),new j(o[2],o[3]),new j(o[3],o[0])],this}drawTo(e){return e.rect(this.x,this.y,this.width,this.height),this}fillTriangulate(e={}){let{vertices:t=[],indices:n=[],verticesStride:r=2,verticesOffset:o=t.length/r,indicesOffset:s=n.length}=e;const{x:c,y:h,width:a,height:l}=this,y=[c,h,c+a,h,c+a,h+l,c,h+l];let f=0;o*=r,t[o+f]=y[0],t[o+f+1]=y[1],f+=r,t[o+f]=y[2],t[o+f+1]=y[3],f+=r,t[o+f]=y[6],t[o+f+1]=y[7],f+=r,t[o+f]=y[4],t[o+f+1]=y[5],f+=r;const x=o/r;return n[s++]=x,n[s++]=x+1,n[s++]=x+2,n[s++]=x+1,n[s++]=x+3,n[s++]=x+2,{vertices:t,indices:n}}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.update(),this}}class he extends Ft{constructor(e=0,t=0,n=1,r=1,o=1){super(),this.x=e,this.y=t,this.width=n,this.height=r,this.radius=o,this.update()}update(){const{x:e,y:t,width:n,height:r,radius:o}=this,s=n/2,c=r/2,h=e+s,a=t+c,l=Math.max(0,Math.min(o,Math.min(s,c))),y=l;return this._center=new p(h,a),this._radius=new p(l,y),this._diff=new p(s-l,c-y),this}drawTo(e){const{x:t,y:n,width:r,height:o,radius:s}=this;return e.roundRect(t,n,r,o,s),this}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height,this.radius=e.radius,this.update(),this}}class ae extends Y{constructor(e=[]){super(),this.points=e}getPoint(e,t=new p){const{points:n}=this,r=(n.length-1)*e,o=Math.floor(r),s=r-o,c=n[o===0?o:o-1],h=n[o],a=n[o>n.length-2?n.length-1:o+1],l=n[o>n.length-3?n.length-1:o+2];return t.set(St(s,c.x,h.x,a.x,l.x),St(s,c.y,h.y,a.y,l.y)),t}getControlPointRefs(){return this.points}copy(e){super.copy(e),this.points=[];for(let t=0,n=e.points.length;t<n;t++)this.points.push(e.points[t].clone());return this}}class lt extends rt{constructor(t){super();X(this,"startPoint");X(this,"currentPoint");X(this,"autoClose",!1);t&&this.addPoints(t)}addPoints(t){this.moveTo(t[0].x,t[0].y);for(let n=1,r=t.length;n<r;n++){const{x:o,y:s}=t[n];this.lineTo(o,s)}return this}addCommands(t){return kt(t,this),this}addData(t){return this.addCommands(It(t)),this}_closePointArray(t){return this.autoClose&&t.length>=4&&t[0]!==t[t.length-2]&&t[1]!==t[t.length-1]&&t.push(t[0],t[1]),t}getUnevenPointArray(t=40,n=[]){return this._closePointArray(super.getUnevenPointArray(t,n))}getSpacedPointArray(t=40,n=[]){return this._closePointArray(super.getSpacedPointArray(t,n))}getAdaptivePointArray(t=[]){return this._closePointArray(super.getAdaptivePointArray(t))}_setCurrentPoint(t){return this.currentPoint=new p(t.x,t.y),this.startPoint||(this.startPoint=this.currentPoint.clone()),this}_connetLineTo(t){if(this.curves.length>0){const n=t.getPoint(0);(!this.currentPoint||!n.equals(this.currentPoint))&&this.lineTo(n.x,n.y)}return this}closePath(){const t=this.startPoint;if(t){const n=this.currentPoint;n&&!t.equals(n)&&(this.curves.push(new j(n.clone(),t.clone())),n.copy(t)),this.startPoint=void 0}return this}moveTo(t,n){return this.currentPoint=new p(t,n),this.startPoint=this.currentPoint.clone(),this}lineTo(t,n){const r=this.currentPoint;return r!=null&&r.equals({x:t,y:n})||this.curves.push(j.from((r==null?void 0:r.x)??0,(r==null?void 0:r.y)??0,t,n)),this._setCurrentPoint({x:t,y:n}),this}bezierCurveTo(t,n,r,o,s,c){const h=this.currentPoint;return h!=null&&h.equals({x:s,y:c})||this.curves.push(Mt.from((h==null?void 0:h.x)??0,(h==null?void 0:h.y)??0,t,n,r,o,s,c)),this._setCurrentPoint({x:s,y:c}),this}quadraticCurveTo(t,n,r,o){const s=this.currentPoint;return s!=null&&s.equals({x:r,y:o})||this.curves.push(Pt.from((s==null?void 0:s.x)??0,(s==null?void 0:s.y)??0,t,n,r,o)),this._setCurrentPoint({x:r,y:o}),this}arc(t,n,r,o,s,c){const h=new re(t,n,r,o,s,!c);return this._connetLineTo(h),this.curves.push(h),this._setCurrentPoint(h.getPoint(1)),this}relativeArc(t,n,r,o,s,c){var h,a;return t+=((h=this.currentPoint)==null?void 0:h.x)??0,n+=((a=this.currentPoint)==null?void 0:a.y)??0,this.arc(t,n,r,o,s,c),this}arcTo(t,n,r,o,s){return console.warn("Method arcTo not supported yet"),this}ellipse(t,n,r,o,s,c,h,a=!0){const l=new oe(t,n,r,o,s,c,h,!a);return this._connetLineTo(l),this.curves.push(l),this._setCurrentPoint(l.getPoint(1)),this}relativeEllipse(t,n,r,o,s,c,h,a){var l,y;return t+=((l=this.currentPoint)==null?void 0:l.x)??0,n+=((y=this.currentPoint)==null?void 0:y.y)??0,this.ellipse(t,n,r,o,s,c,h,a),this}rect(t,n,r,o){const s=new ce(t,n,r,o);return this._connetLineTo(s),this.curves.push(s),this._setCurrentPoint({x:t,y:n}),this}roundRect(t,n,r,o,s){const c=new he(t,n,r,o,s);return this._connetLineTo(c),this.curves.push(c),this._setCurrentPoint({x:t,y:n}),this}splineThru(t){const n=this.currentPoint??new p;return this.curves.push(new ae([n].concat(t))),this._setCurrentPoint(t[t.length-1]),this}drawTo(t){var r;const n=(r=this.curves[0])==null?void 0:r.getPoint(0);return n&&t.moveTo(n.x,n.y),this.curves.forEach(o=>o.drawTo(t)),this.autoClose&&t.closePath(),this}copy(t){var n;return super.copy(t),this.autoClose=t.autoClose,this.currentPoint=(n=t.currentPoint)==null?void 0:n.clone(),this}}function an(i){return i.replace(/[^a-z0-9]/gi,"-").replace(/\B([A-Z])/g,"-$1").toLowerCase()}function ln(i,e,t,n){const r=e.clone().sub(i),o=n.clone().sub(t),s=t.clone().sub(i),c=r.cross(o);if(c===0)return new p((i.x+t.x)/2,(i.y+t.y)/2);const h=s.cross(o)/c;return Math.abs(h)>1?new p((i.x+t.x)/2,(i.y+t.y)/2):new p(i.x+h*r.x,i.y+h*r.y)}class G extends rt{constructor(t,n={}){super();X(this,"currentCurve",new lt);X(this,"style");this.curves.push(this.currentCurve),this.style=n,t&&(t instanceof G?this.addPath(t):Array.isArray(t)?this.addCommands(t):this.addData(t))}get startPoint(){return this.currentCurve.startPoint}get currentPoint(){return this.currentCurve.currentPoint}get strokeWidth(){return this.style.strokeWidth??((this.style.stroke??"none")==="none"?0:1)}addPath(t){const n=this.curves.findIndex(r=>r===this.currentCurve);return n>-1&&this.curves.splice(n,1),t instanceof G?this.curves.push(...t.curves.filter(r=>r.curves.length).map(r=>r.clone())):t.curves.length&&this.curves.push(t),this.curves.push(this.currentCurve),this}closePath(){const t=this.startPoint;return t&&(this.currentCurve.closePath(),this.currentCurve.curves.length&&(this.currentCurve=new lt().moveTo(t.x,t.y),this.curves.push(this.currentCurve))),this}moveTo(t,n){var r;return(r=this.currentCurve.currentPoint)!=null&&r.equals({x:t,y:n})||(this.currentCurve.curves.length&&(this.currentCurve=new lt,this.curves.push(this.currentCurve)),this.currentCurve.moveTo(t,n)),this}lineTo(t,n){return this.currentCurve.lineTo(t,n),this}bezierCurveTo(t,n,r,o,s,c){return this.currentCurve.bezierCurveTo(t,n,r,o,s,c),this}quadraticCurveTo(t,n,r,o){return this.currentCurve.quadraticCurveTo(t,n,r,o),this}arc(t,n,r,o,s,c){return this.currentCurve.arc(t,n,r,o,s,c),this}arcTo(t,n,r,o,s){return this.currentCurve.arcTo(t,n,r,o,s),this}ellipse(t,n,r,o,s,c,h,a){return this.currentCurve.ellipse(t,n,r,o,s,c,h,a),this}rect(t,n,r,o){return this.currentCurve.rect(t,n,r,o),this}roundRect(t,n,r,o,s){return this.currentCurve.roundRect(t,n,r,o,s),this}reset(){return this.currentCurve=new lt,this.curves=[this.currentCurve],this.style={},this}addCommands(t){return kt(t,this),this}addData(t){return this.addCommands(It(t)),this}splineThru(t){return this.currentCurve.splineThru(t),this}scale(t,n=t,r={x:0,y:0}){return this.getControlPointRefs().forEach(o=>{o.scale(t,n,r)}),this}skew(t,n=0,r={x:0,y:0}){return this.getControlPointRefs().forEach(o=>{o.skew(t,n,r)}),this}rotate(t,n={x:0,y:0}){return this.getControlPointRefs().forEach(r=>{r.rotate(t,n)}),this}bold(t){if(t===0)return this;const n=this.getFlatCurves(),r=[],o=[],s=[];n.forEach((h,a)=>{const l=h.getControlPointRefs(),y=h.isClockwise();s[a]=l,o[a]=y;const f=l[0],x=l[l.length-1]??f;r.push({start:y?x:f,end:y?f:x,index:a})});const c=[];return r.forEach((h,a)=>{c[a]=[],r.forEach((l,y)=>{var f;l.start&&h.end&&y!==a&&((f=l.start)!=null&&f.equals(h.end))&&c[a].push(l.index)})}),n.forEach((h,a)=>{const l=o[a];s[a].forEach(y=>{y.add(h.getNormal(h.getTForPoint(y)).scale(l?t:-t))})}),c.forEach((h,a)=>{const l=s[a];h.forEach(y=>{const f=s[y],x=ln(l[l.length-1],l[l.length-2]??l[l.length-1],f[0],f[1]??f[0]);x&&(l[l.length-1].copy(x),f[0].copy(x))})}),this}getMinMax(t=p.MAX,n=p.MIN,r=!0){const o=this.strokeWidth;return this.curves.forEach(s=>{if(s.getMinMax(t,n),r&&o>1){const c=o/2,h=s.isClockwise(),a=[];for(let l=0;l<=1;l+=1/s.arcLengthDivision){const y=s.getPoint(l),f=s.getNormal(l),x=f.clone().scale(h?c:-c),u=f.clone().scale(h?-c:c);a.push(y.clone().add(x),y.clone().add(u),y.clone().add({x:c,y:0}),y.clone().add({x:-c,y:0}),y.clone().add({x:0,y:c}),y.clone().add({x:0,y:-c}),y.clone().add({x:c,y:c}),y.clone().add({x:-c,y:-c}))}t.min(...a),n.max(...a)}}),{min:t,max:n}}strokeTriangulate(t){const n=(t==null?void 0:t.indices)??[],r=(t==null?void 0:t.vertices)??[];return this.curves.forEach(o=>{o.strokeTriangulate({...t,indices:n,vertices:r})}),{indices:n,vertices:r}}getBoundingBox(t=!0){const{min:n,max:r}=this.getMinMax(void 0,void 0,t);return new V(n.x,n.y,r.x-n.x,r.y-n.y)}drawTo(t,n={}){n={...this.style,...n};const{fill:r="#000",stroke:o="none"}=n;return t.beginPath(),t.save(),Ct(t,n),this.curves.forEach(s=>{s.drawTo(t)}),r!=="none"&&t.fill(),o!=="none"&&t.stroke(),t.restore(),this}drawControlPointsTo(t,n={}){n={...this.style,...n};const{fill:r="#000",stroke:o="none"}=n;return t.beginPath(),t.save(),Ct(t,n),this.getControlPointRefs().forEach(s=>{R(t,s.x,s.y,{radius:4})}),r!=="none"&&t.fill(),o!=="none"&&t.stroke(),t.restore(),this}toCommands(){return this.curves.flatMap(t=>t.toCommands())}toData(){return this.curves.filter(t=>t.curves.length).map(t=>t.toData()).join(" ")}toSVGPathString(){const t={...this.style,fill:this.style.fill??"#000",stroke:this.style.stroke??"none"},n={};for(const o in t)t[o]!==void 0&&(n[an(o)]=t[o]);Object.assign(n,{"stroke-width":`${this.strokeWidth}px`});let r="";for(const o in n)n[o]!==void 0&&(r+=`${o}:${n[o]};`);return`<path d="${this.toData()}" style="${r}"></path>`}copy(t){return super.copy(t),this.currentCurve=t.currentCurve.clone(),this.style={...t.style},this}}class le{constructor(e=[],t){this.paths=e,this.viewBox=t}getBoundingBox(e=!0){if(!this.paths.length)return;const t=p.MAX,n=p.MIN;return this.paths.forEach(r=>r.getMinMax(t,n,e)),new V(t.x,t.y,n.x-t.x,n.y-t.y)}toSVGString(){const{x:e,y:t,width:n,height:r}=this.getBoundingBox(),o=this.paths.map(s=>s.toSVGPathString()).join("");return`<svg viewBox="${e} ${t} ${n} ${r}" width="${n}px" height="${r}px" xmlns="http://www.w3.org/2000/svg">${o}</svg>`}toSVGUrl(){return`data:image/svg+xml;base64,${btoa(this.toSVGString())}`}toSVG(){return new DOMParser().parseFromString(this.toSVGString(),"image/svg+xml").documentElement}toCanvas(e={}){const{pixelRatio:t=2,...n}=e,{left:r,top:o,width:s,height:c}=this.getBoundingBox(),h=document.createElement("canvas");h.width=s*t,h.height=c*t,h.style.width=`${s}px`,h.style.height=`${c}px`;const a=h.getContext("2d");return a&&(a.scale(t,t),a.translate(-r,-o),this.paths.forEach(l=>{l.drawTo(a,n)})),h}}const ue="data:image/svg+xml;",ye=`${ue}base64,`,fe=`${ue}charset=utf8,`;function xe(i){if(typeof i=="string"){let e;i.startsWith(ye)?(i=i.substring(ye.length,i.length),e=atob(i)):i.startsWith(fe)?(i=i.substring(fe.length,i.length),e=decodeURIComponent(i)):e=i;const t=new DOMParser().parseFromString(e,"text/xml"),n=t.querySelector("parsererror");if(n)throw new Error(`${n.textContent??"parser error"}
|
|
2
|
+
${e}`);return t.documentElement}else return i}const un="px",yn=90,pe=["mm","cm","in","pt","pc","px"],ge={mm:{mm:1,cm:.1,in:1/25.4,pt:72/25.4,pc:6/25.4,px:-1},cm:{mm:10,cm:1,in:1/2.54,pt:72/2.54,pc:6/2.54,px:-1},in:{mm:25.4,cm:2.54,in:1,pt:72,pc:6,px:-1},pt:{mm:25.4/72,cm:2.54/72,in:1/72,pt:1,pc:6/72,px:-1},pc:{mm:25.4/6,cm:2.54/6,in:1/6,pt:72/6,pc:1,px:-1},px:{px:1}};function L(i){let e="px";if(typeof i=="string"||i instanceof String)for(let n=0,r=pe.length;n<r;n++){const o=pe[n];if(i.endsWith(o)){e=o,i=i.substring(0,i.length-o.length);break}}let t;return t=ge[e][un],t<0&&(t=ge[e].in*yn),t*Number.parseFloat(i)}const fn=new z,wt=new z,de=new z,me=new z;function xn(i,e,t){if(!(i.hasAttribute("transform")||i.nodeName==="use"&&(i.hasAttribute("x")||i.hasAttribute("y"))))return null;const n=pn(i);return t.length>0&&n.premultiply(t[t.length-1]),e.copy(n),t.push(n),n}function pn(i){const e=new z,t=fn;if(i.nodeName==="use"&&(i.hasAttribute("x")||i.hasAttribute("y"))&&e.translate(L(i.getAttribute("x")),L(i.getAttribute("y"))),i.hasAttribute("transform")){const n=i.getAttribute("transform").split(")");for(let r=n.length-1;r>=0;r--){const o=n[r].trim();if(o==="")continue;const s=o.indexOf("("),c=o.length;if(s>0&&s<c){const h=o.slice(0,s),a=Z(o.slice(s+1));switch(t.identity(),h){case"translate":if(a.length>=1){const l=a[0];let y=0;a.length>=2&&(y=a[1]),t.translate(l,y)}break;case"rotate":if(a.length>=1){let l=0,y=0,f=0;l=a[0]*Math.PI/180,a.length>=3&&(y=a[1],f=a[2]),wt.makeTranslation(-y,-f),de.makeRotation(l),me.multiplyMatrices(de,wt),wt.makeTranslation(y,f),t.multiplyMatrices(wt,me)}break;case"scale":a.length>=1&&t.scale(a[0],a[1]??a[0]);break;case"skewX":a.length===1&&t.set(1,Math.tan(a[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":a.length===1&&t.set(1,0,0,Math.tan(a[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":a.length===6&&t.set(a[0],a[2],a[4],a[1],a[3],a[5],0,0,1);break}}e.premultiply(t)}}return e}function gn(i){return new G().arc(L(i.getAttribute("cx")||0),L(i.getAttribute("cy")||0),L(i.getAttribute("r")||0),0,Math.PI*2)}function dn(i,e){if(!(!i.sheet||!i.sheet.cssRules||!i.sheet.cssRules.length))for(let t=0;t<i.sheet.cssRules.length;t++){const n=i.sheet.cssRules[t];if(n.type!==1)continue;const r=n.selectorText.split(/,/g).filter(Boolean).map(s=>s.trim()),o={};for(let s=n.style.length,c=0;c<s;c++){const h=n.style.item(c);o[h]=n.style.getPropertyValue(h)}for(let s=0;s<r.length;s++)e[r[s]]=Object.assign(e[r[s]]||{},{...o})}}function mn(i){return new G().ellipse(L(i.getAttribute("cx")||0),L(i.getAttribute("cy")||0),L(i.getAttribute("rx")||0),L(i.getAttribute("ry")||0),0,0,Math.PI*2)}function Mn(i){return new G().moveTo(L(i.getAttribute("x1")||0),L(i.getAttribute("y1")||0)).lineTo(L(i.getAttribute("x2")||0),L(i.getAttribute("y2")||0))}function Pn(i){const e=new G,t=i.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const wn=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function vn(i){var n;const e=new G;let t=0;return(n=i.getAttribute("points"))==null||n.replace(wn,(r,o,s)=>{const c=L(o),h=L(s);return t===0?e.moveTo(c,h):e.lineTo(c,h),t++,r}),e.currentCurve.autoClose=!0,e}const Tn=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function An(i){var n;const e=new G;let t=0;return(n=i.getAttribute("points"))==null||n.replace(Tn,(r,o,s)=>{const c=L(o),h=L(s);return t===0?e.moveTo(c,h):e.lineTo(c,h),t++,r}),e.currentCurve.autoClose=!1,e}function Cn(i){const e=L(i.getAttribute("x")||0),t=L(i.getAttribute("y")||0),n=L(i.getAttribute("rx")||i.getAttribute("ry")||0),r=L(i.getAttribute("ry")||i.getAttribute("rx")||0),o=L(i.getAttribute("width")),s=L(i.getAttribute("height")),c=1-.551915024494,h=new G;return h.moveTo(e+n,t),h.lineTo(e+o-n,t),(n!==0||r!==0)&&h.bezierCurveTo(e+o-n*c,t,e+o,t+r*c,e+o,t+r),h.lineTo(e+o,t+s-r),(n!==0||r!==0)&&h.bezierCurveTo(e+o,t+s-r*c,e+o-n*c,t+s,e+o-n,t+s),h.lineTo(e+n,t+s),(n!==0||r!==0)&&h.bezierCurveTo(e+n*c,t+s,e,t+s-r*c,e,t+s-r),h.lineTo(e,t+r),(n!==0||r!==0)&&h.bezierCurveTo(e,t+r*c,e+n*c,t,e+n,t),h}function U(i,e,t){e=Object.assign({},e);let n={};if(i.hasAttribute("class")){const a=i.getAttribute("class").split(/\s/).filter(Boolean).map(l=>l.trim());for(let l=0;l<a.length;l++)n=Object.assign(n,t[`.${a[l]}`])}i.hasAttribute("id")&&(n=Object.assign(n,t[`#${i.getAttribute("id")}`]));for(let a=i.style.length,l=0;l<a;l++){const y=i.style.item(l),f=i.style.getPropertyValue(y);e[y]=f,n[y]=f}function r(a,l,y=o){i.hasAttribute(a)&&(e[l]=y(i.getAttribute(a))),n[a]&&(e[l]=y(n[a]))}function o(a){return a.startsWith("url")&&console.warn("url access in attributes is not implemented."),a}function s(a){return Math.max(0,Math.min(1,L(a)))}function c(a){return Math.max(0,L(a))}function h(a){return a.split(" ").filter(l=>l!=="").map(l=>L(l))}return r("fill","fill"),r("fill-opacity","fillOpacity",s),r("fill-rule","fillRule"),r("opacity","opacity",s),r("stroke","stroke"),r("stroke-opacity","strokeOpacity",s),r("stroke-width","strokeWidth",c),r("stroke-linecap","strokeLinecap"),r("stroke-linejoin","strokeLinejoin"),r("stroke-miterlimit","strokeMiterlimit",c),r("stroke-dasharray","strokeDasharray",h),r("stroke-dashoffset","strokeDashoffset",L),r("visibility","visibility"),e}function Rt(i,e,t=[],n={}){var y;if(i.nodeType!==1)return t;let r=!1,o=null,s={...e};switch(i.nodeName){case"svg":s=U(i,s,n);break;case"style":dn(i,n);break;case"g":s=U(i,s,n);break;case"path":s=U(i,s,n),i.hasAttribute("d")&&(o=Pn(i));break;case"rect":s=U(i,s,n),o=Cn(i);break;case"polygon":s=U(i,s,n),o=vn(i);break;case"polyline":s=U(i,s,n),o=An(i);break;case"circle":s=U(i,s,n),o=gn(i);break;case"ellipse":s=U(i,s,n),o=mn(i);break;case"line":s=U(i,s,n),o=Mn(i);break;case"defs":r=!0;break;case"use":{s=U(i,s,n);const x=(i.getAttributeNS("http://www.w3.org/1999/xlink","href")||i.getAttribute("href")||"").substring(1),u=(y=i.viewportElement)==null?void 0:y.getElementById(x);u?Rt(u,s,t,n):console.warn(`'use node' references non-existent node id: ${x}`);break}default:console.warn(i);break}if(s.display==="none")return t;const c=new z,h=[],a=xn(i,c,h);o&&(o.applyTransform(c),t.push(o),o.style={...s});const l=i.childNodes;for(let f=0,x=l.length;f<x;f++){const u=l[f];r&&u.nodeName!=="style"&&u.nodeName!=="defs"||Rt(u,s,t,n)}return a&&(h.pop(),h.length>0?c.copy(h[h.length-1]):c.identity()),t}function bn(i){var t;const e=xe(i);return new le(Rt(e,{}),(t=e.getAttribute("viewBox"))==null?void 0:t.trim().split(" ").map(n=>Number(n)))}v.ArcCurve=re,v.BoundingBox=V,v.CompositeCurve=rt,v.CubicBezierCurve=Mt,v.Curve=Y,v.CurvePath=lt,v.EllipseCurve=oe,v.EquilateralPloygonCurve=hn,v.LineCurve=j,v.Matrix3=z,v.Path2D=G,v.Path2DSet=le,v.PloygonCurve=Ot,v.QuadraticBezierCurve=Pt,v.RectangleCurve=ce,v.RoundRectangleCurve=he,v.SplineCurve=ae,v.Vector2=p,v.catmullRom=St,v.cubicBezier=Et,v.drawPoint=R,v.fillTriangulate=Nt,v.getAdaptiveCubicBezierCurvePoints=Ht,v.getAdaptiveQuadraticBezierCurvePoints=Qt,v.parseArcCommand=jt,v.parsePathDataArgs=Z,v.quadraticBezier=qt,v.setCanvasContext=Ct,v.strokeTriangulate=Jt,v.svgPathCommandsAddToPath2D=kt,v.svgPathCommandsToData=Gt,v.svgPathDataToCommands=It,v.svgToDOM=xe,v.svgToPath2DSet=bn,Object.defineProperty(v,Symbol.toStringTag,{value:"Module"})});
|
package/dist/index.mjs
CHANGED
|
@@ -1056,7 +1056,7 @@ function fillTriangulate(points, options = {}) {
|
|
|
1056
1056
|
const RECURSION_LIMIT$1 = 8;
|
|
1057
1057
|
const FLT_EPSILON$1 = 11920929e-14;
|
|
1058
1058
|
const PATH_DISTANCE_EPSILON$1 = 1;
|
|
1059
|
-
function getAdaptiveCubicBezierCurvePoints(sX, sY, x1, y1, x2, y2, x, y, smoothness = 0.5, points) {
|
|
1059
|
+
function getAdaptiveCubicBezierCurvePoints(sX, sY, x1, y1, x2, y2, x, y, smoothness = 0.5, points = []) {
|
|
1060
1060
|
const scale = 1;
|
|
1061
1061
|
const smoothing = Math.min(
|
|
1062
1062
|
0.99,
|
|
@@ -1126,7 +1126,7 @@ function recursive$1(x1, y1, x2, y2, x3, y3, x4, y4, points, distanceTolerance,
|
|
|
1126
1126
|
const RECURSION_LIMIT = 8;
|
|
1127
1127
|
const FLT_EPSILON = 11920929e-14;
|
|
1128
1128
|
const PATH_DISTANCE_EPSILON = 1;
|
|
1129
|
-
function getAdaptiveQuadraticBezierCurvePoints(sX, sY, x1, y1, x, y, smoothness = 0.5, points) {
|
|
1129
|
+
function getAdaptiveQuadraticBezierCurvePoints(sX, sY, x1, y1, x, y, smoothness = 0.5, points = []) {
|
|
1130
1130
|
const scale = 1;
|
|
1131
1131
|
const smoothing = Math.min(
|
|
1132
1132
|
0.99,
|
|
@@ -1960,23 +1960,77 @@ class RoundCurve extends Curve {
|
|
|
1960
1960
|
return [this._center];
|
|
1961
1961
|
}
|
|
1962
1962
|
getAdaptivePointArray(output = []) {
|
|
1963
|
-
const { cx, cy, rx, ry, dx, dy
|
|
1963
|
+
const { cx, cy, rx, ry, dx, dy } = this;
|
|
1964
1964
|
if (!(rx >= 0 && ry >= 0 && dx >= 0 && dy >= 0)) {
|
|
1965
1965
|
return output;
|
|
1966
1966
|
}
|
|
1967
|
-
const
|
|
1968
|
-
const
|
|
1969
|
-
const
|
|
1970
|
-
const
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1967
|
+
const n = Math.ceil(2.3 * Math.sqrt(rx + ry));
|
|
1968
|
+
const x = cx;
|
|
1969
|
+
const y = cy;
|
|
1970
|
+
const m = n * 8 + (dx ? 4 : 0) + (dy ? 4 : 0);
|
|
1971
|
+
if (m === 0) {
|
|
1972
|
+
return output;
|
|
1973
|
+
}
|
|
1974
|
+
if (n === 0) {
|
|
1975
|
+
output[0] = output[6] = x + dx;
|
|
1976
|
+
output[1] = output[3] = y + dy;
|
|
1977
|
+
output[2] = output[4] = x - dx;
|
|
1978
|
+
output[5] = output[7] = y - dy;
|
|
1979
|
+
return output;
|
|
1980
|
+
}
|
|
1981
|
+
let j1 = 0;
|
|
1982
|
+
let j2 = n * 4 + (dx ? 2 : 0) + 2;
|
|
1983
|
+
let j3 = j2;
|
|
1984
|
+
let j4 = m;
|
|
1985
|
+
let x0 = dx + rx;
|
|
1986
|
+
let y0 = dy;
|
|
1987
|
+
let x1 = x + x0;
|
|
1988
|
+
let x2 = x - x0;
|
|
1989
|
+
let y1 = y + y0;
|
|
1990
|
+
output[j1++] = x1;
|
|
1991
|
+
output[j1++] = y1;
|
|
1992
|
+
output[--j2] = y1;
|
|
1993
|
+
output[--j2] = x2;
|
|
1994
|
+
if (dy) {
|
|
1995
|
+
const y22 = y - y0;
|
|
1996
|
+
output[j3++] = x2;
|
|
1997
|
+
output[j3++] = y22;
|
|
1998
|
+
output[--j4] = y22;
|
|
1999
|
+
output[--j4] = x1;
|
|
2000
|
+
}
|
|
2001
|
+
for (let i = 1; i < n; i++) {
|
|
2002
|
+
const a = Math.PI / 2 * (i / n);
|
|
2003
|
+
const x02 = dx + Math.cos(a) * rx;
|
|
2004
|
+
const y02 = dy + Math.sin(a) * ry;
|
|
2005
|
+
const x12 = x + x02;
|
|
2006
|
+
const x22 = x - x02;
|
|
2007
|
+
const y12 = y + y02;
|
|
2008
|
+
const y22 = y - y02;
|
|
2009
|
+
output[j1++] = x12;
|
|
2010
|
+
output[j1++] = y12;
|
|
2011
|
+
output[--j2] = y12;
|
|
2012
|
+
output[--j2] = x22;
|
|
2013
|
+
output[j3++] = x22;
|
|
2014
|
+
output[j3++] = y22;
|
|
2015
|
+
output[--j4] = y22;
|
|
2016
|
+
output[--j4] = x12;
|
|
2017
|
+
}
|
|
2018
|
+
x0 = dx;
|
|
2019
|
+
y0 = dy + ry;
|
|
2020
|
+
x1 = x + x0;
|
|
2021
|
+
x2 = x - x0;
|
|
2022
|
+
y1 = y + y0;
|
|
2023
|
+
const y2 = y - y0;
|
|
2024
|
+
output[j1++] = x1;
|
|
2025
|
+
output[j1++] = y1;
|
|
2026
|
+
output[--j4] = y2;
|
|
2027
|
+
output[--j4] = x1;
|
|
2028
|
+
if (dx) {
|
|
2029
|
+
output[j1++] = x2;
|
|
2030
|
+
output[j1++] = y1;
|
|
2031
|
+
output[--j4] = y2;
|
|
2032
|
+
output[--j4] = x2;
|
|
2033
|
+
}
|
|
1980
2034
|
return output;
|
|
1981
2035
|
}
|
|
1982
2036
|
fillTriangulate(options = {}) {
|
|
@@ -1984,8 +2038,8 @@ class RoundCurve extends Curve {
|
|
|
1984
2038
|
vertices = [],
|
|
1985
2039
|
indices = [],
|
|
1986
2040
|
verticesStride = 2,
|
|
1987
|
-
verticesOffset =
|
|
1988
|
-
indicesOffset =
|
|
2041
|
+
verticesOffset = vertices.length / verticesStride,
|
|
2042
|
+
indicesOffset = indices.length
|
|
1989
2043
|
} = options;
|
|
1990
2044
|
const points = this.getAdaptivePointArray();
|
|
1991
2045
|
if (points.length === 0) {
|
|
@@ -2197,7 +2251,7 @@ class ArcCurve extends RoundCurve {
|
|
|
2197
2251
|
super(
|
|
2198
2252
|
new Vector2(cx, cy),
|
|
2199
2253
|
new Vector2(radius, radius),
|
|
2200
|
-
new Vector2(
|
|
2254
|
+
new Vector2(),
|
|
2201
2255
|
0,
|
|
2202
2256
|
startAngle,
|
|
2203
2257
|
endAngle,
|
|
@@ -2241,6 +2295,121 @@ class ArcCurve extends RoundCurve {
|
|
|
2241
2295
|
}
|
|
2242
2296
|
}
|
|
2243
2297
|
|
|
2298
|
+
class LineCurve extends Curve {
|
|
2299
|
+
constructor(p1 = new Vector2(), p2 = new Vector2()) {
|
|
2300
|
+
super();
|
|
2301
|
+
this.p1 = p1;
|
|
2302
|
+
this.p2 = p2;
|
|
2303
|
+
}
|
|
2304
|
+
static from(p1x, p1y, p2x, p2y) {
|
|
2305
|
+
return new LineCurve(
|
|
2306
|
+
new Vector2(p1x, p1y),
|
|
2307
|
+
new Vector2(p2x, p2y)
|
|
2308
|
+
);
|
|
2309
|
+
}
|
|
2310
|
+
getPoint(t, output = new Vector2()) {
|
|
2311
|
+
if (t === 1) {
|
|
2312
|
+
output.copy(this.p2);
|
|
2313
|
+
} else {
|
|
2314
|
+
output.copy(this.p2).sub(this.p1).scale(t).add(this.p1);
|
|
2315
|
+
}
|
|
2316
|
+
return output;
|
|
2317
|
+
}
|
|
2318
|
+
getPointAt(u, output = new Vector2()) {
|
|
2319
|
+
return this.getPoint(u, output);
|
|
2320
|
+
}
|
|
2321
|
+
getTangent(_t, output = new Vector2()) {
|
|
2322
|
+
return output.subVectors(this.p2, this.p1).normalize();
|
|
2323
|
+
}
|
|
2324
|
+
getTangentAt(u, output = new Vector2()) {
|
|
2325
|
+
return this.getTangent(u, output);
|
|
2326
|
+
}
|
|
2327
|
+
getControlPointRefs() {
|
|
2328
|
+
return [this.p1, this.p2];
|
|
2329
|
+
}
|
|
2330
|
+
getAdaptivePointArray(output = []) {
|
|
2331
|
+
output.push(
|
|
2332
|
+
this.p1.x,
|
|
2333
|
+
this.p1.y,
|
|
2334
|
+
this.p2.x,
|
|
2335
|
+
this.p2.y
|
|
2336
|
+
);
|
|
2337
|
+
return output;
|
|
2338
|
+
}
|
|
2339
|
+
getMinMax(min = Vector2.MAX, max = Vector2.MIN) {
|
|
2340
|
+
const { p1, p2 } = this;
|
|
2341
|
+
min.x = Math.min(min.x, p1.x, p2.x);
|
|
2342
|
+
min.y = Math.min(min.y, p1.y, p2.y);
|
|
2343
|
+
max.x = Math.max(max.x, p1.x, p2.x);
|
|
2344
|
+
max.y = Math.max(max.y, p1.y, p2.y);
|
|
2345
|
+
return { min, max };
|
|
2346
|
+
}
|
|
2347
|
+
toCommands() {
|
|
2348
|
+
const { p1, p2 } = this;
|
|
2349
|
+
return [
|
|
2350
|
+
{ type: "M", x: p1.x, y: p1.y },
|
|
2351
|
+
{ type: "L", x: p2.x, y: p2.y }
|
|
2352
|
+
];
|
|
2353
|
+
}
|
|
2354
|
+
fillTriangulate(options = {}) {
|
|
2355
|
+
let {
|
|
2356
|
+
vertices = [],
|
|
2357
|
+
indices = [],
|
|
2358
|
+
verticesStride = 2,
|
|
2359
|
+
verticesOffset = vertices.length / verticesStride,
|
|
2360
|
+
indicesOffset = indices.length
|
|
2361
|
+
} = options;
|
|
2362
|
+
const x = this.p1.x;
|
|
2363
|
+
const y = this.p1.y;
|
|
2364
|
+
const width = this.p2.x - this.p1.x || 1;
|
|
2365
|
+
const height = this.p2.y - this.p2.y || 1;
|
|
2366
|
+
const points = [
|
|
2367
|
+
x,
|
|
2368
|
+
y,
|
|
2369
|
+
x + width,
|
|
2370
|
+
y,
|
|
2371
|
+
x + width,
|
|
2372
|
+
y + height,
|
|
2373
|
+
x,
|
|
2374
|
+
y + height
|
|
2375
|
+
];
|
|
2376
|
+
let count = 0;
|
|
2377
|
+
verticesOffset *= verticesStride;
|
|
2378
|
+
vertices[verticesOffset + count] = points[0];
|
|
2379
|
+
vertices[verticesOffset + count + 1] = points[1];
|
|
2380
|
+
count += verticesStride;
|
|
2381
|
+
vertices[verticesOffset + count] = points[2];
|
|
2382
|
+
vertices[verticesOffset + count + 1] = points[3];
|
|
2383
|
+
count += verticesStride;
|
|
2384
|
+
vertices[verticesOffset + count] = points[6];
|
|
2385
|
+
vertices[verticesOffset + count + 1] = points[7];
|
|
2386
|
+
count += verticesStride;
|
|
2387
|
+
vertices[verticesOffset + count] = points[4];
|
|
2388
|
+
vertices[verticesOffset + count + 1] = points[5];
|
|
2389
|
+
count += verticesStride;
|
|
2390
|
+
const verticesIndex = verticesOffset / verticesStride;
|
|
2391
|
+
indices[indicesOffset++] = verticesIndex;
|
|
2392
|
+
indices[indicesOffset++] = verticesIndex + 1;
|
|
2393
|
+
indices[indicesOffset++] = verticesIndex + 2;
|
|
2394
|
+
indices[indicesOffset++] = verticesIndex + 1;
|
|
2395
|
+
indices[indicesOffset++] = verticesIndex + 3;
|
|
2396
|
+
indices[indicesOffset++] = verticesIndex + 2;
|
|
2397
|
+
return { vertices, indices };
|
|
2398
|
+
}
|
|
2399
|
+
drawTo(ctx) {
|
|
2400
|
+
const { p1, p2 } = this;
|
|
2401
|
+
ctx.lineTo(p1.x, p1.y);
|
|
2402
|
+
ctx.lineTo(p2.x, p2.y);
|
|
2403
|
+
return this;
|
|
2404
|
+
}
|
|
2405
|
+
copy(source) {
|
|
2406
|
+
super.copy(source);
|
|
2407
|
+
this.p1.copy(source.p1);
|
|
2408
|
+
this.p2.copy(source.p2);
|
|
2409
|
+
return this;
|
|
2410
|
+
}
|
|
2411
|
+
}
|
|
2412
|
+
|
|
2244
2413
|
class CompositeCurve extends Curve {
|
|
2245
2414
|
constructor(curves = []) {
|
|
2246
2415
|
super();
|
|
@@ -2315,6 +2484,44 @@ class CompositeCurve extends Curve {
|
|
|
2315
2484
|
});
|
|
2316
2485
|
return output;
|
|
2317
2486
|
}
|
|
2487
|
+
fillTriangulate(options) {
|
|
2488
|
+
const indices = options?.indices ?? [];
|
|
2489
|
+
const vertices = options?.vertices ?? [];
|
|
2490
|
+
const lines = [];
|
|
2491
|
+
const fillLines = () => {
|
|
2492
|
+
if (lines.length) {
|
|
2493
|
+
const pointArray = [];
|
|
2494
|
+
lines.forEach((line) => {
|
|
2495
|
+
const x = line.p1.x;
|
|
2496
|
+
const y = line.p1.y;
|
|
2497
|
+
if (pointArray[pointArray.length - 2] !== x || pointArray[pointArray.length - 1] !== y) {
|
|
2498
|
+
pointArray.push(x, y);
|
|
2499
|
+
}
|
|
2500
|
+
pointArray.push(line.p2.x, line.p2.y);
|
|
2501
|
+
});
|
|
2502
|
+
fillTriangulate(pointArray, {
|
|
2503
|
+
...options,
|
|
2504
|
+
indices,
|
|
2505
|
+
vertices
|
|
2506
|
+
});
|
|
2507
|
+
lines.length = 0;
|
|
2508
|
+
}
|
|
2509
|
+
};
|
|
2510
|
+
this.curves.forEach((curve) => {
|
|
2511
|
+
if (curve instanceof LineCurve) {
|
|
2512
|
+
lines.push(curve);
|
|
2513
|
+
} else {
|
|
2514
|
+
fillLines();
|
|
2515
|
+
curve.fillTriangulate({
|
|
2516
|
+
...options,
|
|
2517
|
+
indices,
|
|
2518
|
+
vertices
|
|
2519
|
+
});
|
|
2520
|
+
}
|
|
2521
|
+
});
|
|
2522
|
+
fillLines();
|
|
2523
|
+
return { indices, vertices };
|
|
2524
|
+
}
|
|
2318
2525
|
applyTransform(transform) {
|
|
2319
2526
|
this.curves.forEach((curve) => curve.applyTransform(transform));
|
|
2320
2527
|
return this;
|
|
@@ -2473,76 +2680,6 @@ class EllipseCurve extends RoundCurve {
|
|
|
2473
2680
|
}
|
|
2474
2681
|
}
|
|
2475
2682
|
|
|
2476
|
-
class LineCurve extends Curve {
|
|
2477
|
-
constructor(p1 = new Vector2(), p2 = new Vector2()) {
|
|
2478
|
-
super();
|
|
2479
|
-
this.p1 = p1;
|
|
2480
|
-
this.p2 = p2;
|
|
2481
|
-
}
|
|
2482
|
-
static from(p1x, p1y, p2x, p2y) {
|
|
2483
|
-
return new LineCurve(
|
|
2484
|
-
new Vector2(p1x, p1y),
|
|
2485
|
-
new Vector2(p2x, p2y)
|
|
2486
|
-
);
|
|
2487
|
-
}
|
|
2488
|
-
getPoint(t, output = new Vector2()) {
|
|
2489
|
-
if (t === 1) {
|
|
2490
|
-
output.copy(this.p2);
|
|
2491
|
-
} else {
|
|
2492
|
-
output.copy(this.p2).sub(this.p1).scale(t).add(this.p1);
|
|
2493
|
-
}
|
|
2494
|
-
return output;
|
|
2495
|
-
}
|
|
2496
|
-
getPointAt(u, output = new Vector2()) {
|
|
2497
|
-
return this.getPoint(u, output);
|
|
2498
|
-
}
|
|
2499
|
-
getTangent(_t, output = new Vector2()) {
|
|
2500
|
-
return output.subVectors(this.p2, this.p1).normalize();
|
|
2501
|
-
}
|
|
2502
|
-
getTangentAt(u, output = new Vector2()) {
|
|
2503
|
-
return this.getTangent(u, output);
|
|
2504
|
-
}
|
|
2505
|
-
getControlPointRefs() {
|
|
2506
|
-
return [this.p1, this.p2];
|
|
2507
|
-
}
|
|
2508
|
-
getAdaptivePointArray(output = []) {
|
|
2509
|
-
output.push(
|
|
2510
|
-
this.p1.x,
|
|
2511
|
-
this.p1.y,
|
|
2512
|
-
this.p2.x,
|
|
2513
|
-
this.p2.y
|
|
2514
|
-
);
|
|
2515
|
-
return output;
|
|
2516
|
-
}
|
|
2517
|
-
getMinMax(min = Vector2.MAX, max = Vector2.MIN) {
|
|
2518
|
-
const { p1, p2 } = this;
|
|
2519
|
-
min.x = Math.min(min.x, p1.x, p2.x);
|
|
2520
|
-
min.y = Math.min(min.y, p1.y, p2.y);
|
|
2521
|
-
max.x = Math.max(max.x, p1.x, p2.x);
|
|
2522
|
-
max.y = Math.max(max.y, p1.y, p2.y);
|
|
2523
|
-
return { min, max };
|
|
2524
|
-
}
|
|
2525
|
-
toCommands() {
|
|
2526
|
-
const { p1, p2 } = this;
|
|
2527
|
-
return [
|
|
2528
|
-
{ type: "M", x: p1.x, y: p1.y },
|
|
2529
|
-
{ type: "L", x: p2.x, y: p2.y }
|
|
2530
|
-
];
|
|
2531
|
-
}
|
|
2532
|
-
drawTo(ctx) {
|
|
2533
|
-
const { p1, p2 } = this;
|
|
2534
|
-
ctx.lineTo(p1.x, p1.y);
|
|
2535
|
-
ctx.lineTo(p2.x, p2.y);
|
|
2536
|
-
return this;
|
|
2537
|
-
}
|
|
2538
|
-
copy(source) {
|
|
2539
|
-
super.copy(source);
|
|
2540
|
-
this.p1.copy(source.p1);
|
|
2541
|
-
this.p2.copy(source.p2);
|
|
2542
|
-
return this;
|
|
2543
|
-
}
|
|
2544
|
-
}
|
|
2545
|
-
|
|
2546
2683
|
class PloygonCurve extends CompositeCurve {
|
|
2547
2684
|
//
|
|
2548
2685
|
}
|
|
@@ -2696,8 +2833,8 @@ class RectangleCurve extends PloygonCurve {
|
|
|
2696
2833
|
vertices = [],
|
|
2697
2834
|
indices = [],
|
|
2698
2835
|
verticesStride = 2,
|
|
2699
|
-
verticesOffset =
|
|
2700
|
-
indicesOffset =
|
|
2836
|
+
verticesOffset = vertices.length / verticesStride,
|
|
2837
|
+
indicesOffset = indices.length
|
|
2701
2838
|
} = options;
|
|
2702
2839
|
const { x, y, width, height } = this;
|
|
2703
2840
|
const points = [
|
|
@@ -2762,11 +2899,9 @@ class RoundRectangleCurve extends RoundCurve {
|
|
|
2762
2899
|
const cy = y + halfHeight;
|
|
2763
2900
|
const rx = Math.max(0, Math.min(radius, Math.min(halfWidth, halfHeight)));
|
|
2764
2901
|
const ry = rx;
|
|
2765
|
-
const dx = halfWidth - rx;
|
|
2766
|
-
const dy = halfHeight - ry;
|
|
2767
2902
|
this._center = new Vector2(cx, cy);
|
|
2768
2903
|
this._radius = new Vector2(rx, ry);
|
|
2769
|
-
this._diff = new Vector2(
|
|
2904
|
+
this._diff = new Vector2(halfWidth - rx, halfHeight - ry);
|
|
2770
2905
|
return this;
|
|
2771
2906
|
}
|
|
2772
2907
|
drawTo(ctx) {
|
|
@@ -3284,18 +3419,6 @@ class Path2D extends CompositeCurve {
|
|
|
3284
3419
|
});
|
|
3285
3420
|
return { min, max };
|
|
3286
3421
|
}
|
|
3287
|
-
fillTriangulate(options) {
|
|
3288
|
-
const indices = options?.indices ?? [];
|
|
3289
|
-
const vertices = options?.vertices ?? [];
|
|
3290
|
-
this.curves.forEach((curve) => {
|
|
3291
|
-
curve.fillTriangulate({
|
|
3292
|
-
...options,
|
|
3293
|
-
indices,
|
|
3294
|
-
vertices
|
|
3295
|
-
});
|
|
3296
|
-
});
|
|
3297
|
-
return { indices, vertices };
|
|
3298
|
-
}
|
|
3299
3422
|
strokeTriangulate(options) {
|
|
3300
3423
|
const indices = options?.indices ?? [];
|
|
3301
3424
|
const vertices = options?.vertices ?? [];
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "modern-path2d",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.2.
|
|
4
|
+
"version": "1.2.18",
|
|
5
5
|
"packageManager": "pnpm@9.15.1",
|
|
6
6
|
"description": "A modern Path2D library, fully compatible with Web Path2D, with additional support for path animation, path deformation, path playback, etc.",
|
|
7
7
|
"author": "wxm",
|