pantograph2d 0.9.0 → 0.10.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 (42) hide show
  1. package/dist/{QuadraticBezier-BKElJOgn.cjs → QuadraticBezier--UZr_xcV.cjs} +2 -2
  2. package/dist/QuadraticBezier--UZr_xcV.cjs.map +1 -0
  3. package/dist/{QuadraticBezier-PcRS9HZK.js → QuadraticBezier-DxieHk9z.js} +4 -2
  4. package/dist/QuadraticBezier-DxieHk9z.js.map +1 -0
  5. package/dist/{draw-L71G180-.cjs → draw-BUUNobTS.cjs} +2 -2
  6. package/dist/{draw-L71G180-.cjs.map → draw-BUUNobTS.cjs.map} +1 -1
  7. package/dist/{draw-N2ntigsw.js → draw-lOWnIN1o.js} +5 -3
  8. package/dist/{draw-N2ntigsw.js.map → draw-lOWnIN1o.js.map} +1 -1
  9. package/dist/models-CCo90hZc.cjs +4 -0
  10. package/dist/models-CCo90hZc.cjs.map +1 -0
  11. package/dist/{models-BjaFYsN2.js → models-DCkOI0hV.js} +643 -581
  12. package/dist/models-DCkOI0hV.js.map +1 -0
  13. package/dist/pantograph/drawShape.cjs +1 -1
  14. package/dist/pantograph/drawShape.js +1 -1
  15. package/dist/pantograph/models.cjs +1 -1
  16. package/dist/pantograph/models.js +2 -2
  17. package/dist/pantograph/svg.cjs +1 -1
  18. package/dist/pantograph/svg.js +1 -1
  19. package/dist/pantograph.cjs +2 -2
  20. package/dist/pantograph.cjs.map +1 -1
  21. package/dist/pantograph.js +621 -425
  22. package/dist/pantograph.js.map +1 -1
  23. package/dist/{svg-hNHYuj_r.js → svg-BIphc_zE.js} +3 -3
  24. package/dist/{svg-hNHYuj_r.js.map → svg-BIphc_zE.js.map} +1 -1
  25. package/dist/{svg-ZTvNxsWu.cjs → svg-BY5h3CDD.cjs} +3 -3
  26. package/dist/{svg-ZTvNxsWu.cjs.map → svg-BY5h3CDD.cjs.map} +1 -1
  27. package/dist/types/src/algorithms/boolean/loopBooleans.d.ts +10 -5
  28. package/dist/types/src/drawShape/drawPolysides.d.ts +1 -0
  29. package/dist/types/src/drawShape/index.d.ts +1 -0
  30. package/dist/types/src/featureOperations.d.ts +88 -0
  31. package/dist/types/src/main.d.ts +2 -2
  32. package/dist/types/src/models/Diagram.d.ts +3 -1
  33. package/dist/types/src/models/Figure.d.ts +3 -1
  34. package/dist/types/src/models/Loop.d.ts +3 -1
  35. package/dist/types/src/operations.d.ts +1 -0
  36. package/dist/types/src/vectorOperations.d.ts +1 -1
  37. package/package.json +3 -2
  38. package/dist/QuadraticBezier-BKElJOgn.cjs.map +0 -1
  39. package/dist/QuadraticBezier-PcRS9HZK.js.map +0 -1
  40. package/dist/models-BXU-Gx3U.cjs +0 -4
  41. package/dist/models-BXU-Gx3U.cjs.map +0 -1
  42. package/dist/models-BjaFYsN2.js.map +0 -1
@@ -1,209 +1,209 @@
1
- var bt = Object.defineProperty;
2
- var Lt = (t, n, e) => n in t ? bt(t, n, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[n] = e;
3
- var P = (t, n, e) => Lt(t, typeof n != "symbol" ? n + "" : n, e);
4
- import { o as At, D as T } from "./draw-N2ntigsw.js";
5
- import { d as Cn } from "./draw-N2ntigsw.js";
6
- import { F as w, L as S, D as g, a as _, s as vt, b as kt, c as Et, i as yt, S as R, l as Ft, p as Ct, d as xt, e as rt, g as Dt } from "./models-BjaFYsN2.js";
7
- import { h as Dn } from "./models-BjaFYsN2.js";
8
- import { r as Ot, z as Rt, l as Bt, e as L, n as ot, b as y, a as zt, s as Tt, m as $t, o as at, L as I, A as E, C as B, p as J, q as Q, d as Gt, T as Ut, g as A, E as ct, Q as ft, t as _t, c as Vt, B as qt } from "./QuadraticBezier-PcRS9HZK.js";
9
- import { s as Nt, a as Jt, b as Qt, c as Zt, d as Ht, w as Z } from "./svg-hNHYuj_r.js";
10
- function v(t) {
11
- if (t instanceof w)
12
- return [t];
13
- if (t instanceof S)
14
- return [new w(t)];
15
- if (t instanceof g)
16
- return t.figures;
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;
17
17
  throw new Error("Unknown shape");
18
18
  }
19
- function lt(t, n, e = 1e-9) {
19
+ function mt(n, t, e = 1e-9) {
20
20
  let s = [];
21
- const r = [], i = new Array(n.segments.length).fill(0).map(() => []);
22
- n.segments.forEach((f, c) => {
23
- t.segments.forEach((a) => {
24
- const { intersections: l, overlaps: p } = _(
25
- f,
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(
26
25
  a,
26
+ c,
27
27
  e
28
28
  );
29
- s.push(...l), i[c].push(...l), r.push(...p);
30
- const h = p.flatMap((d) => [
29
+ s.push(...l), i[f].push(...l), r.push(...p);
30
+ const g = p.flatMap((d) => [
31
31
  d.firstPoint,
32
32
  d.lastPoint
33
33
  ]);
34
- s.push(...h), i[c].push(...h);
34
+ s.push(...g), i[f].push(...g);
35
35
  });
36
- }), s = Ot(s, e);
37
- const o = Rt([n.segments, i]).flatMap(([f, c]) => c.length ? f.splitAt(c) : [f]);
36
+ }), s = Ut(s, e);
37
+ const o = _t([t.segments, i]).flatMap(([a, f]) => f.length ? a.splitAt(f) : [a]);
38
38
  return Array.from(
39
- vt(
39
+ Dt(
40
40
  o,
41
41
  s,
42
42
  r
43
43
  )
44
44
  );
45
45
  }
46
- function V(t, n, e = !1) {
47
- return lt(n, t).filter((r) => {
46
+ function J(n, t, e = !1) {
47
+ return mt(t, n).filter((r) => {
48
48
  const i = r.segments[0].midPoint;
49
- return n.onStroke(i) ? !e : !n.contains(i);
49
+ return t.onStroke(i) ? !e : !t.contains(i);
50
50
  });
51
51
  }
52
- function q(t, n, e = !1) {
53
- return lt(n, t).filter((r) => {
52
+ function Q(n, t, e = !1) {
53
+ return mt(t, n).filter((r) => {
54
54
  const i = r.segments[0].midPoint;
55
- return n.onStroke(i) ? !e : n.contains(i);
55
+ return t.onStroke(i) ? !e : t.contains(i);
56
56
  });
57
57
  }
58
- function H(t, n, e = !1) {
59
- const s = V(
60
- t,
61
- n.contour,
58
+ function W(n, t, e = !1) {
59
+ const s = J(
60
+ n,
61
+ t.contour,
62
62
  e
63
- ), r = n.holes.flatMap(
64
- (i) => q(t, i, e)
63
+ ), r = t.holes.flatMap(
64
+ (i) => Q(n, i, e)
65
65
  );
66
66
  return [...s, ...r];
67
67
  }
68
- function W(t, n, e = !1) {
69
- let s = q(
70
- t,
71
- n.contour,
68
+ function j(n, t, e = !1) {
69
+ let s = Q(
70
+ n,
71
+ t.contour,
72
72
  e
73
73
  );
74
- return n.holes.forEach((r) => {
74
+ return t.holes.forEach((r) => {
75
75
  s = s.flatMap(
76
- (i) => V(i, r, e)
76
+ (i) => J(i, r, e)
77
77
  );
78
78
  }), s;
79
79
  }
80
- function Wt(t, n) {
81
- return new g(
82
- kt(v(t), v(n))
80
+ function sn(n, t) {
81
+ return new h(
82
+ Ot(L(n), L(t))
83
83
  );
84
84
  }
85
- function D(t) {
86
- return t.reduce(
87
- (n, e) => Wt(n, e),
88
- new g()
85
+ function z(n) {
86
+ return n.reduce(
87
+ (t, e) => sn(t, e),
88
+ new h()
89
89
  );
90
90
  }
91
- function ut(t, n) {
92
- return new g(
93
- Et(v(t), v(n))
91
+ function Pt(n, t) {
92
+ return new h(
93
+ Bt(L(n), L(t))
94
94
  );
95
95
  }
96
- function Mn(t, n) {
97
- return new g(
98
- yt(v(t), v(n))
96
+ function yn(n, t) {
97
+ return new h(
98
+ Rt(L(n), L(t))
99
99
  );
100
100
  }
101
- function In(t, n, e = !0) {
102
- if (n instanceof S)
103
- return V(t, n, e);
104
- if (n instanceof w)
105
- return H(t, n, e);
106
- let s = [new R([...t.segments])];
107
- return n.figures.forEach((r) => {
108
- s = s.flatMap((i) => H(i, r, e));
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
109
  }), s;
110
110
  }
111
- function Sn(t, n, e = !1) {
112
- if (n instanceof S)
113
- return q(t, n, e);
114
- if (n instanceof w)
115
- return W(t, n, e);
116
- let s = [new R([...t.segments])];
117
- return n.figures.forEach((r) => {
118
- s = s.flatMap((i) => W(i, r, e));
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
119
  }), s;
120
120
  }
121
- function X(t) {
122
- return t < 0 ? "before" : t > 1 ? "after" : "between";
121
+ function tt(n) {
122
+ return n < 0 ? "before" : n > 1 ? "after" : "between";
123
123
  }
124
- const Y = (t, n, e) => {
124
+ const nt = (n, t, e) => {
125
125
  if (e === "before")
126
- return t.distanceFrom(n.firstPoint);
126
+ return n.distanceFrom(t.firstPoint);
127
127
  if (e === "after")
128
- return t.distanceFrom(n.lastPoint);
128
+ return n.distanceFrom(t.lastPoint);
129
129
  throw new Error("Invalid position");
130
130
  };
131
- function Xt(t, n) {
132
- const e = Bt(t, n);
131
+ function rn(n, t) {
132
+ const e = Vt(n, t);
133
133
  if (e === "parallel")
134
134
  return Math.min(
135
- t.distanceFrom(n.firstPoint),
136
- t.distanceFrom(n.lastPoint)
135
+ n.distanceFrom(t.firstPoint),
136
+ n.distanceFrom(t.lastPoint)
137
137
  );
138
- const { intersectionParam1: s, intersectionParam2: r } = e, i = X(s), o = X(r);
138
+ const { intersectionParam1: s, intersectionParam2: r } = e, i = tt(s), o = tt(r);
139
139
  if (i === "between" && o === "between")
140
140
  return 0;
141
141
  if (i === "between" && o !== "between")
142
- return Y(t, n, o);
142
+ return nt(n, t, o);
143
143
  if (o === "between" && i !== "between")
144
- return Y(n, t, i);
144
+ return nt(t, n, i);
145
145
  if (i === "before" && o === "before")
146
- return L(t.firstPoint, n.firstPoint);
146
+ return b(n.firstPoint, t.firstPoint);
147
147
  if (i === "after" && o === "after")
148
- return L(t.lastPoint, n.lastPoint);
148
+ return b(n.lastPoint, t.lastPoint);
149
149
  if (i === "before" && o === "after")
150
- return L(t.firstPoint, n.lastPoint);
150
+ return b(n.firstPoint, t.lastPoint);
151
151
  if (i === "after" && o === "before")
152
- return L(t.lastPoint, n.firstPoint);
152
+ return b(n.lastPoint, t.firstPoint);
153
153
  throw new Error("Invalid position");
154
154
  }
155
- function K(t, n) {
156
- if (Ft(t, n).length > 0)
155
+ function et(n, t) {
156
+ if (zt(n, t).length > 0)
157
157
  return 0;
158
- const e = Ct(t, n.center);
159
- if (t.isOnSegment(e)) {
160
- const s = L(e, n.center);
161
- if (Math.abs(s - n.radius) < t.precision && n.isOnSegment(e))
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))
162
162
  return 0;
163
- if (s - n.radius > t.precision) {
164
- const r = ot(
165
- y(e, n.center)
166
- ), i = zt(
167
- n.center,
168
- Tt(r, n.radius)
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)
169
169
  );
170
- if (n.isOnSegment(i))
171
- return L(i, e);
170
+ if (t.isOnSegment(i))
171
+ return b(i, e);
172
172
  }
173
173
  }
174
174
  return Math.min(
175
- n.distanceFrom(t.firstPoint),
176
- n.distanceFrom(t.lastPoint),
177
175
  t.distanceFrom(n.firstPoint),
178
- t.distanceFrom(n.lastPoint)
176
+ t.distanceFrom(n.lastPoint),
177
+ n.distanceFrom(t.firstPoint),
178
+ n.distanceFrom(t.lastPoint)
179
179
  );
180
180
  }
181
- const Yt = (t, n) => {
182
- const e = t.angleToParam(n.firstAngle);
183
- if (t.isValidParameter(e)) return !0;
184
- const s = t.angleToParam(n.lastAngle);
185
- return !!t.isValidParameter(s);
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);
186
186
  };
187
- function Kt(t, n) {
188
- if (xt(t, n, !0).length > 0) return 0;
189
- const e = L(t.center, n.center);
190
- if (e < t.precision && Yt(t, n))
191
- return Math.abs(t.radius - n.radius);
192
- const s = ot(y(n.center, t.center)), r = e - Math.abs(t.radius - n.radius) < t.precision;
193
- let i = $t(s);
194
- r && n.radius > t.radius && (i += Math.PI);
195
- const o = r ? i : i + Math.PI, f = t.angleToParam(i), c = n.angleToParam(o);
196
- return t.isValidParameter(f) && n.isValidParameter(c) ? L(t.paramPoint(f), n.paramPoint(c)) : Math.min(
197
- t.distanceFrom(n.firstPoint),
198
- t.distanceFrom(n.lastPoint),
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(
199
197
  n.distanceFrom(t.firstPoint),
200
- n.distanceFrom(t.lastPoint)
198
+ n.distanceFrom(t.lastPoint),
199
+ t.distanceFrom(n.firstPoint),
200
+ t.distanceFrom(n.lastPoint)
201
201
  );
202
202
  }
203
- function jt(t, n, e) {
204
- let s = 0, r = t.length - 1;
203
+ function cn(n, t, e) {
204
+ let s = 0, r = n.length - 1;
205
205
  for (; s <= r; ) {
206
- const i = Math.floor((s + r) / 2), o = e(t[i], n);
206
+ const i = Math.floor((s + r) / 2), o = e(n[i], t);
207
207
  if (o < 0)
208
208
  s = i + 1;
209
209
  else if (o > 0)
@@ -213,471 +213,667 @@ function jt(t, n, e) {
213
213
  }
214
214
  return -(s + 1);
215
215
  }
216
- function tn(t, n, e) {
217
- const s = jt(t, n, e);
218
- s < 0 ? t.splice(-(s + 1), 0, n) : t.splice(s, 0, n);
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);
219
219
  }
220
- class nn {
220
+ class ln {
221
221
  constructor() {
222
222
  P(this, "buckets");
223
223
  this.buckets = [];
224
224
  }
225
- addInterval(n) {
226
- const e = this.buckets[n.rectangle.diagonalBucketIndex];
227
- e === void 0 ? this.buckets[n.rectangle.diagonalBucketIndex] = [n] : tn(e, n, (s, r) => s.value - r.value);
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);
228
228
  }
229
- removeInterval(n) {
230
- const e = this.buckets[n.rectangle.diagonalBucketIndex];
229
+ removeInterval(t) {
230
+ const e = this.buckets[t.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 n = [];
236
+ const t = [];
237
237
  for (let e = this.buckets.length - 1; e >= 0; e--) {
238
238
  const s = this.buckets[e];
239
239
  if (!s === void 0) continue;
240
240
  const r = s[0];
241
241
  if (r !== void 0) {
242
- if (!n.length) {
243
- n.push(r);
242
+ if (!t.length) {
243
+ t.push(r);
244
244
  continue;
245
245
  }
246
- for (; n.length && n[n.length - 1].value >= r.value; )
247
- n.pop();
248
- for (; n.length >= 2; ) {
249
- const i = n[n.length - 1], o = n[n.length - 2], f = (r.value - o.value) / ((r.rectangle.diagonal - o.rectangle.diagonal) * 2);
250
- if (o.value + (i.rectangle.diagonal - o.rectangle.diagonal) / 2 * f < i.value)
251
- n.pop();
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();
252
252
  else
253
253
  break;
254
254
  }
255
- n.push(r);
255
+ t.push(r);
256
256
  }
257
257
  }
258
- return n;
258
+ return t;
259
259
  }
260
260
  }
261
- class en {
262
- constructor(n, e) {
261
+ class un {
262
+ constructor(t, e) {
263
263
  P(this, "diagonal");
264
264
  P(this, "diagonalBucketIndex");
265
265
  P(this, "xLength");
266
266
  P(this, "yLength");
267
267
  P(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(
268
+ this.x = t, this.y = e, this.xLength = Math.pow(3, -t), this.yLength = Math.pow(3, -e), this.diagonal = Math.sqrt(
269
269
  this.xLength * this.xLength + this.yLength * this.yLength
270
- ), this.diagonalBucketIndex = n + e, this.index = `${n},${e}`;
270
+ ), this.diagonalBucketIndex = t + e, this.index = `${t},${e}`;
271
271
  }
272
272
  }
273
- class sn {
274
- constructor(n, e = 1e-8, s = 1e3, r = 1e-6) {
273
+ class hn {
274
+ constructor(t, e = 1e-8, s = 1e3, r = 1e-6) {
275
275
  P(this, "rectangles");
276
276
  P(this, "buckets");
277
277
  P(this, "fMin");
278
278
  P(this, "argMin");
279
279
  P(this, "tol");
280
- this.fcn = n, this.endTolerance = e, this.maxIterations = s, this.epsilon = r, this.fcn = n, this.epsilon = r, this.endTolerance = e, this.maxIterations = s, this.rectangles = /* @__PURE__ */ new Map(), this.buckets = new nn();
281
- const i = [0.5, 0.5], o = this.rect(0, 0), f = this.fcn(i);
282
- this.buckets.addInterval(new x(i, f, o)), this.fMin = f, this.argMin = i, this.tol = o.diagonal;
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
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);
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
286
  }
287
- rect(n, e) {
288
- const s = `${n},${e}`;
289
- return this.rectangles.has(s) || this.rectangles.set(s, new en(n, e)), this.rectangles.get(s);
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
290
  }
291
- splitInterval(n) {
291
+ splitInterval(t) {
292
292
  let e, s, r;
293
- const [i, o] = n.center;
294
- return n.rectangle.x <= n.rectangle.y ? (e = this.rect(n.rectangle.x + 1, n.rectangle.y), s = [i - e.xLength, o], r = [i + e.xLength, o]) : (e = this.rect(n.rectangle.x, n.rectangle.y + 1), s = [i, o - e.yLength], r = [i, o + e.yLength]), [
295
- new x(s, this.fcn(s), e),
296
- new x(n.center, n.value, e),
297
- new x(r, this.fcn(r), e)
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)
298
298
  ];
299
299
  }
300
300
  single_iteration() {
301
- const n = this.buckets.getBottomRightHullIntervals();
302
- for (; n.length >= 2; ) {
303
- const e = n[0], s = n[1], r = (s.value - e.value) / ((s.rectangle.diagonal - e.rectangle.diagonal) / 2), i = e.value - r * s.value / 2;
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;
304
304
  if ((this.fMin - i) / Math.abs(this.fMin) < this.epsilon)
305
- n.shift();
305
+ t.shift();
306
306
  else
307
307
  break;
308
308
  }
309
- n.forEach((e) => {
309
+ t.forEach((e) => {
310
310
  this.buckets.removeInterval(e);
311
311
  });
312
- for (const e of n) {
312
+ for (const e of t) {
313
313
  const [s, r, i] = this.splitInterval(e);
314
314
  this.registerInterval(s), this.registerInterval(r), this.registerInterval(i);
315
315
  }
316
316
  }
317
317
  run() {
318
- let n = 0;
319
- for (; this.tol > this.endTolerance / 2 && (this.single_iteration(), n++, !(n > this.maxIterations)); )
318
+ let t = 0;
319
+ for (; this.tol > this.endTolerance / 2 && (this.single_iteration(), t++, !(t > this.maxIterations)); )
320
320
  ;
321
321
  return {
322
322
  fMin: this.fMin,
323
323
  argMin: this.argMin,
324
324
  tol: this.tol,
325
- iterations: n
325
+ iterations: t
326
326
  };
327
327
  }
328
328
  }
329
- class x {
330
- constructor(n, e, s) {
331
- this.center = n, this.value = e, this.rectangle = s;
329
+ class O {
330
+ constructor(t, e, s) {
331
+ this.center = t, this.value = e, this.rectangle = s;
332
332
  }
333
333
  }
334
- function rn(t, n = 1e-8, e = 1e3, s = 1e-6) {
335
- return new sn(
336
- t,
334
+ function gn(n, t = 1e-8, e = 1e3, s = 1e-6) {
335
+ return new hn(
337
336
  n,
337
+ t,
338
338
  e,
339
339
  s
340
340
  ).run();
341
341
  }
342
- function on(t, n, e = 1e-9) {
343
- const s = rn((r) => {
344
- const i = t.paramPoint(r[0]), o = n.paramPoint(r[1]);
345
- return at(i, o);
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);
346
346
  }, e);
347
347
  return Math.sqrt(s.fMin);
348
348
  }
349
- function an(t, n) {
350
- return t instanceof I && n instanceof I ? Xt(t, n) : t instanceof I && n instanceof E ? K(t, n) : t instanceof E && n instanceof I ? K(n, t) : t instanceof E && n instanceof E ? Kt(t, n) : on(t, n);
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);
351
351
  }
352
- function ht(t) {
353
- if (t instanceof B) {
354
- const r = y(t.lastPoint, t.firstPoint), i = y(t.firstControlPoint, t.firstPoint), o = y(t.lastControlPoint, t.firstPoint), f = Q(r, i), c = Q(r, o);
355
- if (f > 0 && c < 0 || f < 0 && c > 0) return !1;
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;
356
356
  }
357
- const n = J(t.tangentAtFirstPoint), e = J(t.tangentAtLastPoint);
358
- let s = Gt(n, e);
357
+ const t = Y(n.tangentAtFirstPoint), e = Y(n.tangentAtLastPoint);
358
+ let s = Nt(t, e);
359
359
  return Math.abs(Math.acos(s)) < Math.PI / 3;
360
360
  }
361
- function $(t) {
362
- if (ht(t)) return [t];
363
- const [n, e] = t.splitAtParameters([0.5]);
361
+ function K(n) {
362
+ if (wt(n)) return [n];
363
+ const [t, e] = n.splitAtParameters([0.5]);
364
364
  return [
365
- ...$(n),
366
- ...$(e)
365
+ ...K(t),
366
+ ...K(e)
367
367
  ];
368
368
  }
369
- function j(t) {
370
- return ht(t) ? [t] : t.splitAtParameters(t.getParametersOfExtrema()).flatMap($);
369
+ function st(n) {
370
+ return wt(n) ? [n] : n.splitAtParameters(n.getParametersOfExtrema()).flatMap(K);
371
371
  }
372
- function cn(t) {
373
- const n = t.deltaAngle, e = Math.ceil(Math.abs(n) / (Math.PI / 2)), s = n / e, r = 4 * Math.tan(s / 4) / 3, i = t.clockwise ? -1 : 1, o = Array.from(
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(
374
374
  { length: e + 1 },
375
- (c, a) => t.firstAngle + a * s * i
375
+ (f, c) => n.firstAngle + c * s * i
376
376
  );
377
- return o.slice(0, -1).map((c, a) => [c, o[a + 1]]).map(([c, a]) => {
378
- const l = Math.cos(c), p = Math.sin(c), h = Math.cos(a), d = Math.sin(a), [u, M] = t.center, m = t.minorRadius, b = t.majorRadius, k = new Ut().rotate(
379
- t.tiltAngle,
380
- t.center
381
- ), F = (St) => k.transform(St), C = F([u + b * l, M + m * p]), z = F([
382
- u + b * (l - r * p * i),
383
- M + m * (p + r * l * i)
384
- ]), Mt = F([
385
- u + b * (h + r * d * i),
386
- M + m * (d - r * h * i)
387
- ]), It = F([u + b * h, M + m * d]);
388
- return new B(C, It, z, Mt);
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);
389
389
  });
390
390
  }
391
- const N = 1e-8, gt = (t) => t.flatMap((n) => n instanceof I ? [n] : n instanceof E ? [n] : n instanceof ct ? cn(n).flatMap(
392
- (e) => j(e)
393
- ) : n instanceof ft || n instanceof B ? j(n) : [new I(n.firstPoint, n.lastPoint)]);
394
- function G(t, n, e = !0) {
395
- const s = t.map((a) => ({
396
- offset: At(a, n),
397
- original: a
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
398
  })), r = [];
399
399
  let i = e ? null : s.at(-1), o = e ? s.at(-1) : null;
400
400
  if (r.length === 1) return r;
401
- const f = (a) => {
402
- i ? a.offset instanceof T ? A(a.offset.firstPoint, a.offset.lastPoint) || r.push(
403
- new I(a.offset.firstPoint, a.offset.lastPoint)
404
- ) : r.push(a.offset) : i = a;
405
- }, c = function* () {
406
- for (const a of s.slice(0, -1))
407
- yield a;
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;
405
+ }, f = function* () {
406
+ for (const c of s.slice(0, -1))
407
+ yield c;
408
408
  if (!i) throw new Error("Bug in the offset algorithm");
409
409
  yield i;
410
410
  };
411
- for (const a of c()) {
411
+ for (const c of f()) {
412
412
  if (!o) {
413
- o = a;
413
+ o = c;
414
414
  continue;
415
415
  }
416
- const l = o.offset.lastPoint, p = a.offset.firstPoint;
417
- if (A(l, p)) {
418
- f(o), o = a;
416
+ const l = o.offset.lastPoint, p = c.offset.firstPoint;
417
+ if (I(l, p)) {
418
+ a(o), o = c;
419
419
  continue;
420
420
  }
421
- let h = [];
422
- if (!(o.offset instanceof T) && !(a.offset instanceof T)) {
423
- const { intersections: m, overlaps: b } = _(
421
+ let g = [];
422
+ if (!(o.offset instanceof U) && !(c.offset instanceof U)) {
423
+ const { intersections: M, overlaps: v } = N(
424
424
  o.offset,
425
- a.offset,
426
- N / 100
425
+ c.offset,
426
+ X / 100
427
427
  );
428
- h = [
429
- ...m,
430
- ...b.flatMap((k) => [k.firstPoint, k.lastPoint])
428
+ g = [
429
+ ...M,
430
+ ...v.flatMap((k) => [k.firstPoint, k.lastPoint])
431
431
  ];
432
432
  }
433
- if (h.length > 0) {
434
- let m = h[0];
435
- if (h.length > 1) {
436
- const F = o == null ? void 0 : o.original.lastPoint, C = h.map(
437
- (z) => at(z, F)
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)
438
438
  );
439
- m = h[C.indexOf(Math.min(...C))];
439
+ M = g[D.indexOf(Math.min(...D))];
440
440
  }
441
- const b = o.offset.splitAt([
442
- m
443
- ])[0], k = a.offset.splitAt([m]).at(-1);
441
+ const v = o.offset.splitAt([
442
+ M
443
+ ])[0], k = c.offset.splitAt([M]).at(-1);
444
444
  if (!k) throw new Error("Bug in the splitting algo in offset");
445
- f({
446
- offset: b,
445
+ a({
446
+ offset: v,
447
447
  original: o.original
448
- }), o = { offset: k, original: a.original };
448
+ }), o = { offset: k, original: c.original };
449
449
  continue;
450
450
  }
451
- const d = o.original.lastPoint, u = Vt(
452
- y(p, d),
453
- y(l, d)
454
- ) > 0, M = new E(l, p, d, u);
455
- f(o), r.push(M), o = a;
456
- }
457
- return o && f(o), r;
458
- }
459
- function pt(t) {
460
- const n = /* @__PURE__ */ new Map(), e = (s, r) => {
461
- const i = n.get(s) || [];
462
- n.set(s, [...i, ...r]);
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]);
463
463
  };
464
- return t.forEach((s, r) => {
465
- t.slice(r + 1).forEach((i, o) => {
466
- const { intersections: f, overlaps: c } = _(s, i, N), a = [
467
- ...f,
468
- ...c.flatMap((l) => [l.firstPoint, l.lastPoint])
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
469
  ].filter((l) => {
470
- const p = A(l, s.firstPoint) || A(l, s.lastPoint), h = A(l, i.firstPoint) || A(l, i.lastPoint);
471
- return !(p && h);
470
+ const p = I(l, s.firstPoint) || I(l, s.lastPoint), g = I(l, i.firstPoint) || I(l, i.lastPoint);
471
+ return !(p && g);
472
472
  });
473
- a.length && (e(r, a), e(o + r + 1, a));
473
+ c.length && (e(r, c), e(o + r + 1, c));
474
474
  });
475
- }), n;
475
+ }), t;
476
476
  }
477
- function dt(t, n) {
478
- return n.flatMap((e, s) => {
479
- if (!t.has(s)) return e;
480
- const r = t.get(s);
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
481
  return r ? e.splitAt(r) : e;
482
482
  });
483
483
  }
484
- function Pt(t, n, e) {
485
- return t.filter((s) => !n.segments.some((i) => an(i, s) < Math.abs(e) - N));
484
+ function bt(n, t, e) {
485
+ return n.filter((s) => !t.segments.some((i) => dn(i, s) < Math.abs(e) - X));
486
486
  }
487
- function O(t, n) {
488
- const e = t.clockwise ? n : -n, s = gt(t.segments), r = G(s, e);
489
- if (r.length < 2) return new g();
490
- const i = pt(r);
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);
491
491
  if (!i.size) {
492
- const l = new S(r);
493
- return new g([new w(l)]);
492
+ const l = new w(r);
493
+ return new h([new m(l)]);
494
494
  }
495
- const o = dt(
495
+ const o = St(
496
496
  i,
497
497
  r
498
- ), f = Pt(o, t, n);
499
- if (!f.length) return new g();
500
- const a = rt(f).filter((l) => l.length > 1).filter((l) => A(l[0].firstPoint, l.at(-1).lastPoint)).map((l) => new S(l));
501
- return a.length ? new g(a.map((l) => new w(l))) : new g();
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
502
  }
503
- function fn(t, n, e = "round") {
504
- const s = n / 2, r = gt(t.segments), i = G(r, s, !1), o = G(
503
+ function Pn(n, t, e = "round") {
504
+ const s = t / 2, r = Mt(n.segments), i = q(r, s, !1), o = q(
505
505
  r,
506
506
  -s,
507
507
  !1
508
508
  ).map((u) => u.reverse());
509
509
  o.reverse();
510
- const f = (u, M) => e === "round" ? _t(
510
+ const a = (u, S) => e === "round" ? Qt(
511
511
  u.lastPoint,
512
- M.firstPoint,
512
+ S.firstPoint,
513
513
  u.tangentAtLastPoint
514
- ) : new I(u.lastPoint, M.firstPoint), c = [
514
+ ) : new A(u.lastPoint, S.firstPoint), f = [
515
515
  ...i,
516
- f(
516
+ a(
517
517
  i[i.length - 1],
518
518
  o[0]
519
519
  ),
520
520
  ...o,
521
- f(
521
+ a(
522
522
  o[o.length - 1],
523
523
  i[0]
524
524
  )
525
- ], a = pt(c);
526
- if (!a.size) {
527
- const u = new S(c);
528
- return new g([new w(u)]);
529
- }
530
- const l = dt(
531
- a,
532
- c
533
- ), p = Pt(l, t, s);
534
- if (!p.length) return new g();
535
- const d = rt(p).filter((u) => u.length > 1).filter((u) => A(u[0].firstPoint, u.at(-1).lastPoint)).map((u) => new S(u));
536
- return d.length ? new g(d.map((u) => new w(u))) : new g();
537
- }
538
- function ln(t, n) {
539
- const e = t.map((s) => {
540
- const r = D(
541
- s.holes.map((i) => O(i, n))
525
+ ], c = It(f);
526
+ if (!c.size) {
527
+ const u = new w(f);
528
+ return new h([new m(u)]);
529
+ }
530
+ const l = St(
531
+ c,
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))
542
542
  );
543
- return ut(O(s.contour, n), r);
543
+ return Pt(T(s.contour, t), r);
544
544
  });
545
- return D(e);
545
+ return z(e);
546
546
  }
547
- function un(t, n) {
548
- const e = Math.abs(n / 2), s = t.map(
549
- (r) => D(
550
- r.allLoops.map((i) => ut(O(i, e), O(i, -e)))
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)))
551
551
  )
552
552
  );
553
- return D(s);
553
+ return z(s);
554
554
  }
555
- function bn(t, n) {
556
- return ln(v(t), n);
555
+ function Dn(n, t) {
556
+ return wn(L(n), t);
557
557
  }
558
- function Ln(t, n, { endCap: e = "round" } = {}) {
559
- return t instanceof R ? fn(t, n, e) : un(v(t), n);
558
+ function On(n, t, { endCap: e = "round" } = {}) {
559
+ return n instanceof y ? Pn(n, t, e) : Mn(L(n), t);
560
560
  }
561
- function tt(t) {
562
- if (t instanceof g)
563
- return Nt(t);
564
- if (t instanceof w)
565
- return Jt(t);
566
- if (t instanceof S)
567
- return `<path d="${Qt(t)}" />`;
568
- if (t instanceof R)
569
- return `<path d="${Zt(t)}" />`;
570
- if (Dt(t))
571
- return `<path d="${`M ${t.firstPoint.join(" ")}`} ${Ht(
572
- t
561
+ class In {
562
+ constructor() {
563
+ P(this, "filters");
564
+ this.filters = [];
565
+ }
566
+ delete() {
567
+ this.filters = [];
568
+ }
569
+ /**
570
+ * Combine logically a set of filter with an AND operation.
571
+ *
572
+ */
573
+ and(t) {
574
+ return t.forEach((e) => e(this)), this;
575
+ }
576
+ /**
577
+ * Invert the result of a particular filter
578
+ *
579
+ */
580
+ not(t) {
581
+ const e = new this.constructor();
582
+ t(e);
583
+ const s = ({ element: r }) => !e.shouldKeep(r);
584
+ return this.filters.push(s), this;
585
+ }
586
+ /**
587
+ * Combine logically a set of filter with an OR operation.
588
+ *
589
+ */
590
+ either(t) {
591
+ const e = t.map((r) => {
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;
596
+ }
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 - _);
601
+ };
602
+ class x extends In {
603
+ clone() {
604
+ const t = new x();
605
+ return t.filters = [...this.filters], t;
606
+ }
607
+ /**
608
+ * Filter to find corner that have their point are in the list.
609
+ *
610
+ */
611
+ inList(t) {
612
+ const e = ({ element: s }) => !!t.find((r) => I(r, s.point));
613
+ return this.filters.push(e), this;
614
+ }
615
+ /**
616
+ * Filter to find elements that are at a specified distance from a point.
617
+ *
618
+ */
619
+ atDistance(t, e = [0, 0]) {
620
+ function s({ element: r }) {
621
+ return Math.abs(b(e, r.point) - t) < 1e-9;
622
+ }
623
+ return this.filters.push(s), this;
624
+ }
625
+ /**
626
+ * Filter to find elements that contain a certain point
627
+ *
628
+ * @category Filter
629
+ */
630
+ atPoint(t) {
631
+ function e({ element: s }) {
632
+ return I(t, s.point);
633
+ }
634
+ return this.filters.push(e), this;
635
+ }
636
+ /**
637
+ * Filter to find elements that are within a box
638
+ *
639
+ * @category Filter
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;
646
+ }
647
+ return this.filters.push(p), this;
648
+ }
649
+ /**
650
+ * Filter to find corner that a certain angle between them - only between
651
+ * 0 and 180.
652
+ *
653
+ */
654
+ ofAngle(t) {
655
+ function e({ element: s }) {
656
+ const r = s.firstCurve.tangentAtLastPoint, i = s.secondCurve.tangentAtFirstPoint;
657
+ return Math.abs(
658
+ rt(V(r, i)) - rt(Yt * t)
659
+ ) < 1e-9;
660
+ }
661
+ return this.filters.push(e), this;
662
+ }
663
+ above(t = 0) {
664
+ function e({ element: s }) {
665
+ return s.point[1] > t;
666
+ }
667
+ return this.filters.push(e), this;
668
+ }
669
+ below(t = 0) {
670
+ function e({ element: s }) {
671
+ return s.point[1] < t;
672
+ }
673
+ return this.filters.push(e), this;
674
+ }
675
+ leftOf(t = 0) {
676
+ function e({ element: s }) {
677
+ return s.point[0] < t;
678
+ }
679
+ return this.filters.push(e), this;
680
+ }
681
+ rightOf(t = 0) {
682
+ function e({ element: s }) {
683
+ return s.point[0] > t;
684
+ }
685
+ return this.filters.push(e), this;
686
+ }
687
+ shouldKeep(t) {
688
+ return this.filters.every((s) => s({ element: t }));
689
+ }
690
+ asFilterFun() {
691
+ return this.shouldKeep.bind(this);
692
+ }
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);
697
+ };
698
+ if (t.segments.slice(1).forEach((a) => {
699
+ const f = r.pop();
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)
706
+ throw new Error("Bug in the filletting algo");
707
+ return i(a, f), new w(r, { ignoreChecks: !0 });
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));
717
+ return new m(i, o, { ignoreChecks: !0 });
718
+ }
719
+ if (n instanceof h) {
720
+ const i = n.figures.map((o) => B(o, t, s));
721
+ return new h(i, { ignoreChecks: !0 });
722
+ }
723
+ throw new Error("invalid shape to fillet");
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));
731
+ return new m(i, o, { ignoreChecks: !0 });
732
+ }
733
+ if (n instanceof h) {
734
+ const i = n.figures.map((o) => R(o, t, s));
735
+ return new h(i, { ignoreChecks: !0 });
736
+ }
737
+ throw new Error("invalid shape to chamfer");
738
+ }
739
+ class Sn extends x {
740
+ constructor(t) {
741
+ super(), this.shape = t;
742
+ }
743
+ fillet(t) {
744
+ return B(this.shape, t, this.clone());
745
+ }
746
+ chamfer(t) {
747
+ return R(this.shape, t, this.clone());
748
+ }
749
+ }
750
+ function Bn(n) {
751
+ return new Sn(n);
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
573
765
  )}" />`;
574
766
  throw new Error("Unknown shape type");
575
767
  }
576
- const nt = (t) => "shape" in t ? t.shape : t, et = (t, n) => {
577
- if (!("shape" in t)) return n;
578
- const { color: e } = t;
579
- return e ? `<g stroke="${e}">${n}</g>` : n;
580
- }, st = (t) => new qt(t.xMin, -t.yMax, t.xMax, -t.yMin);
581
- function An(t, {
582
- margin: n = 1,
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,
583
775
  unit: e = null,
584
776
  viewBox: s
585
777
  } = {}) {
586
- if (Array.isArray(t)) {
587
- const i = t.map((c) => nt(c).mirror()), o = i.map((c, a) => et(t[a], tt(c))).join(`
588
- `), f = i.slice(1).reduce((c, a) => c.merge(a.boundingBox), i[0].boundingBox);
589
- return Z(o, s ? st(s) : f, n, e);
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);
590
782
  }
591
- const r = nt(t).mirror();
783
+ const r = ot(n).mirror();
592
784
  return Z(
593
- et(t, tt(r)),
594
- s ? st(s) : r.boundingBox,
595
- n,
785
+ at(n, it(r)),
786
+ s ? ct(s) : r.boundingBox,
787
+ t,
596
788
  e
597
789
  );
598
790
  }
599
- const mt = (t) => {
600
- if (t.type === "LINE")
601
- return new I(t.firstPoint, t.lastPoint);
602
- if (t.type === "ARC")
791
+ const vt = (n) => {
792
+ if (n.type === "LINE")
793
+ return new A(n.firstPoint, n.lastPoint);
794
+ if (n.type === "ARC")
603
795
  return new E(
604
- t.firstPoint,
605
- t.lastPoint,
606
- t.center,
607
- t.clockwise
796
+ n.firstPoint,
797
+ n.lastPoint,
798
+ n.center,
799
+ n.clockwise
608
800
  );
609
- if (t.type === "ELLIPSE_ARC")
610
- return new ct(
611
- t.firstPoint,
612
- t.lastPoint,
613
- t.center,
614
- t.majorRadius,
615
- t.minorRadius,
616
- t.tiltAngle,
617
- t.clockwise,
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,
618
810
  { angleUnits: "rad" }
619
811
  );
620
- if (t.type === "QUADRATIC_BEZIER")
621
- return new ft(
622
- t.firstPoint,
623
- t.lastPoint,
624
- t.controlPoint
812
+ if (n.type === "QUADRATIC_BEZIER")
813
+ return new dt(
814
+ n.firstPoint,
815
+ n.lastPoint,
816
+ n.controlPoint
625
817
  );
626
- if (t.type === "CUBIC_BEZIER")
627
- return new B(
628
- t.firstPoint,
629
- t.lastPoint,
630
- t.firstControlPoint,
631
- t.lastControlPoint
818
+ if (n.type === "CUBIC_BEZIER")
819
+ return new $(
820
+ n.firstPoint,
821
+ n.lastPoint,
822
+ n.firstControlPoint,
823
+ n.lastControlPoint
632
824
  );
633
825
  throw new Error("Unknown segment type");
634
- }, U = (t) => {
635
- const n = t.segments.map(mt);
636
- return new S(n);
637
- }, wt = (t) => {
638
- const n = U(t.contour), e = t.holes.map(U);
639
- return new w(n, e);
640
- }, hn = (t) => {
641
- const n = t.figures.map(wt);
642
- return new g(n);
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);
643
835
  };
644
- function vn(t) {
645
- if (t.type === "DIAGRAM")
646
- return hn(t);
647
- if (t.type === "FIGURE")
648
- return wt(t);
649
- if (t.type === "LOOP")
650
- return U(t);
651
- if (t.type === "LINE" || t.type === "ARC" || t.type === "ELLIPSE_ARC" || t.type === "CUBIC_BEZIER")
652
- return mt(t);
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);
653
845
  throw new Error("Unknown shape type");
654
846
  }
655
- const it = Math.PI / 180, gn = 180 / Math.PI;
656
- function kn(t, n) {
657
- const e = Math.cos(n * it) * t, s = Math.sin(n * it) * t;
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;
658
850
  return [e, s];
659
851
  }
660
- function En([t, n]) {
661
- const e = Math.sqrt(t * t + n * n), s = Math.atan2(n, t) * gn;
852
+ function $n([n, t]) {
853
+ const e = Math.sqrt(n * n + t * t), s = Math.atan2(t, n) * An;
662
854
  return [e, s];
663
855
  }
664
856
  export {
665
- it as DEG2RAD,
666
- gn as RAD2DEG,
667
- En as cartesianToPolar,
668
- Sn as confineStrand,
669
- ut as cut,
670
- Cn as draw,
671
- In as eraseStrand,
672
- Dn as exportJSON,
673
- An as exportSVG,
674
- Wt as fuse,
675
- D as fuseAll,
676
- vn as importJSON,
677
- Mn as intersect,
678
- bn as offset,
679
- Ln as outlineStroke,
680
- kn as polarToCartesian,
681
- tt as svgBody
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,
870
+ 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
682
878
  };
683
879
  //# sourceMappingURL=pantograph.js.map