pantograph2d 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/{QuadraticBezier-DxieHk9z.js → QuadraticBezier-B2g_Iyyl.js} +15 -14
  2. package/dist/{QuadraticBezier-DxieHk9z.js.map → QuadraticBezier-B2g_Iyyl.js.map} +1 -1
  3. package/dist/{QuadraticBezier--UZr_xcV.cjs → QuadraticBezier-CuRsIP_D.cjs} +4 -4
  4. package/dist/{QuadraticBezier--UZr_xcV.cjs.map → QuadraticBezier-CuRsIP_D.cjs.map} +1 -1
  5. package/dist/{draw-BUUNobTS.cjs → draw-9Elv4xz6.cjs} +2 -2
  6. package/dist/{draw-BUUNobTS.cjs.map → draw-9Elv4xz6.cjs.map} +1 -1
  7. package/dist/{draw-lOWnIN1o.js → draw-BJW5kfm9.js} +3 -3
  8. package/dist/{draw-lOWnIN1o.js.map → draw-BJW5kfm9.js.map} +1 -1
  9. package/dist/{models-DCkOI0hV.js → models-DdZq-waE.js} +2 -2
  10. package/dist/{models-DCkOI0hV.js.map → models-DdZq-waE.js.map} +1 -1
  11. package/dist/{models-CCo90hZc.cjs → models-LHGiMarC.cjs} +2 -2
  12. package/dist/{models-CCo90hZc.cjs.map → models-LHGiMarC.cjs.map} +1 -1
  13. package/dist/pantograph/drawShape.cjs +1 -1
  14. package/dist/pantograph/drawShape.cjs.map +1 -1
  15. package/dist/pantograph/drawShape.js +374 -14
  16. package/dist/pantograph/drawShape.js.map +1 -1
  17. package/dist/pantograph/models.cjs +1 -1
  18. package/dist/pantograph/models.js +2 -2
  19. package/dist/pantograph/svg.cjs +1 -1
  20. package/dist/pantograph/svg.js +1 -1
  21. package/dist/pantograph.cjs +2 -2
  22. package/dist/pantograph.cjs.map +1 -1
  23. package/dist/pantograph.js +674 -568
  24. package/dist/pantograph.js.map +1 -1
  25. package/dist/{svg-BY5h3CDD.cjs → svg-BzloQ9l1.cjs} +2 -2
  26. package/dist/{svg-BY5h3CDD.cjs.map → svg-BzloQ9l1.cjs.map} +1 -1
  27. package/dist/{svg-BIphc_zE.js → svg-D8vwkQf7.js} +2 -2
  28. package/dist/{svg-BIphc_zE.js.map → svg-D8vwkQf7.js.map} +1 -1
  29. package/dist/types/src/algorithms/tesselate/tesselateSegment.d.ts +7 -0
  30. package/dist/types/src/api/drawShape.d.ts +3 -0
  31. package/dist/types/src/drawShape/index.d.ts +1 -1
  32. package/dist/types/src/main.d.ts +1 -1
  33. package/dist/types/src/operations.d.ts +1 -0
  34. package/dist/types/src/tesselationOperations.d.ts +15 -0
  35. package/package.json +3 -3
@@ -1,566 +1,566 @@
1
- var yt = Object.defineProperty;
2
- var Ct = (n, t, e) => t in n ? yt(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;
3
- var P = (n, t, e) => Ct(n, typeof t != "symbol" ? t + "" : t, e);
4
- import { o as xt, D as U, f as lt } from "./draw-lOWnIN1o.js";
5
- import { a as _n, d as Vn } from "./draw-lOWnIN1o.js";
6
- import { F as m, L as w, D as h, a as N, s as Dt, b as Ot, c as Bt, i as Rt, S as y, l as zt, p as Tt, d as $t, e as ut, g as Gt } from "./models-DCkOI0hV.js";
7
- import { h as qn } from "./models-DCkOI0hV.js";
8
- import { r as Ut, z as _t, l as Vt, e as b, n as ht, b as F, a as Kt, s as qt, m as Ht, o as gt, L as A, A as E, C as $, p as Y, q as V, d as Nt, T as Jt, g as I, E as pt, Q as dt, t as Qt, c as Xt, D as Yt, B as Zt } from "./QuadraticBezier-DxieHk9z.js";
9
- import { s as Wt, a as jt, b as tn, c as nn, d as en, w as Z } from "./svg-BIphc_zE.js";
10
- function L(n) {
11
- if (n instanceof m)
12
- return [n];
13
- if (n instanceof w)
14
- return [new m(n)];
15
- if (n instanceof h)
16
- return n.figures;
1
+ var Ut = Object.defineProperty;
2
+ var Vt = (t, n, e) => n in t ? Ut(t, n, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[n] = e;
3
+ var M = (t, n, e) => Vt(t, typeof n != "symbol" ? n + "" : n, e);
4
+ import { o as Ht, D as U, f as Mt } from "./draw-BJW5kfm9.js";
5
+ import { a as oe, d as ce } from "./draw-BJW5kfm9.js";
6
+ import { F as m, L as P, D as h, a as W, s as Kt, b as Nt, c as qt, i as Xt, S as b, l as Jt, p as Qt, d as Yt, e as St, g as It } from "./models-DdZq-waE.js";
7
+ import { h as fe } from "./models-DdZq-waE.js";
8
+ import { l as Zt, z as Wt, m as jt, e as E, n as j, b as F, a as tn, s as nn, o as en, q as At, L as v, A as y, C as _, p as it, u as N, d as q, T as rn, g as A, E as vt, Q as bt, t as sn, c as on, D as Lt, v as Et, B as cn } from "./QuadraticBezier-B2g_Iyyl.js";
9
+ import { s as an, a as fn, b as un, c as ln, d as hn, w as ot } from "./svg-D8vwkQf7.js";
10
+ function x(t) {
11
+ if (t instanceof m)
12
+ return [t];
13
+ if (t instanceof P)
14
+ return [new m(t)];
15
+ if (t instanceof h)
16
+ return t.figures;
17
17
  throw new Error("Unknown shape");
18
18
  }
19
- function mt(n, t, e = 1e-9) {
20
- let s = [];
21
- const r = [], i = new Array(t.segments.length).fill(0).map(() => []);
22
- t.segments.forEach((a, f) => {
23
- n.segments.forEach((c) => {
24
- const { intersections: l, overlaps: p } = N(
25
- a,
19
+ function kt(t, n, e = 1e-9) {
20
+ let r = [];
21
+ const s = [], i = new Array(n.segments.length).fill(0).map(() => []);
22
+ n.segments.forEach((c, f) => {
23
+ t.segments.forEach((a) => {
24
+ const { intersections: u, overlaps: g } = W(
26
25
  c,
26
+ a,
27
27
  e
28
28
  );
29
- s.push(...l), i[f].push(...l), r.push(...p);
30
- const g = p.flatMap((d) => [
29
+ r.push(...u), i[f].push(...u), s.push(...g);
30
+ const p = g.flatMap((d) => [
31
31
  d.firstPoint,
32
32
  d.lastPoint
33
33
  ]);
34
- s.push(...g), i[f].push(...g);
34
+ r.push(...p), i[f].push(...p);
35
35
  });
36
- }), s = Ut(s, e);
37
- const o = _t([t.segments, i]).flatMap(([a, f]) => f.length ? a.splitAt(f) : [a]);
36
+ }), r = Zt(r, e);
37
+ const o = Wt([n.segments, i]).flatMap(([c, f]) => f.length ? c.splitAt(f) : [c]);
38
38
  return Array.from(
39
- Dt(
39
+ Kt(
40
40
  o,
41
- s,
42
- r
41
+ r,
42
+ s
43
43
  )
44
44
  );
45
45
  }
46
- function J(n, t, e = !1) {
47
- return mt(t, n).filter((r) => {
48
- const i = r.segments[0].midPoint;
49
- return t.onStroke(i) ? !e : !t.contains(i);
46
+ function tt(t, n, e = !1) {
47
+ return kt(n, t).filter((s) => {
48
+ const i = s.segments[0].midPoint;
49
+ return n.onStroke(i) ? !e : !n.contains(i);
50
50
  });
51
51
  }
52
- function Q(n, t, e = !1) {
53
- return mt(t, n).filter((r) => {
54
- const i = r.segments[0].midPoint;
55
- return t.onStroke(i) ? !e : t.contains(i);
52
+ function nt(t, n, e = !1) {
53
+ return kt(n, t).filter((s) => {
54
+ const i = s.segments[0].midPoint;
55
+ return n.onStroke(i) ? !e : n.contains(i);
56
56
  });
57
57
  }
58
- function W(n, t, e = !1) {
59
- const s = J(
60
- n,
61
- t.contour,
58
+ function ct(t, n, e = !1) {
59
+ const r = tt(
60
+ t,
61
+ n.contour,
62
62
  e
63
- ), r = t.holes.flatMap(
64
- (i) => Q(n, i, e)
63
+ ), s = n.holes.flatMap(
64
+ (i) => nt(t, i, e)
65
65
  );
66
- return [...s, ...r];
66
+ return [...r, ...s];
67
67
  }
68
- function j(n, t, e = !1) {
69
- let s = Q(
70
- n,
71
- t.contour,
68
+ function at(t, n, e = !1) {
69
+ let r = nt(
70
+ t,
71
+ n.contour,
72
72
  e
73
73
  );
74
- return t.holes.forEach((r) => {
75
- s = s.flatMap(
76
- (i) => J(i, r, e)
74
+ return n.holes.forEach((s) => {
75
+ r = r.flatMap(
76
+ (i) => tt(i, s, e)
77
77
  );
78
- }), s;
78
+ }), r;
79
79
  }
80
- function sn(n, t) {
80
+ function gn(t, n) {
81
81
  return new h(
82
- Ot(L(n), L(t))
82
+ Nt(x(t), x(n))
83
83
  );
84
84
  }
85
- function z(n) {
86
- return n.reduce(
87
- (t, e) => sn(t, e),
85
+ function z(t) {
86
+ return t.reduce(
87
+ (n, e) => gn(n, e),
88
88
  new h()
89
89
  );
90
90
  }
91
- function Pt(n, t) {
91
+ function Ft(t, n) {
92
92
  return new h(
93
- Bt(L(n), L(t))
93
+ qt(x(t), x(n))
94
94
  );
95
95
  }
96
- function yn(n, t) {
96
+ function Xn(t, n) {
97
97
  return new h(
98
- Rt(L(n), L(t))
98
+ Xt(x(t), x(n))
99
99
  );
100
100
  }
101
- function Cn(n, t, e = !0) {
102
- if (t instanceof w)
103
- return J(n, t, e);
104
- if (t instanceof m)
105
- return W(n, t, e);
106
- let s = [new y([...n.segments])];
107
- return t.figures.forEach((r) => {
108
- s = s.flatMap((i) => W(i, r, e));
109
- }), s;
110
- }
111
- function xn(n, t, e = !1) {
112
- if (t instanceof w)
113
- return Q(n, t, e);
114
- if (t instanceof m)
115
- return j(n, t, e);
116
- let s = [new y([...n.segments])];
117
- return t.figures.forEach((r) => {
118
- s = s.flatMap((i) => j(i, r, e));
119
- }), s;
101
+ function Jn(t, n, e = !0) {
102
+ if (n instanceof P)
103
+ return tt(t, n, e);
104
+ if (n instanceof m)
105
+ return ct(t, n, e);
106
+ let r = [new b([...t.segments])];
107
+ return n.figures.forEach((s) => {
108
+ r = r.flatMap((i) => ct(i, s, e));
109
+ }), r;
110
+ }
111
+ function Qn(t, n, e = !1) {
112
+ if (n instanceof P)
113
+ return nt(t, n, e);
114
+ if (n instanceof m)
115
+ return at(t, n, e);
116
+ let r = [new b([...t.segments])];
117
+ return n.figures.forEach((s) => {
118
+ r = r.flatMap((i) => at(i, s, e));
119
+ }), r;
120
120
  }
121
- function tt(n) {
122
- return n < 0 ? "before" : n > 1 ? "after" : "between";
121
+ function ft(t) {
122
+ return t < 0 ? "before" : t > 1 ? "after" : "between";
123
123
  }
124
- const nt = (n, t, e) => {
124
+ const ut = (t, n, e) => {
125
125
  if (e === "before")
126
- return n.distanceFrom(t.firstPoint);
126
+ return t.distanceFrom(n.firstPoint);
127
127
  if (e === "after")
128
- return n.distanceFrom(t.lastPoint);
128
+ return t.distanceFrom(n.lastPoint);
129
129
  throw new Error("Invalid position");
130
130
  };
131
- function rn(n, t) {
132
- const e = Vt(n, t);
131
+ function pn(t, n) {
132
+ const e = jt(t, n);
133
133
  if (e === "parallel")
134
134
  return Math.min(
135
- n.distanceFrom(t.firstPoint),
136
- n.distanceFrom(t.lastPoint)
135
+ t.distanceFrom(n.firstPoint),
136
+ t.distanceFrom(n.lastPoint)
137
137
  );
138
- const { intersectionParam1: s, intersectionParam2: r } = e, i = tt(s), o = tt(r);
138
+ const { intersectionParam1: r, intersectionParam2: s } = e, i = ft(r), o = ft(s);
139
139
  if (i === "between" && o === "between")
140
140
  return 0;
141
141
  if (i === "between" && o !== "between")
142
- return nt(n, t, o);
142
+ return ut(t, n, o);
143
143
  if (o === "between" && i !== "between")
144
- return nt(t, n, i);
144
+ return ut(n, t, i);
145
145
  if (i === "before" && o === "before")
146
- return b(n.firstPoint, t.firstPoint);
146
+ return E(t.firstPoint, n.firstPoint);
147
147
  if (i === "after" && o === "after")
148
- return b(n.lastPoint, t.lastPoint);
148
+ return E(t.lastPoint, n.lastPoint);
149
149
  if (i === "before" && o === "after")
150
- return b(n.firstPoint, t.lastPoint);
150
+ return E(t.firstPoint, n.lastPoint);
151
151
  if (i === "after" && o === "before")
152
- return b(n.lastPoint, t.firstPoint);
152
+ return E(t.lastPoint, n.firstPoint);
153
153
  throw new Error("Invalid position");
154
154
  }
155
- function et(n, t) {
156
- if (zt(n, t).length > 0)
155
+ function lt(t, n) {
156
+ if (Jt(t, n).length > 0)
157
157
  return 0;
158
- const e = Tt(n, t.center);
159
- if (n.isOnSegment(e)) {
160
- const s = b(e, t.center);
161
- if (Math.abs(s - t.radius) < n.precision && t.isOnSegment(e))
158
+ const e = Qt(t, n.center);
159
+ if (t.isOnSegment(e)) {
160
+ const r = E(e, n.center);
161
+ if (Math.abs(r - n.radius) < t.precision && n.isOnSegment(e))
162
162
  return 0;
163
- if (s - t.radius > n.precision) {
164
- const r = ht(
165
- F(e, t.center)
166
- ), i = Kt(
167
- t.center,
168
- qt(r, t.radius)
163
+ if (r - n.radius > t.precision) {
164
+ const s = j(
165
+ F(e, n.center)
166
+ ), i = tn(
167
+ n.center,
168
+ nn(s, n.radius)
169
169
  );
170
- if (t.isOnSegment(i))
171
- return b(i, e);
170
+ if (n.isOnSegment(i))
171
+ return E(i, e);
172
172
  }
173
173
  }
174
174
  return Math.min(
175
- t.distanceFrom(n.firstPoint),
176
- t.distanceFrom(n.lastPoint),
177
175
  n.distanceFrom(t.firstPoint),
178
- n.distanceFrom(t.lastPoint)
176
+ n.distanceFrom(t.lastPoint),
177
+ t.distanceFrom(n.firstPoint),
178
+ t.distanceFrom(n.lastPoint)
179
179
  );
180
180
  }
181
- const on = (n, t) => {
182
- const e = n.angleToParam(t.firstAngle);
183
- if (n.isValidParameter(e)) return !0;
184
- const s = n.angleToParam(t.lastAngle);
185
- return !!n.isValidParameter(s);
181
+ const dn = (t, n) => {
182
+ const e = t.angleToParam(n.firstAngle);
183
+ if (t.isValidParameter(e)) return !0;
184
+ const r = t.angleToParam(n.lastAngle);
185
+ return !!t.isValidParameter(r);
186
186
  };
187
- function an(n, t) {
188
- if ($t(n, t, !0).length > 0) return 0;
189
- const e = b(n.center, t.center);
190
- if (e < n.precision && on(n, t))
191
- return Math.abs(n.radius - t.radius);
192
- const s = ht(F(t.center, n.center)), r = e - Math.abs(n.radius - t.radius) < n.precision;
193
- let i = Ht(s);
194
- r && t.radius > n.radius && (i += Math.PI);
195
- const o = r ? i : i + Math.PI, a = n.angleToParam(i), f = t.angleToParam(o);
196
- return n.isValidParameter(a) && t.isValidParameter(f) ? b(n.paramPoint(a), t.paramPoint(f)) : Math.min(
197
- n.distanceFrom(t.firstPoint),
198
- n.distanceFrom(t.lastPoint),
187
+ function mn(t, n) {
188
+ if (Yt(t, n, !0).length > 0) return 0;
189
+ const e = E(t.center, n.center);
190
+ if (e < t.precision && dn(t, n))
191
+ return Math.abs(t.radius - n.radius);
192
+ const r = j(F(n.center, t.center)), s = e - Math.abs(t.radius - n.radius) < t.precision;
193
+ let i = en(r);
194
+ s && n.radius > t.radius && (i += Math.PI);
195
+ const o = s ? i : i + Math.PI, c = t.angleToParam(i), f = n.angleToParam(o);
196
+ return t.isValidParameter(c) && n.isValidParameter(f) ? E(t.paramPoint(c), n.paramPoint(f)) : Math.min(
199
197
  t.distanceFrom(n.firstPoint),
200
- t.distanceFrom(n.lastPoint)
198
+ t.distanceFrom(n.lastPoint),
199
+ n.distanceFrom(t.firstPoint),
200
+ n.distanceFrom(t.lastPoint)
201
201
  );
202
202
  }
203
- function cn(n, t, e) {
204
- let s = 0, r = n.length - 1;
205
- for (; s <= r; ) {
206
- const i = Math.floor((s + r) / 2), o = e(n[i], t);
203
+ function Pn(t, n, e) {
204
+ let r = 0, s = t.length - 1;
205
+ for (; r <= s; ) {
206
+ const i = Math.floor((r + s) / 2), o = e(t[i], n);
207
207
  if (o < 0)
208
- s = i + 1;
208
+ r = i + 1;
209
209
  else if (o > 0)
210
- r = i - 1;
210
+ s = i - 1;
211
211
  else
212
212
  return i;
213
213
  }
214
- return -(s + 1);
214
+ return -(r + 1);
215
215
  }
216
- function fn(n, t, e) {
217
- const s = cn(n, t, e);
218
- s < 0 ? n.splice(-(s + 1), 0, t) : n.splice(s, 0, t);
216
+ function wn(t, n, e) {
217
+ const r = Pn(t, n, e);
218
+ r < 0 ? t.splice(-(r + 1), 0, n) : t.splice(r, 0, n);
219
219
  }
220
- class ln {
220
+ class Mn {
221
221
  constructor() {
222
- P(this, "buckets");
222
+ M(this, "buckets");
223
223
  this.buckets = [];
224
224
  }
225
- addInterval(t) {
226
- const e = this.buckets[t.rectangle.diagonalBucketIndex];
227
- e === void 0 ? this.buckets[t.rectangle.diagonalBucketIndex] = [t] : fn(e, t, (s, r) => s.value - r.value);
225
+ addInterval(n) {
226
+ const e = this.buckets[n.rectangle.diagonalBucketIndex];
227
+ e === void 0 ? this.buckets[n.rectangle.diagonalBucketIndex] = [n] : wn(e, n, (r, s) => r.value - s.value);
228
228
  }
229
- removeInterval(t) {
230
- const e = this.buckets[t.rectangle.diagonalBucketIndex];
229
+ removeInterval(n) {
230
+ const e = this.buckets[n.rectangle.diagonalBucketIndex];
231
231
  if (e === void 0)
232
232
  throw new Error("Interval not found");
233
233
  e.shift();
234
234
  }
235
235
  getBottomRightHullIntervals() {
236
- const t = [];
236
+ const n = [];
237
237
  for (let e = this.buckets.length - 1; e >= 0; e--) {
238
- const s = this.buckets[e];
239
- if (!s === void 0) continue;
240
- const r = s[0];
241
- if (r !== void 0) {
242
- if (!t.length) {
243
- t.push(r);
238
+ const r = this.buckets[e];
239
+ if (!r === void 0) continue;
240
+ const s = r[0];
241
+ if (s !== void 0) {
242
+ if (!n.length) {
243
+ n.push(s);
244
244
  continue;
245
245
  }
246
- for (; t.length && t[t.length - 1].value >= r.value; )
247
- t.pop();
248
- for (; t.length >= 2; ) {
249
- const i = t[t.length - 1], o = t[t.length - 2], a = (r.value - o.value) / ((r.rectangle.diagonal - o.rectangle.diagonal) * 2);
250
- if (o.value + (i.rectangle.diagonal - o.rectangle.diagonal) / 2 * a < i.value)
251
- t.pop();
246
+ for (; n.length && n[n.length - 1].value >= s.value; )
247
+ n.pop();
248
+ for (; n.length >= 2; ) {
249
+ const i = n[n.length - 1], o = n[n.length - 2], c = (s.value - o.value) / ((s.rectangle.diagonal - o.rectangle.diagonal) * 2);
250
+ if (o.value + (i.rectangle.diagonal - o.rectangle.diagonal) / 2 * c < i.value)
251
+ n.pop();
252
252
  else
253
253
  break;
254
254
  }
255
- t.push(r);
255
+ n.push(s);
256
256
  }
257
257
  }
258
- return t;
258
+ return n;
259
259
  }
260
260
  }
261
- class un {
262
- constructor(t, e) {
263
- P(this, "diagonal");
264
- P(this, "diagonalBucketIndex");
265
- P(this, "xLength");
266
- P(this, "yLength");
267
- P(this, "index");
268
- this.x = t, this.y = e, this.xLength = Math.pow(3, -t), this.yLength = Math.pow(3, -e), this.diagonal = Math.sqrt(
261
+ class Sn {
262
+ constructor(n, e) {
263
+ M(this, "diagonal");
264
+ M(this, "diagonalBucketIndex");
265
+ M(this, "xLength");
266
+ M(this, "yLength");
267
+ M(this, "index");
268
+ this.x = n, this.y = e, this.xLength = Math.pow(3, -n), this.yLength = Math.pow(3, -e), this.diagonal = Math.sqrt(
269
269
  this.xLength * this.xLength + this.yLength * this.yLength
270
- ), this.diagonalBucketIndex = t + e, this.index = `${t},${e}`;
271
- }
272
- }
273
- class hn {
274
- constructor(t, e = 1e-8, s = 1e3, r = 1e-6) {
275
- P(this, "rectangles");
276
- P(this, "buckets");
277
- P(this, "fMin");
278
- P(this, "argMin");
279
- P(this, "tol");
280
- this.fcn = t, this.endTolerance = e, this.maxIterations = s, this.epsilon = r, this.fcn = t, this.epsilon = r, this.endTolerance = e, this.maxIterations = s, this.rectangles = /* @__PURE__ */ new Map(), this.buckets = new ln();
281
- const i = [0.5, 0.5], o = this.rect(0, 0), a = this.fcn(i);
282
- this.buckets.addInterval(new O(i, a, o)), this.fMin = a, this.argMin = i, this.tol = o.diagonal;
283
- }
284
- registerInterval(t) {
285
- this.buckets.addInterval(t), t.value <= this.fMin && (this.fMin = t.value, this.argMin = t.center, this.tol = t.rectangle.diagonal);
286
- }
287
- rect(t, e) {
288
- const s = `${t},${e}`;
289
- return this.rectangles.has(s) || this.rectangles.set(s, new un(t, e)), this.rectangles.get(s);
290
- }
291
- splitInterval(t) {
292
- let e, s, r;
293
- const [i, o] = t.center;
294
- return t.rectangle.x <= t.rectangle.y ? (e = this.rect(t.rectangle.x + 1, t.rectangle.y), s = [i - e.xLength, o], r = [i + e.xLength, o]) : (e = this.rect(t.rectangle.x, t.rectangle.y + 1), s = [i, o - e.yLength], r = [i, o + e.yLength]), [
295
- new O(s, this.fcn(s), e),
296
- new O(t.center, t.value, e),
297
- new O(r, this.fcn(r), e)
270
+ ), this.diagonalBucketIndex = n + e, this.index = `${n},${e}`;
271
+ }
272
+ }
273
+ class In {
274
+ constructor(n, e = 1e-8, r = 1e3, s = 1e-6) {
275
+ M(this, "rectangles");
276
+ M(this, "buckets");
277
+ M(this, "fMin");
278
+ M(this, "argMin");
279
+ M(this, "tol");
280
+ this.fcn = n, this.endTolerance = e, this.maxIterations = r, this.epsilon = s, this.fcn = n, this.epsilon = s, this.endTolerance = e, this.maxIterations = r, this.rectangles = /* @__PURE__ */ new Map(), this.buckets = new Mn();
281
+ const i = [0.5, 0.5], o = this.rect(0, 0), c = this.fcn(i);
282
+ this.buckets.addInterval(new O(i, c, o)), this.fMin = c, this.argMin = i, this.tol = o.diagonal;
283
+ }
284
+ registerInterval(n) {
285
+ this.buckets.addInterval(n), n.value <= this.fMin && (this.fMin = n.value, this.argMin = n.center, this.tol = n.rectangle.diagonal);
286
+ }
287
+ rect(n, e) {
288
+ const r = `${n},${e}`;
289
+ return this.rectangles.has(r) || this.rectangles.set(r, new Sn(n, e)), this.rectangles.get(r);
290
+ }
291
+ splitInterval(n) {
292
+ let e, r, s;
293
+ const [i, o] = n.center;
294
+ return n.rectangle.x <= n.rectangle.y ? (e = this.rect(n.rectangle.x + 1, n.rectangle.y), r = [i - e.xLength, o], s = [i + e.xLength, o]) : (e = this.rect(n.rectangle.x, n.rectangle.y + 1), r = [i, o - e.yLength], s = [i, o + e.yLength]), [
295
+ new O(r, this.fcn(r), e),
296
+ new O(n.center, n.value, e),
297
+ new O(s, this.fcn(s), e)
298
298
  ];
299
299
  }
300
300
  single_iteration() {
301
- const t = this.buckets.getBottomRightHullIntervals();
302
- for (; t.length >= 2; ) {
303
- const e = t[0], s = t[1], r = (s.value - e.value) / ((s.rectangle.diagonal - e.rectangle.diagonal) / 2), i = e.value - r * s.value / 2;
301
+ const n = this.buckets.getBottomRightHullIntervals();
302
+ for (; n.length >= 2; ) {
303
+ const e = n[0], r = n[1], s = (r.value - e.value) / ((r.rectangle.diagonal - e.rectangle.diagonal) / 2), i = e.value - s * r.value / 2;
304
304
  if ((this.fMin - i) / Math.abs(this.fMin) < this.epsilon)
305
- t.shift();
305
+ n.shift();
306
306
  else
307
307
  break;
308
308
  }
309
- t.forEach((e) => {
309
+ n.forEach((e) => {
310
310
  this.buckets.removeInterval(e);
311
311
  });
312
- for (const e of t) {
313
- const [s, r, i] = this.splitInterval(e);
314
- this.registerInterval(s), this.registerInterval(r), this.registerInterval(i);
312
+ for (const e of n) {
313
+ const [r, s, i] = this.splitInterval(e);
314
+ this.registerInterval(r), this.registerInterval(s), this.registerInterval(i);
315
315
  }
316
316
  }
317
317
  run() {
318
- let t = 0;
319
- for (; this.tol > this.endTolerance / 2 && (this.single_iteration(), t++, !(t > this.maxIterations)); )
318
+ let n = 0;
319
+ for (; this.tol > this.endTolerance / 2 && (this.single_iteration(), n++, !(n > this.maxIterations)); )
320
320
  ;
321
321
  return {
322
322
  fMin: this.fMin,
323
323
  argMin: this.argMin,
324
324
  tol: this.tol,
325
- iterations: t
325
+ iterations: n
326
326
  };
327
327
  }
328
328
  }
329
329
  class O {
330
- constructor(t, e, s) {
331
- this.center = t, this.value = e, this.rectangle = s;
330
+ constructor(n, e, r) {
331
+ this.center = n, this.value = e, this.rectangle = r;
332
332
  }
333
333
  }
334
- function gn(n, t = 1e-8, e = 1e3, s = 1e-6) {
335
- return new hn(
336
- n,
334
+ function An(t, n = 1e-8, e = 1e3, r = 1e-6) {
335
+ return new In(
337
336
  t,
337
+ n,
338
338
  e,
339
- s
339
+ r
340
340
  ).run();
341
341
  }
342
- function pn(n, t, e = 1e-9) {
343
- const s = gn((r) => {
344
- const i = n.paramPoint(r[0]), o = t.paramPoint(r[1]);
345
- return gt(i, o);
342
+ function vn(t, n, e = 1e-9) {
343
+ const r = An((s) => {
344
+ const i = t.paramPoint(s[0]), o = n.paramPoint(s[1]);
345
+ return At(i, o);
346
346
  }, e);
347
- return Math.sqrt(s.fMin);
347
+ return Math.sqrt(r.fMin);
348
348
  }
349
- function dn(n, t) {
350
- return n instanceof A && t instanceof A ? rn(n, t) : n instanceof A && t instanceof E ? et(n, t) : n instanceof E && t instanceof A ? et(t, n) : n instanceof E && t instanceof E ? an(n, t) : pn(n, t);
349
+ function bn(t, n) {
350
+ return t instanceof v && n instanceof v ? pn(t, n) : t instanceof v && n instanceof y ? lt(t, n) : t instanceof y && n instanceof v ? lt(n, t) : t instanceof y && n instanceof y ? mn(t, n) : vn(t, n);
351
351
  }
352
- function wt(n) {
353
- if (n instanceof $) {
354
- const r = F(n.lastPoint, n.firstPoint), i = F(n.firstControlPoint, n.firstPoint), o = F(n.lastControlPoint, n.firstPoint), a = V(r, i), f = V(r, o);
355
- if (a > 0 && f < 0 || a < 0 && f > 0) return !1;
352
+ function xt(t) {
353
+ if (t instanceof _) {
354
+ const s = F(t.lastPoint, t.firstPoint), i = F(t.firstControlPoint, t.firstPoint), o = F(t.lastControlPoint, t.firstPoint), c = N(s, i), f = N(s, o);
355
+ if (c > 0 && f < 0 || c < 0 && f > 0) return !1;
356
356
  }
357
- const t = Y(n.tangentAtFirstPoint), e = Y(n.tangentAtLastPoint);
358
- let s = Nt(t, e);
359
- return Math.abs(Math.acos(s)) < Math.PI / 3;
357
+ const n = it(t.tangentAtFirstPoint), e = it(t.tangentAtLastPoint);
358
+ let r = q(n, e);
359
+ return Math.abs(Math.acos(r)) < Math.PI / 3;
360
360
  }
361
- function K(n) {
362
- if (wt(n)) return [n];
363
- const [t, e] = n.splitAtParameters([0.5]);
361
+ function X(t) {
362
+ if (xt(t)) return [t];
363
+ const [n, e] = t.splitAtParameters([0.5]);
364
364
  return [
365
- ...K(t),
366
- ...K(e)
365
+ ...X(n),
366
+ ...X(e)
367
367
  ];
368
368
  }
369
- function st(n) {
370
- return wt(n) ? [n] : n.splitAtParameters(n.getParametersOfExtrema()).flatMap(K);
369
+ function ht(t) {
370
+ return xt(t) ? [t] : t.splitAtParameters(t.getParametersOfExtrema()).flatMap(X);
371
371
  }
372
- function mn(n) {
373
- const t = n.deltaAngle, e = Math.ceil(Math.abs(t) / (Math.PI / 2)), s = t / e, r = 4 * Math.tan(s / 4) / 3, i = n.clockwise ? -1 : 1, o = Array.from(
372
+ function Ln(t) {
373
+ const n = t.deltaAngle, e = Math.ceil(Math.abs(n) / (Math.PI / 2)), r = n / e, s = 4 * Math.tan(r / 4) / 3, i = t.clockwise ? -1 : 1, o = Array.from(
374
374
  { length: e + 1 },
375
- (f, c) => n.firstAngle + c * s * i
375
+ (f, a) => t.firstAngle + a * r * i
376
376
  );
377
- return o.slice(0, -1).map((f, c) => [f, o[c + 1]]).map(([f, c]) => {
378
- const l = Math.cos(f), p = Math.sin(f), g = Math.cos(c), d = Math.sin(c), [u, S] = n.center, M = n.minorRadius, v = n.majorRadius, k = new Jt().rotate(
379
- n.tiltAngle,
380
- n.center
381
- ), C = (Ft) => k.transform(Ft), D = C([u + v * l, S + M * p]), G = C([
382
- u + v * (l - r * p * i),
383
- S + M * (p + r * l * i)
384
- ]), kt = C([
385
- u + v * (g + r * d * i),
386
- S + M * (d - r * g * i)
387
- ]), Et = C([u + v * g, S + M * d]);
388
- return new $(D, Et, G, kt);
377
+ return o.slice(0, -1).map((f, a) => [f, o[a + 1]]).map(([f, a]) => {
378
+ const u = Math.cos(f), g = Math.sin(f), p = Math.cos(a), d = Math.sin(a), [l, S] = t.center, w = t.minorRadius, I = t.majorRadius, L = new rn().rotate(
379
+ t.tiltAngle,
380
+ t.center
381
+ ), k = ($t) => L.transform($t), D = k([l + I * u, S + w * g]), $ = k([
382
+ l + I * (u - s * g * i),
383
+ S + w * (g + s * u * i)
384
+ ]), Gt = k([
385
+ l + I * (p + s * d * i),
386
+ S + w * (d - s * p * i)
387
+ ]), _t = k([l + I * p, S + w * d]);
388
+ return new _(D, _t, $, Gt);
389
389
  });
390
390
  }
391
- const X = 1e-8, Mt = (n) => n.flatMap((t) => t instanceof A ? [t] : t instanceof E ? [t] : t instanceof pt ? mn(t).flatMap(
392
- (e) => st(e)
393
- ) : t instanceof dt || t instanceof $ ? st(t) : [new A(t.firstPoint, t.lastPoint)]);
394
- function q(n, t, e = !0) {
395
- const s = n.map((c) => ({
396
- offset: xt(c, t),
397
- original: c
398
- })), r = [];
399
- let i = e ? null : s.at(-1), o = e ? s.at(-1) : null;
400
- if (r.length === 1) return r;
401
- const a = (c) => {
402
- i ? c.offset instanceof U ? I(c.offset.firstPoint, c.offset.lastPoint) || r.push(
403
- new A(c.offset.firstPoint, c.offset.lastPoint)
404
- ) : r.push(c.offset) : i = c;
391
+ const et = 1e-8, yt = (t) => t.flatMap((n) => n instanceof v ? [n] : n instanceof y ? [n] : n instanceof vt ? Ln(n).flatMap(
392
+ (e) => ht(e)
393
+ ) : n instanceof bt || n instanceof _ ? ht(n) : [new v(n.firstPoint, n.lastPoint)]);
394
+ function J(t, n, e = !0) {
395
+ const r = t.map((a) => ({
396
+ offset: Ht(a, n),
397
+ original: a
398
+ })), s = [];
399
+ let i = e ? null : r.at(-1), o = e ? r.at(-1) : null;
400
+ if (s.length === 1) return s;
401
+ const c = (a) => {
402
+ i ? a.offset instanceof U ? A(a.offset.firstPoint, a.offset.lastPoint) || s.push(
403
+ new v(a.offset.firstPoint, a.offset.lastPoint)
404
+ ) : s.push(a.offset) : i = a;
405
405
  }, f = function* () {
406
- for (const c of s.slice(0, -1))
407
- yield c;
406
+ for (const a of r.slice(0, -1))
407
+ yield a;
408
408
  if (!i) throw new Error("Bug in the offset algorithm");
409
409
  yield i;
410
410
  };
411
- for (const c of f()) {
411
+ for (const a of f()) {
412
412
  if (!o) {
413
- o = c;
413
+ o = a;
414
414
  continue;
415
415
  }
416
- const l = o.offset.lastPoint, p = c.offset.firstPoint;
417
- if (I(l, p)) {
418
- a(o), o = c;
416
+ const u = o.offset.lastPoint, g = a.offset.firstPoint;
417
+ if (A(u, g)) {
418
+ c(o), o = a;
419
419
  continue;
420
420
  }
421
- let g = [];
422
- if (!(o.offset instanceof U) && !(c.offset instanceof U)) {
423
- const { intersections: M, overlaps: v } = N(
421
+ let p = [];
422
+ if (!(o.offset instanceof U) && !(a.offset instanceof U)) {
423
+ const { intersections: w, overlaps: I } = W(
424
424
  o.offset,
425
- c.offset,
426
- X / 100
425
+ a.offset,
426
+ et / 100
427
427
  );
428
- g = [
429
- ...M,
430
- ...v.flatMap((k) => [k.firstPoint, k.lastPoint])
428
+ p = [
429
+ ...w,
430
+ ...I.flatMap((L) => [L.firstPoint, L.lastPoint])
431
431
  ];
432
432
  }
433
- if (g.length > 0) {
434
- let M = g[0];
435
- if (g.length > 1) {
436
- const C = o == null ? void 0 : o.original.lastPoint, D = g.map(
437
- (G) => gt(G, C)
433
+ if (p.length > 0) {
434
+ let w = p[0];
435
+ if (p.length > 1) {
436
+ const k = o == null ? void 0 : o.original.lastPoint, D = p.map(
437
+ ($) => At($, k)
438
438
  );
439
- M = g[D.indexOf(Math.min(...D))];
439
+ w = p[D.indexOf(Math.min(...D))];
440
440
  }
441
- const v = o.offset.splitAt([
442
- M
443
- ])[0], k = c.offset.splitAt([M]).at(-1);
444
- if (!k) throw new Error("Bug in the splitting algo in offset");
445
- a({
446
- offset: v,
441
+ const I = o.offset.splitAt([
442
+ w
443
+ ])[0], L = a.offset.splitAt([w]).at(-1);
444
+ if (!L) throw new Error("Bug in the splitting algo in offset");
445
+ c({
446
+ offset: I,
447
447
  original: o.original
448
- }), o = { offset: k, original: c.original };
448
+ }), o = { offset: L, original: a.original };
449
449
  continue;
450
450
  }
451
- const d = o.original.lastPoint, u = Xt(
452
- F(p, d),
453
- F(l, d)
454
- ) > 0, S = new E(l, p, d, u);
455
- a(o), r.push(S), o = c;
456
- }
457
- return o && a(o), r;
458
- }
459
- function It(n) {
460
- const t = /* @__PURE__ */ new Map(), e = (s, r) => {
461
- const i = t.get(s) || [];
462
- t.set(s, [...i, ...r]);
451
+ const d = o.original.lastPoint, l = on(
452
+ F(g, d),
453
+ F(u, d)
454
+ ) > 0, S = new y(u, g, d, l);
455
+ c(o), s.push(S), o = a;
456
+ }
457
+ return o && c(o), s;
458
+ }
459
+ function Ct(t) {
460
+ const n = /* @__PURE__ */ new Map(), e = (r, s) => {
461
+ const i = n.get(r) || [];
462
+ n.set(r, [...i, ...s]);
463
463
  };
464
- return n.forEach((s, r) => {
465
- n.slice(r + 1).forEach((i, o) => {
466
- const { intersections: a, overlaps: f } = N(s, i, X), c = [
467
- ...a,
468
- ...f.flatMap((l) => [l.firstPoint, l.lastPoint])
469
- ].filter((l) => {
470
- const p = I(l, s.firstPoint) || I(l, s.lastPoint), g = I(l, i.firstPoint) || I(l, i.lastPoint);
471
- return !(p && g);
464
+ return t.forEach((r, s) => {
465
+ t.slice(s + 1).forEach((i, o) => {
466
+ const { intersections: c, overlaps: f } = W(r, i, et), a = [
467
+ ...c,
468
+ ...f.flatMap((u) => [u.firstPoint, u.lastPoint])
469
+ ].filter((u) => {
470
+ const g = A(u, r.firstPoint) || A(u, r.lastPoint), p = A(u, i.firstPoint) || A(u, i.lastPoint);
471
+ return !(g && p);
472
472
  });
473
- c.length && (e(r, c), e(o + r + 1, c));
473
+ a.length && (e(s, a), e(o + s + 1, a));
474
474
  });
475
- }), t;
475
+ }), n;
476
476
  }
477
- function St(n, t) {
478
- return t.flatMap((e, s) => {
479
- if (!n.has(s)) return e;
480
- const r = n.get(s);
481
- return r ? e.splitAt(r) : e;
477
+ function Dt(t, n) {
478
+ return n.flatMap((e, r) => {
479
+ if (!t.has(r)) return e;
480
+ const s = t.get(r);
481
+ return s ? e.splitAt(s) : e;
482
482
  });
483
483
  }
484
- function bt(n, t, e) {
485
- return n.filter((s) => !t.segments.some((i) => dn(i, s) < Math.abs(e) - X));
484
+ function Ot(t, n, e) {
485
+ return t.filter((r) => !n.segments.some((i) => bn(i, r) < Math.abs(e) - et));
486
486
  }
487
- function T(n, t) {
488
- const e = n.clockwise ? t : -t, s = Mt(n.segments), r = q(s, e);
489
- if (r.length < 2) return new h();
490
- const i = It(r);
487
+ function G(t, n) {
488
+ const e = t.clockwise ? n : -n, r = yt(t.segments), s = J(r, e);
489
+ if (s.length < 2) return new h();
490
+ const i = Ct(s);
491
491
  if (!i.size) {
492
- const l = new w(r);
493
- return new h([new m(l)]);
492
+ const u = new P(s);
493
+ return new h([new m(u)]);
494
494
  }
495
- const o = St(
495
+ const o = Dt(
496
496
  i,
497
- r
498
- ), a = bt(o, n, t);
499
- if (!a.length) return new h();
500
- const c = ut(a).filter((l) => l.length > 1).filter((l) => I(l[0].firstPoint, l.at(-1).lastPoint)).map((l) => new w(l));
501
- return c.length ? new h(c.map((l) => new m(l))) : new h();
502
- }
503
- function Pn(n, t, e = "round") {
504
- const s = t / 2, r = Mt(n.segments), i = q(r, s, !1), o = q(
505
- r,
506
- -s,
497
+ s
498
+ ), c = Ot(o, t, n);
499
+ if (!c.length) return new h();
500
+ const a = St(c).filter((u) => u.length > 1).filter((u) => A(u[0].firstPoint, u.at(-1).lastPoint)).map((u) => new P(u));
501
+ return a.length ? new h(a.map((u) => new m(u))) : new h();
502
+ }
503
+ function En(t, n, e = "round") {
504
+ const r = n / 2, s = yt(t.segments), i = J(s, r, !1), o = J(
505
+ s,
506
+ -r,
507
507
  !1
508
- ).map((u) => u.reverse());
508
+ ).map((l) => l.reverse());
509
509
  o.reverse();
510
- const a = (u, S) => e === "round" ? Qt(
511
- u.lastPoint,
510
+ const c = (l, S) => e === "round" ? sn(
511
+ l.lastPoint,
512
512
  S.firstPoint,
513
- u.tangentAtLastPoint
514
- ) : new A(u.lastPoint, S.firstPoint), f = [
513
+ l.tangentAtLastPoint
514
+ ) : new v(l.lastPoint, S.firstPoint), f = [
515
515
  ...i,
516
- a(
516
+ c(
517
517
  i[i.length - 1],
518
518
  o[0]
519
519
  ),
520
520
  ...o,
521
- a(
521
+ c(
522
522
  o[o.length - 1],
523
523
  i[0]
524
524
  )
525
- ], c = It(f);
526
- if (!c.size) {
527
- const u = new w(f);
528
- return new h([new m(u)]);
525
+ ], a = Ct(f);
526
+ if (!a.size) {
527
+ const l = new P(f);
528
+ return new h([new m(l)]);
529
529
  }
530
- const l = St(
531
- c,
530
+ const u = Dt(
531
+ a,
532
532
  f
533
- ), p = bt(l, n, s);
534
- if (!p.length) return new h();
535
- const d = ut(p).filter((u) => u.length > 1).filter((u) => I(u[0].firstPoint, u.at(-1).lastPoint)).map((u) => new w(u));
536
- return d.length ? new h(d.map((u) => new m(u))) : new h();
537
- }
538
- function wn(n, t) {
539
- const e = n.map((s) => {
540
- const r = z(
541
- s.holes.map((i) => T(i, t))
533
+ ), g = Ot(u, t, r);
534
+ if (!g.length) return new h();
535
+ const d = St(g).filter((l) => l.length > 1).filter((l) => A(l[0].firstPoint, l.at(-1).lastPoint)).map((l) => new P(l));
536
+ return d.length ? new h(d.map((l) => new m(l))) : new h();
537
+ }
538
+ function kn(t, n) {
539
+ const e = t.map((r) => {
540
+ const s = z(
541
+ r.holes.map((i) => G(i, n))
542
542
  );
543
- return Pt(T(s.contour, t), r);
543
+ return Ft(G(r.contour, n), s);
544
544
  });
545
545
  return z(e);
546
546
  }
547
- function Mn(n, t) {
548
- const e = Math.abs(t / 2), s = n.map(
549
- (r) => z(
550
- r.allLoops.map((i) => Pt(T(i, e), T(i, -e)))
547
+ function Fn(t, n) {
548
+ const e = Math.abs(n / 2), r = t.map(
549
+ (s) => z(
550
+ s.allLoops.map((i) => Ft(G(i, e), G(i, -e)))
551
551
  )
552
552
  );
553
- return z(s);
553
+ return z(r);
554
554
  }
555
- function Dn(n, t) {
556
- return wn(L(n), t);
555
+ function Yn(t, n) {
556
+ return kn(x(t), n);
557
557
  }
558
- function On(n, t, { endCap: e = "round" } = {}) {
559
- return n instanceof y ? Pn(n, t, e) : Mn(L(n), t);
558
+ function Zn(t, n, { endCap: e = "round" } = {}) {
559
+ return t instanceof b ? En(t, n, e) : Fn(x(t), n);
560
560
  }
561
- class In {
561
+ class xn {
562
562
  constructor() {
563
- P(this, "filters");
563
+ M(this, "filters");
564
564
  this.filters = [];
565
565
  }
566
566
  delete() {
@@ -570,66 +570,66 @@ class In {
570
570
  * Combine logically a set of filter with an AND operation.
571
571
  *
572
572
  */
573
- and(t) {
574
- return t.forEach((e) => e(this)), this;
573
+ and(n) {
574
+ return n.forEach((e) => e(this)), this;
575
575
  }
576
576
  /**
577
577
  * Invert the result of a particular filter
578
578
  *
579
579
  */
580
- not(t) {
580
+ not(n) {
581
581
  const e = new this.constructor();
582
- t(e);
583
- const s = ({ element: r }) => !e.shouldKeep(r);
584
- return this.filters.push(s), this;
582
+ n(e);
583
+ const r = ({ element: s }) => !e.shouldKeep(s);
584
+ return this.filters.push(r), this;
585
585
  }
586
586
  /**
587
587
  * Combine logically a set of filter with an OR operation.
588
588
  *
589
589
  */
590
- either(t) {
591
- const e = t.map((r) => {
590
+ either(n) {
591
+ const e = n.map((s) => {
592
592
  const i = new this.constructor();
593
- return r(i), i;
594
- }), s = ({ element: r }) => e.some((i) => i.shouldKeep(r));
595
- return this.filters.push(s), this;
593
+ return s(i), i;
594
+ }), r = ({ element: s }) => e.some((i) => i.shouldKeep(s));
595
+ return this.filters.push(r), this;
596
596
  }
597
597
  }
598
- const _ = 2 * Math.PI, rt = (n) => {
599
- const t = n % _, e = t < 0 ? t + _ : t;
600
- return e < Math.PI ? e : e === Math.PI ? 0 : Math.abs(e - _);
598
+ const V = 2 * Math.PI, gt = (t) => {
599
+ const n = t % V, e = n < 0 ? n + V : n;
600
+ return e < Math.PI ? e : e === Math.PI ? 0 : Math.abs(e - V);
601
601
  };
602
- class x extends In {
602
+ class C extends xn {
603
603
  clone() {
604
- const t = new x();
605
- return t.filters = [...this.filters], t;
604
+ const n = new C();
605
+ return n.filters = [...this.filters], n;
606
606
  }
607
607
  /**
608
608
  * Filter to find corner that have their point are in the list.
609
609
  *
610
610
  */
611
- inList(t) {
612
- const e = ({ element: s }) => !!t.find((r) => I(r, s.point));
611
+ inList(n) {
612
+ const e = ({ element: r }) => !!n.find((s) => A(s, r.point));
613
613
  return this.filters.push(e), this;
614
614
  }
615
615
  /**
616
616
  * Filter to find elements that are at a specified distance from a point.
617
617
  *
618
618
  */
619
- atDistance(t, e = [0, 0]) {
620
- function s({ element: r }) {
621
- return Math.abs(b(e, r.point) - t) < 1e-9;
619
+ atDistance(n, e = [0, 0]) {
620
+ function r({ element: s }) {
621
+ return Math.abs(E(e, s.point) - n) < 1e-9;
622
622
  }
623
- return this.filters.push(s), this;
623
+ return this.filters.push(r), this;
624
624
  }
625
625
  /**
626
626
  * Filter to find elements that contain a certain point
627
627
  *
628
628
  * @category Filter
629
629
  */
630
- atPoint(t) {
631
- function e({ element: s }) {
632
- return I(t, s.point);
630
+ atPoint(n) {
631
+ function e({ element: r }) {
632
+ return A(n, r.point);
633
633
  }
634
634
  return this.filters.push(e), this;
635
635
  }
@@ -638,242 +638,348 @@ class x extends In {
638
638
  *
639
639
  * @category Filter
640
640
  */
641
- inBox(t, e) {
642
- const [s, r] = t, [i, o] = e, a = Math.min(s, i), f = Math.max(s, i), c = Math.min(r, o), l = Math.max(r, o);
643
- function p({ element: g }) {
644
- const [d, u] = g.point;
645
- return d >= a && d <= f && u >= c && u <= l;
641
+ inBox(n, e) {
642
+ const [r, s] = n, [i, o] = e, c = Math.min(r, i), f = Math.max(r, i), a = Math.min(s, o), u = Math.max(s, o);
643
+ function g({ element: p }) {
644
+ const [d, l] = p.point;
645
+ return d >= c && d <= f && l >= a && l <= u;
646
646
  }
647
- return this.filters.push(p), this;
647
+ return this.filters.push(g), this;
648
648
  }
649
649
  /**
650
650
  * Filter to find corner that a certain angle between them - only between
651
651
  * 0 and 180.
652
652
  *
653
653
  */
654
- ofAngle(t) {
655
- function e({ element: s }) {
656
- const r = s.firstCurve.tangentAtLastPoint, i = s.secondCurve.tangentAtFirstPoint;
654
+ ofAngle(n) {
655
+ function e({ element: r }) {
656
+ const s = r.firstCurve.tangentAtLastPoint, i = r.secondCurve.tangentAtFirstPoint;
657
657
  return Math.abs(
658
- rt(V(r, i)) - rt(Yt * t)
658
+ gt(N(s, i)) - gt(Lt * n)
659
659
  ) < 1e-9;
660
660
  }
661
661
  return this.filters.push(e), this;
662
662
  }
663
- above(t = 0) {
664
- function e({ element: s }) {
665
- return s.point[1] > t;
663
+ above(n = 0) {
664
+ function e({ element: r }) {
665
+ return r.point[1] > n;
666
666
  }
667
667
  return this.filters.push(e), this;
668
668
  }
669
- below(t = 0) {
670
- function e({ element: s }) {
671
- return s.point[1] < t;
669
+ below(n = 0) {
670
+ function e({ element: r }) {
671
+ return r.point[1] < n;
672
672
  }
673
673
  return this.filters.push(e), this;
674
674
  }
675
- leftOf(t = 0) {
676
- function e({ element: s }) {
677
- return s.point[0] < t;
675
+ leftOf(n = 0) {
676
+ function e({ element: r }) {
677
+ return r.point[0] < n;
678
678
  }
679
679
  return this.filters.push(e), this;
680
680
  }
681
- rightOf(t = 0) {
682
- function e({ element: s }) {
683
- return s.point[0] > t;
681
+ rightOf(n = 0) {
682
+ function e({ element: r }) {
683
+ return r.point[0] > n;
684
684
  }
685
685
  return this.filters.push(e), this;
686
686
  }
687
- shouldKeep(t) {
688
- return this.filters.every((s) => s({ element: t }));
687
+ shouldKeep(n) {
688
+ return this.filters.every((r) => r({ element: n }));
689
689
  }
690
690
  asFilterFun() {
691
691
  return this.shouldKeep.bind(this);
692
692
  }
693
693
  }
694
- function At(n, t, e, s = () => !0) {
695
- const r = [t.segments[0]], i = (a, f) => {
696
- s({ firstCurve: a, secondCurve: f, point: a.lastPoint }) ? r.push(...n(a, f, e)) : r.push(a, f);
694
+ function Bt(t, n, e, r = () => !0) {
695
+ const s = [n.segments[0]], i = (c, f) => {
696
+ r({ firstCurve: c, secondCurve: f, point: c.lastPoint }) ? s.push(...t(c, f, e)) : s.push(c, f);
697
697
  };
698
- if (t.segments.slice(1).forEach((a) => {
699
- const f = r.pop();
698
+ if (n.segments.slice(1).forEach((c) => {
699
+ const f = s.pop();
700
700
  if (!f) throw new Error("Bug in the stroke filletting algo");
701
- i(f, a);
702
- }), !r.at(-1)) throw new Error("Bug in the stroke corner algo");
703
- if (t instanceof w) {
704
- const a = r.pop(), f = r.shift();
705
- if (!a || !f)
701
+ i(f, c);
702
+ }), !s.at(-1)) throw new Error("Bug in the stroke corner algo");
703
+ if (n instanceof P) {
704
+ const c = s.pop(), f = s.shift();
705
+ if (!c || !f)
706
706
  throw new Error("Bug in the filletting algo");
707
- return i(a, f), new w(r, { ignoreChecks: !0 });
707
+ return i(c, f), new P(s, { ignoreChecks: !0 });
708
708
  } else
709
- return new y(r, { ignoreChecks: !0 });
710
- }
711
- function B(n, t, e) {
712
- const s = typeof e == "function" ? e(new x()) : e, r = s && s.asFilterFun();
713
- if (n instanceof w || n instanceof y)
714
- return At(lt, n, t, r);
715
- if (n instanceof m) {
716
- const i = B(n.contour, t, s), o = n.holes.map((a) => B(a, t, s));
709
+ return new b(s, { ignoreChecks: !0 });
710
+ }
711
+ function R(t, n, e) {
712
+ const r = typeof e == "function" ? e(new C()) : e, s = r && r.asFilterFun();
713
+ if (t instanceof P || t instanceof b)
714
+ return Bt(Mt, t, n, s);
715
+ if (t instanceof m) {
716
+ const i = R(t.contour, n, r), o = t.holes.map((c) => R(c, n, r));
717
717
  return new m(i, o, { ignoreChecks: !0 });
718
718
  }
719
- if (n instanceof h) {
720
- const i = n.figures.map((o) => B(o, t, s));
719
+ if (t instanceof h) {
720
+ const i = t.figures.map((o) => R(o, n, r));
721
721
  return new h(i, { ignoreChecks: !0 });
722
722
  }
723
723
  throw new Error("invalid shape to fillet");
724
724
  }
725
- function R(n, t, e) {
726
- const s = typeof e == "function" ? e(new x()) : e, r = s && s.asFilterFun();
727
- if (n instanceof w || n instanceof y)
728
- return At(lt, n, t, r);
729
- if (n instanceof m) {
730
- const i = R(n.contour, t, s), o = n.holes.map((a) => R(a, t, s));
725
+ function T(t, n, e) {
726
+ const r = typeof e == "function" ? e(new C()) : e, s = r && r.asFilterFun();
727
+ if (t instanceof P || t instanceof b)
728
+ return Bt(Mt, t, n, s);
729
+ if (t instanceof m) {
730
+ const i = T(t.contour, n, r), o = t.holes.map((c) => T(c, n, r));
731
731
  return new m(i, o, { ignoreChecks: !0 });
732
732
  }
733
- if (n instanceof h) {
734
- const i = n.figures.map((o) => R(o, t, s));
733
+ if (t instanceof h) {
734
+ const i = t.figures.map((o) => T(o, n, r));
735
735
  return new h(i, { ignoreChecks: !0 });
736
736
  }
737
737
  throw new Error("invalid shape to chamfer");
738
738
  }
739
- class Sn extends x {
740
- constructor(t) {
741
- super(), this.shape = t;
739
+ class yn extends C {
740
+ constructor(n) {
741
+ super(), this.shape = n;
742
742
  }
743
- fillet(t) {
744
- return B(this.shape, t, this.clone());
743
+ fillet(n) {
744
+ return R(this.shape, n, this.clone());
745
745
  }
746
- chamfer(t) {
747
- return R(this.shape, t, this.clone());
746
+ chamfer(n) {
747
+ return T(this.shape, n, this.clone());
748
748
  }
749
749
  }
750
- function Bn(n) {
751
- return new Sn(n);
750
+ function Wn(t) {
751
+ return new yn(t);
752
752
  }
753
- function it(n) {
754
- if (n instanceof h)
755
- return Wt(n);
756
- if (n instanceof m)
757
- return jt(n);
758
- if (n instanceof w)
759
- return `<path d="${tn(n)}" />`;
760
- if (n instanceof y)
761
- return `<path d="${nn(n)}" />`;
762
- if (Gt(n))
763
- return `<path d="${`M ${n.firstPoint.join(" ")}`} ${en(
764
- n
753
+ const Cn = 1 * Lt, Dn = 24;
754
+ function H(t, n, e, r) {
755
+ const s = t.gradientAt(n);
756
+ return Et(s) <= r ? e : j(s);
757
+ }
758
+ function Q(t, n, e, r, s, i) {
759
+ const o = t.paramPoint(n), c = t.paramPoint(e), f = F(c, o), a = Et(f);
760
+ if (a <= t.precision || i >= r.maxDepth)
761
+ return [o, c];
762
+ const u = [f[0] / a, f[1] / a], g = (n + e) * 0.5, p = H(t, n, u, t.precision), d = H(t, g, u, t.precision), l = H(t, e, u, t.precision), S = q(p, d), w = q(d, l);
763
+ if (S >= s && w >= s)
764
+ return [o, c];
765
+ const I = t.paramPoint(g), L = S >= s ? [o, I] : Q(t, n, g, r, s, i + 1), k = w >= s ? [I, c] : Q(t, g, e, r, s, i + 1);
766
+ return [...L.slice(0, -1), ...k];
767
+ }
768
+ function rt(t, n = {}) {
769
+ const e = {
770
+ maxAngle: n.maxAngle ?? Cn,
771
+ maxDepth: n.maxDepth ?? Dn
772
+ }, r = Math.cos(e.maxAngle);
773
+ return Q(t, 0, 1, e, r, 0);
774
+ }
775
+ function On(t, n) {
776
+ return new h(
777
+ t.figures.map((e) => Rt(e, n))
778
+ );
779
+ }
780
+ function Rt(t, n) {
781
+ return new m(
782
+ Y(t.contour, n),
783
+ t.holes.map((e) => Y(e, n))
784
+ );
785
+ }
786
+ function Y(t, n) {
787
+ return new P(st(t.segments, n));
788
+ }
789
+ function Bn(t, n) {
790
+ return new b(st(t.segments, n));
791
+ }
792
+ function st(t, n) {
793
+ return t.flatMap(n);
794
+ }
795
+ function Rn(t, n) {
796
+ if (t instanceof h)
797
+ return On(t, n);
798
+ if (t instanceof m)
799
+ return Rt(t, n);
800
+ if (t instanceof P)
801
+ return Y(t, n);
802
+ if (t instanceof b)
803
+ return Bn(t, n);
804
+ if (It(t))
805
+ return st([t], n);
806
+ throw new Error("Unsupported shape type");
807
+ }
808
+ function Tn(t) {
809
+ if (t.length < 2) return [];
810
+ const n = [];
811
+ for (let e = 0; e < t.length - 1; e += 1)
812
+ n.push(new v(t[e], t[e + 1]));
813
+ return n;
814
+ }
815
+ function zn(t, n) {
816
+ return Tn(rt(t, n));
817
+ }
818
+ function B(t, n) {
819
+ const e = [];
820
+ return t.forEach((r, s) => {
821
+ const i = rt(r, n);
822
+ if (i.length !== 0) {
823
+ if (s === 0) {
824
+ e.push(...i);
825
+ return;
826
+ }
827
+ e.push(...i.slice(1));
828
+ }
829
+ }), e.length > 1 && A(e[0], e[e.length - 1]) && e.pop(), e;
830
+ }
831
+ function Gn(t) {
832
+ return t.length < 3 ? !1 : t.map((e, r) => {
833
+ const s = t[(r + 1) % t.length];
834
+ return (s[0] - e[0]) * (s[1] + e[1]);
835
+ }).reduce((e, r) => e + r, 0) > 0;
836
+ }
837
+ function K(t, n) {
838
+ return t.length < 3 || Gn(t) === n ? t : [...t].reverse();
839
+ }
840
+ function jn(t, n = {}) {
841
+ return Rn(t, (r) => zn(r, n));
842
+ }
843
+ function _n(t, n = {}) {
844
+ if (t instanceof h)
845
+ return t.figures.map((e) => _n(e, n));
846
+ if (t instanceof m) {
847
+ const e = K(
848
+ B(t.contour.segments, n),
849
+ !1
850
+ ), r = t.holes.map(
851
+ (s) => K(B(s.segments, n), !0)
852
+ );
853
+ return [e, ...r];
854
+ }
855
+ return t instanceof P ? K(B(t.segments, n), !1) : t instanceof b ? B(t.segments, n) : rt(t, n);
856
+ }
857
+ function pt(t) {
858
+ if (t instanceof h)
859
+ return an(t);
860
+ if (t instanceof m)
861
+ return fn(t);
862
+ if (t instanceof P)
863
+ return `<path d="${un(t)}" />`;
864
+ if (t instanceof b)
865
+ return `<path d="${ln(t)}" />`;
866
+ if (It(t))
867
+ return `<path d="${`M ${t.firstPoint.join(" ")}`} ${hn(
868
+ t
765
869
  )}" />`;
766
870
  throw new Error("Unknown shape type");
767
871
  }
768
- const ot = (n) => "shape" in n ? n.shape : n, at = (n, t) => {
769
- if (!("shape" in n)) return t;
770
- const { color: e } = n;
771
- return e ? `<g stroke="${e}">${t}</g>` : t;
772
- }, ct = (n) => new Zt(n.xMin, -n.yMax, n.xMax, -n.yMin);
773
- function Rn(n, {
774
- margin: t = 1,
872
+ const dt = (t) => "shape" in t ? t.shape : t, mt = (t, n) => {
873
+ if (!("shape" in t)) return n;
874
+ const { color: e } = t;
875
+ return e ? `<g stroke="${e}">${n}</g>` : n;
876
+ }, Pt = (t) => new cn(t.xMin, -t.yMax, t.xMax, -t.yMin);
877
+ function te(t, {
878
+ margin: n = 1,
775
879
  unit: e = null,
776
- viewBox: s
880
+ viewBox: r
777
881
  } = {}) {
778
- if (Array.isArray(n)) {
779
- const i = n.map((f) => ot(f).mirror()), o = i.map((f, c) => at(n[c], it(f))).join(`
780
- `), a = i.slice(1).reduce((f, c) => f.merge(c.boundingBox), i[0].boundingBox);
781
- return Z(o, s ? ct(s) : a, t, e);
782
- }
783
- const r = ot(n).mirror();
784
- return Z(
785
- at(n, it(r)),
786
- s ? ct(s) : r.boundingBox,
787
- t,
882
+ if (Array.isArray(t)) {
883
+ const i = t.map((f) => dt(f).mirror()), o = i.map((f, a) => mt(t[a], pt(f))).join(`
884
+ `), c = i.slice(1).reduce((f, a) => f.merge(a.boundingBox), i[0].boundingBox);
885
+ return ot(o, r ? Pt(r) : c, n, e);
886
+ }
887
+ const s = dt(t).mirror();
888
+ return ot(
889
+ mt(t, pt(s)),
890
+ r ? Pt(r) : s.boundingBox,
891
+ n,
788
892
  e
789
893
  );
790
894
  }
791
- const vt = (n) => {
792
- if (n.type === "LINE")
793
- return new A(n.firstPoint, n.lastPoint);
794
- if (n.type === "ARC")
795
- return new E(
796
- n.firstPoint,
797
- n.lastPoint,
798
- n.center,
799
- n.clockwise
895
+ const Tt = (t) => {
896
+ if (t.type === "LINE")
897
+ return new v(t.firstPoint, t.lastPoint);
898
+ if (t.type === "ARC")
899
+ return new y(
900
+ t.firstPoint,
901
+ t.lastPoint,
902
+ t.center,
903
+ t.clockwise
800
904
  );
801
- if (n.type === "ELLIPSE_ARC")
802
- return new pt(
803
- n.firstPoint,
804
- n.lastPoint,
805
- n.center,
806
- n.majorRadius,
807
- n.minorRadius,
808
- n.tiltAngle,
809
- n.clockwise,
905
+ if (t.type === "ELLIPSE_ARC")
906
+ return new vt(
907
+ t.firstPoint,
908
+ t.lastPoint,
909
+ t.center,
910
+ t.majorRadius,
911
+ t.minorRadius,
912
+ t.tiltAngle,
913
+ t.clockwise,
810
914
  { angleUnits: "rad" }
811
915
  );
812
- if (n.type === "QUADRATIC_BEZIER")
813
- return new dt(
814
- n.firstPoint,
815
- n.lastPoint,
816
- n.controlPoint
916
+ if (t.type === "QUADRATIC_BEZIER")
917
+ return new bt(
918
+ t.firstPoint,
919
+ t.lastPoint,
920
+ t.controlPoint
817
921
  );
818
- if (n.type === "CUBIC_BEZIER")
819
- return new $(
820
- n.firstPoint,
821
- n.lastPoint,
822
- n.firstControlPoint,
823
- n.lastControlPoint
922
+ if (t.type === "CUBIC_BEZIER")
923
+ return new _(
924
+ t.firstPoint,
925
+ t.lastPoint,
926
+ t.firstControlPoint,
927
+ t.lastControlPoint
824
928
  );
825
929
  throw new Error("Unknown segment type");
826
- }, H = (n) => {
827
- const t = n.segments.map(vt);
828
- return new w(t);
829
- }, Lt = (n) => {
830
- const t = H(n.contour), e = n.holes.map(H);
831
- return new m(t, e);
832
- }, bn = (n) => {
833
- const t = n.figures.map(Lt);
834
- return new h(t);
930
+ }, Z = (t) => {
931
+ const n = t.segments.map(Tt);
932
+ return new P(n);
933
+ }, zt = (t) => {
934
+ const n = Z(t.contour), e = t.holes.map(Z);
935
+ return new m(n, e);
936
+ }, $n = (t) => {
937
+ const n = t.figures.map(zt);
938
+ return new h(n);
835
939
  };
836
- function zn(n) {
837
- if (n.type === "DIAGRAM")
838
- return bn(n);
839
- if (n.type === "FIGURE")
840
- return Lt(n);
841
- if (n.type === "LOOP")
842
- return H(n);
843
- if (n.type === "LINE" || n.type === "ARC" || n.type === "ELLIPSE_ARC" || n.type === "CUBIC_BEZIER")
844
- return vt(n);
940
+ function ne(t) {
941
+ if (t.type === "DIAGRAM")
942
+ return $n(t);
943
+ if (t.type === "FIGURE")
944
+ return zt(t);
945
+ if (t.type === "LOOP")
946
+ return Z(t);
947
+ if (t.type === "LINE" || t.type === "ARC" || t.type === "ELLIPSE_ARC" || t.type === "CUBIC_BEZIER")
948
+ return Tt(t);
845
949
  throw new Error("Unknown shape type");
846
950
  }
847
- const ft = Math.PI / 180, An = 180 / Math.PI;
848
- function Tn(n, t) {
849
- const e = Math.cos(t * ft) * n, s = Math.sin(t * ft) * n;
850
- return [e, s];
951
+ const wt = Math.PI / 180, Un = 180 / Math.PI;
952
+ function ee(t, n) {
953
+ const e = Math.cos(n * wt) * t, r = Math.sin(n * wt) * t;
954
+ return [e, r];
851
955
  }
852
- function $n([n, t]) {
853
- const e = Math.sqrt(n * n + t * t), s = Math.atan2(t, n) * An;
854
- return [e, s];
956
+ function re([t, n]) {
957
+ const e = Math.sqrt(t * t + n * n), r = Math.atan2(n, t) * Un;
958
+ return [e, r];
855
959
  }
856
960
  export {
857
- ft as DEG2RAD,
858
- _n as DrawingPen,
859
- An as RAD2DEG,
860
- $n as cartesianToPolar,
861
- R as chamfer,
862
- xn as confineStrand,
863
- Pt as cut,
864
- Vn as draw,
865
- Cn as eraseStrand,
866
- qn as exportJSON,
867
- Rn as exportSVG,
868
- B as fillet,
869
- sn as fuse,
961
+ wt as DEG2RAD,
962
+ oe as DrawingPen,
963
+ Un as RAD2DEG,
964
+ re as cartesianToPolar,
965
+ T as chamfer,
966
+ Qn as confineStrand,
967
+ Ft as cut,
968
+ ce as draw,
969
+ Jn as eraseStrand,
970
+ fe as exportJSON,
971
+ te as exportSVG,
972
+ R as fillet,
973
+ gn as fuse,
870
974
  z as fuseAll,
871
- zn as importJSON,
872
- yn as intersect,
873
- Dn as offset,
874
- On as outlineStroke,
875
- Tn as polarToCartesian,
876
- Bn as selectCorners,
877
- it as svgBody
975
+ ne as importJSON,
976
+ Xn as intersect,
977
+ Yn as offset,
978
+ Zn as outlineStroke,
979
+ ee as polarToCartesian,
980
+ Wn as selectCorners,
981
+ pt as svgBody,
982
+ jn as tesselate,
983
+ _n as tesselatePoints
878
984
  };
879
985
  //# sourceMappingURL=pantograph.js.map