likec4 1.59.3 → 1.60.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 (99) hide show
  1. package/__app__/codegen/react.mjs +6 -6
  2. package/__app__/codegen/webcomponent.mjs +147 -69
  3. package/__app__/src/aichat/index.mjs +10 -5
  4. package/__app__/src/chunks/AIChat.mjs +1134 -693
  5. package/__app__/src/chunks/LikeC4Styles.mjs +4101 -1737
  6. package/__app__/src/chunks/ProjectsOverview.mjs +624 -334
  7. package/__app__/src/chunks/es.mjs +515 -335
  8. package/__app__/src/chunks/hooks.mjs +578 -366
  9. package/__app__/src/chunks/libs/@floating-ui.mjs +2720 -1966
  10. package/__app__/src/chunks/libs/@mantine.mjs +14067 -9487
  11. package/__app__/src/chunks/libs/@tanstack-ai.mjs +2266 -1146
  12. package/__app__/src/chunks/libs/@tanstack.mjs +3152 -1932
  13. package/__app__/src/chunks/libs/@xstate/react.mjs +2924 -1468
  14. package/__app__/src/chunks/libs/@xyflow/react.mjs +6627 -4067
  15. package/__app__/src/chunks/libs/bezier-js.mjs +1312 -726
  16. package/__app__/src/chunks/libs/d3.mjs +3218 -1509
  17. package/__app__/src/chunks/libs/fast-equals.mjs +437 -201
  18. package/__app__/src/chunks/libs/framer.mjs +9251 -3846
  19. package/__app__/src/chunks/libs/nanostores.mjs +174 -0
  20. package/__app__/src/chunks/libs/zod.mjs +4591 -2363
  21. package/__app__/src/chunks/rolldown-runtime.mjs +39 -23
  22. package/__app__/src/chunks/styled-system.mjs +3538 -756
  23. package/__app__/src/fonts.css +112 -1
  24. package/__app__/src/main.mjs +44398 -24039
  25. package/__app__/src/style.css +18488 -1
  26. package/config/schema.json +136 -97
  27. package/dist/app/render-view-client.css +1 -1
  28. package/dist/app/render-view-client.js +506 -338
  29. package/dist/chunks/enableServer.mjs +1 -1
  30. package/dist/chunks/filenames.mjs +16 -14
  31. package/dist/chunks/generate-likec4.mjs +5 -0
  32. package/dist/chunks/index.d.mts +246 -180
  33. package/dist/chunks/index2.d.mts +2882 -1977
  34. package/dist/chunks/libs/@chevrotain/gast.mjs +27 -1
  35. package/dist/chunks/libs/@chevrotain/regexp-to-ast.mjs +81 -9
  36. package/dist/chunks/libs/@chevrotain/types.d.mts +111 -0
  37. package/dist/chunks/libs/@logtape/logtape.mjs +5 -4
  38. package/dist/chunks/libs/@lume/kiwi.mjs +1 -1
  39. package/dist/chunks/libs/@ts-graphviz/core.mjs +1 -1
  40. package/dist/chunks/libs/birpc.mjs +1 -1
  41. package/dist/chunks/libs/chevrotain-allstar.mjs +2 -2
  42. package/dist/chunks/libs/chevrotain.mjs +87 -35
  43. package/dist/chunks/libs/eventemitter3.mjs +1 -1
  44. package/dist/chunks/libs/json5.mjs +4 -4
  45. package/dist/chunks/libs/langium.d.mts +9903 -5297
  46. package/dist/chunks/libs/langium.mjs +16 -24
  47. package/dist/chunks/libs/merge-error-cause.mjs +1 -1
  48. package/dist/chunks/libs/p-limit.mjs +1 -0
  49. package/dist/chunks/libs/p-queue.mjs +1 -1
  50. package/dist/chunks/libs/package-manager-detector.mjs +1 -1
  51. package/dist/chunks/libs/pako.mjs +2 -2
  52. package/dist/chunks/libs/pretty-ms.mjs +1 -1
  53. package/dist/chunks/libs/remeda.mjs +1 -1
  54. package/dist/chunks/libs/ufo.mjs +1 -1
  55. package/dist/chunks/libs/unstorage.mjs +1 -1
  56. package/dist/chunks/libs/which.mjs +1 -1
  57. package/dist/chunks/node.mjs +60 -60
  58. package/dist/chunks/rolldown-runtime.mjs +1 -1
  59. package/dist/chunks/sequence-view.mjs +1 -1
  60. package/dist/chunks/vite-plugin.mjs +55 -52
  61. package/dist/cli/index.d.mts +1 -1
  62. package/dist/cli/index.mjs +208 -1300
  63. package/dist/config/index.d.mts +2 -2
  64. package/dist/generators/likec4.d.mts +6578 -0
  65. package/dist/generators/likec4.mjs +1 -0
  66. package/dist/index.d.mts +3 -3
  67. package/dist/model/index.d.mts +8 -5
  68. package/dist/vite-plugin/index.d.mts +6 -3
  69. package/dist/vite-plugin/index.mjs +1 -1
  70. package/dist/vite-plugin/internal/chunks/rolldown-runtime.mjs +9 -0
  71. package/dist/vite-plugin/internal/index.d.mts +16 -15
  72. package/dist/vite-plugin/internal/index.mjs +144 -46
  73. package/generators/likec4/package.json +4 -0
  74. package/package.json +117 -110
  75. package/react/index.d.mts +8500 -5399
  76. package/react/index.mjs +534 -58617
  77. package/react/rolldown-runtime-DnkiqaRY.js +1 -0
  78. package/skills/likec4-dsl/SKILL.md +428 -0
  79. package/skills/likec4-dsl/evals/evals-public.json +202 -0
  80. package/skills/likec4-dsl/evals/grading-spec.json +589 -0
  81. package/skills/likec4-dsl/references/bridge-leanix-drawio.md +42 -0
  82. package/skills/likec4-dsl/references/cli.md +139 -0
  83. package/skills/likec4-dsl/references/configuration.md +266 -0
  84. package/skills/likec4-dsl/references/deployment.md +160 -0
  85. package/skills/likec4-dsl/references/dynamic-views.md +455 -0
  86. package/skills/likec4-dsl/references/examples.md +370 -0
  87. package/skills/likec4-dsl/references/identifier-validity.md +90 -0
  88. package/skills/likec4-dsl/references/include-predicates-wildcards.md +179 -0
  89. package/skills/likec4-dsl/references/model.md +151 -0
  90. package/skills/likec4-dsl/references/predicates.md +123 -0
  91. package/skills/likec4-dsl/references/relationships-bidirectional.md +176 -0
  92. package/skills/likec4-dsl/references/specification.md +75 -0
  93. package/skills/likec4-dsl/references/style-tokens-colors.md +150 -0
  94. package/skills/likec4-dsl/references/troubleshooting.md +96 -0
  95. package/skills/likec4-dsl/references/views.md +329 -0
  96. package/vite-plugin-modules.d.ts +4 -2
  97. package/dist/chunks/libs/picomatch.mjs +0 -1
  98. package/dist/chunks/libs/zod.d.mts +0 -2140
  99. package/dist/chunks/libs/zod.mjs +0 -65
@@ -1,14 +1,21 @@
1
1
  import "../rolldown-runtime.mjs";
2
2
  //#region ../../node_modules/.pnpm/bezier-js@6.1.4/node_modules/bezier-js/src/utils.js
3
- var { abs: e, cos: n, sin: r, acos: i, atan2: a, sqrt: o, pow: s } = Math;
4
- function crt(e) {
5
- return e < 0 ? -s(-e, 1 / 3) : s(e, 1 / 3);
3
+ var { abs: abs$1, cos: cos$1, sin: sin$1, acos: acos$1, atan2, sqrt: sqrt$1, pow } = Math;
4
+ function crt(v) {
5
+ return v < 0 ? -pow(-v, 1 / 3) : pow(v, 1 / 3);
6
6
  }
7
- var c = Math.PI, l = 2 * c, u = c / 2, f = 1e-6, p = 2 ** 53 - 1 || 9007199254740991, m = -(2 ** 53 - 1) || -9007199254740991, h = {
7
+ var pi$1 = Math.PI;
8
+ var tau = 2 * pi$1;
9
+ var quart = pi$1 / 2;
10
+ var epsilon = 1e-6;
11
+ var nMax = Number.MAX_SAFE_INTEGER || 9007199254740991;
12
+ var nMin = Number.MIN_SAFE_INTEGER || -9007199254740991;
13
+ var ZERO = {
8
14
  x: 0,
9
15
  y: 0,
10
16
  z: 0
11
- }, g = {
17
+ };
18
+ var utils = {
12
19
  Tvalues: [
13
20
  -.06405689286260563,
14
21
  .06405689286260563,
@@ -61,250 +68,376 @@ var c = Math.PI, l = 2 * c, u = c / 2, f = 1e-6, p = 2 ** 53 - 1 || 900719925474
61
68
  .0123412297999872,
62
69
  .0123412297999872
63
70
  ],
64
- arcfn: function(e, n) {
65
- let r = n(e), i = r.x * r.x + r.y * r.y;
66
- return r.z !== void 0 && (i += r.z * r.z), o(i);
67
- },
68
- compute: function(e, n, r) {
69
- if (e === 0) return n[0].t = 0, n[0];
70
- let i = n.length - 1;
71
- if (e === 1) return n[i].t = 1, n[i];
72
- let a = 1 - e, o = n;
73
- if (i === 0) return n[0].t = e, n[0];
74
- if (i === 1) {
75
- let n = {
76
- x: a * o[0].x + e * o[1].x,
77
- y: a * o[0].y + e * o[1].y,
78
- t: e
71
+ arcfn: function(t, derivativeFn) {
72
+ const d = derivativeFn(t);
73
+ let l = d.x * d.x + d.y * d.y;
74
+ if (typeof d.z !== "undefined") l += d.z * d.z;
75
+ return sqrt$1(l);
76
+ },
77
+ compute: function(t, points, _3d) {
78
+ if (t === 0) {
79
+ points[0].t = 0;
80
+ return points[0];
81
+ }
82
+ const order = points.length - 1;
83
+ if (t === 1) {
84
+ points[order].t = 1;
85
+ return points[order];
86
+ }
87
+ const mt = 1 - t;
88
+ let p = points;
89
+ if (order === 0) {
90
+ points[0].t = t;
91
+ return points[0];
92
+ }
93
+ if (order === 1) {
94
+ const ret = {
95
+ x: mt * p[0].x + t * p[1].x,
96
+ y: mt * p[0].y + t * p[1].y,
97
+ t
79
98
  };
80
- return r && (n.z = a * o[0].z + e * o[1].z), n;
81
- }
82
- if (i < 4) {
83
- let n = a * a, s = e * e, c, l, u, f = 0;
84
- i === 2 ? (o = [
85
- o[0],
86
- o[1],
87
- o[2],
88
- h
89
- ], c = n, l = a * e * 2, u = s) : i === 3 && (c = n * a, l = n * e * 3, u = a * s * 3, f = e * s);
90
- let p = {
91
- x: c * o[0].x + l * o[1].x + u * o[2].x + f * o[3].x,
92
- y: c * o[0].y + l * o[1].y + u * o[2].y + f * o[3].y,
93
- t: e
99
+ if (_3d) ret.z = mt * p[0].z + t * p[1].z;
100
+ return ret;
101
+ }
102
+ if (order < 4) {
103
+ let mt2 = mt * mt;
104
+ let t2 = t * t;
105
+ let a;
106
+ let b;
107
+ let c;
108
+ let d = 0;
109
+ if (order === 2) {
110
+ p = [
111
+ p[0],
112
+ p[1],
113
+ p[2],
114
+ ZERO
115
+ ];
116
+ a = mt2;
117
+ b = mt * t * 2;
118
+ c = t2;
119
+ } else if (order === 3) {
120
+ a = mt2 * mt;
121
+ b = mt2 * t * 3;
122
+ c = mt * t2 * 3;
123
+ d = t * t2;
124
+ }
125
+ const ret = {
126
+ x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,
127
+ y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,
128
+ t
94
129
  };
95
- return r && (p.z = c * o[0].z + l * o[1].z + u * o[2].z + f * o[3].z), p;
96
- }
97
- let s = JSON.parse(JSON.stringify(n));
98
- for (; s.length > 1;) {
99
- for (let n = 0; n < s.length - 1; n++) s[n] = {
100
- x: s[n].x + (s[n + 1].x - s[n].x) * e,
101
- y: s[n].y + (s[n + 1].y - s[n].y) * e
102
- }, s[n].z !== void 0 && (s[n].z = s[n].z + (s[n + 1].z - s[n].z) * e);
103
- s.splice(s.length - 1, 1);
104
- }
105
- return s[0].t = e, s[0];
106
- },
107
- computeWithRatios: function(e, n, r, i) {
108
- let a = 1 - e, o = r, s = n, c = o[0], l = o[1], u = o[2], f = o[3], p;
109
- if (c *= a, l *= e, s.length === 2) return p = c + l, {
110
- x: (c * s[0].x + l * s[1].x) / p,
111
- y: (c * s[0].y + l * s[1].y) / p,
112
- z: i ? (c * s[0].z + l * s[1].z) / p : !1,
113
- t: e
114
- };
115
- if (c *= a, l *= 2 * a, u *= e * e, s.length === 3) return p = c + l + u, {
116
- x: (c * s[0].x + l * s[1].x + u * s[2].x) / p,
117
- y: (c * s[0].y + l * s[1].y + u * s[2].y) / p,
118
- z: i ? (c * s[0].z + l * s[1].z + u * s[2].z) / p : !1,
119
- t: e
120
- };
121
- if (c *= a, l *= 1.5 * a, u *= 3 * a, f *= e * e * e, s.length === 4) return p = c + l + u + f, {
122
- x: (c * s[0].x + l * s[1].x + u * s[2].x + f * s[3].x) / p,
123
- y: (c * s[0].y + l * s[1].y + u * s[2].y + f * s[3].y) / p,
124
- z: i ? (c * s[0].z + l * s[1].z + u * s[2].z + f * s[3].z) / p : !1,
125
- t: e
126
- };
130
+ if (_3d) ret.z = a * p[0].z + b * p[1].z + c * p[2].z + d * p[3].z;
131
+ return ret;
132
+ }
133
+ const dCpts = JSON.parse(JSON.stringify(points));
134
+ while (dCpts.length > 1) {
135
+ for (let i = 0; i < dCpts.length - 1; i++) {
136
+ dCpts[i] = {
137
+ x: dCpts[i].x + (dCpts[i + 1].x - dCpts[i].x) * t,
138
+ y: dCpts[i].y + (dCpts[i + 1].y - dCpts[i].y) * t
139
+ };
140
+ if (typeof dCpts[i].z !== "undefined") dCpts[i].z = dCpts[i].z + (dCpts[i + 1].z - dCpts[i].z) * t;
141
+ }
142
+ dCpts.splice(dCpts.length - 1, 1);
143
+ }
144
+ dCpts[0].t = t;
145
+ return dCpts[0];
146
+ },
147
+ computeWithRatios: function(t, points, ratios, _3d) {
148
+ const mt = 1 - t;
149
+ const r = ratios;
150
+ const p = points;
151
+ let f1 = r[0];
152
+ let f2 = r[1];
153
+ let f3 = r[2];
154
+ let f4 = r[3];
155
+ let d;
156
+ f1 *= mt;
157
+ f2 *= t;
158
+ if (p.length === 2) {
159
+ d = f1 + f2;
160
+ return {
161
+ x: (f1 * p[0].x + f2 * p[1].x) / d,
162
+ y: (f1 * p[0].y + f2 * p[1].y) / d,
163
+ z: !_3d ? false : (f1 * p[0].z + f2 * p[1].z) / d,
164
+ t
165
+ };
166
+ }
167
+ f1 *= mt;
168
+ f2 *= 2 * mt;
169
+ f3 *= t * t;
170
+ if (p.length === 3) {
171
+ d = f1 + f2 + f3;
172
+ return {
173
+ x: (f1 * p[0].x + f2 * p[1].x + f3 * p[2].x) / d,
174
+ y: (f1 * p[0].y + f2 * p[1].y + f3 * p[2].y) / d,
175
+ z: !_3d ? false : (f1 * p[0].z + f2 * p[1].z + f3 * p[2].z) / d,
176
+ t
177
+ };
178
+ }
179
+ f1 *= mt;
180
+ f2 *= 1.5 * mt;
181
+ f3 *= 3 * mt;
182
+ f4 *= t * t * t;
183
+ if (p.length === 4) {
184
+ d = f1 + f2 + f3 + f4;
185
+ return {
186
+ x: (f1 * p[0].x + f2 * p[1].x + f3 * p[2].x + f4 * p[3].x) / d,
187
+ y: (f1 * p[0].y + f2 * p[1].y + f3 * p[2].y + f4 * p[3].y) / d,
188
+ z: !_3d ? false : (f1 * p[0].z + f2 * p[1].z + f3 * p[2].z + f4 * p[3].z) / d,
189
+ t
190
+ };
191
+ }
127
192
  },
128
- derive: function(e, n) {
129
- let r = [];
130
- for (let i = e, a = i.length, o = a - 1; a > 1; a--, o--) {
131
- let e = [];
132
- for (let r = 0, a; r < o; r++) a = {
133
- x: o * (i[r + 1].x - i[r].x),
134
- y: o * (i[r + 1].y - i[r].y)
135
- }, n && (a.z = o * (i[r + 1].z - i[r].z)), e.push(a);
136
- r.push(e), i = e;
137
- }
138
- return r;
139
- },
140
- between: function(e, n, r) {
141
- return n <= e && e <= r || g.approximately(e, n) || g.approximately(e, r);
142
- },
143
- approximately: function(n, r, i) {
144
- return e(n - r) <= (i || f);
145
- },
146
- length: function(e) {
147
- let n = .5, r = g.Tvalues.length, i = 0;
148
- for (let a = 0, o; a < r; a++) o = n * g.Tvalues[a] + n, i += g.Cvalues[a] * g.arcfn(o, e);
149
- return n * i;
150
- },
151
- map: function(e, n, r, i, a) {
152
- let o = r - n;
153
- return i + (a - i) * ((e - n) / o);
154
- },
155
- lerp: function(e, n, r) {
156
- let i = {
157
- x: n.x + e * (r.x - n.x),
158
- y: n.y + e * (r.y - n.y)
193
+ derive: function(points, _3d) {
194
+ const dpoints = [];
195
+ for (let p = points, d = p.length, c = d - 1; d > 1; d--, c--) {
196
+ const list = [];
197
+ for (let j = 0, dpt; j < c; j++) {
198
+ dpt = {
199
+ x: c * (p[j + 1].x - p[j].x),
200
+ y: c * (p[j + 1].y - p[j].y)
201
+ };
202
+ if (_3d) dpt.z = c * (p[j + 1].z - p[j].z);
203
+ list.push(dpt);
204
+ }
205
+ dpoints.push(list);
206
+ p = list;
207
+ }
208
+ return dpoints;
209
+ },
210
+ between: function(v, m, M) {
211
+ return m <= v && v <= M || utils.approximately(v, m) || utils.approximately(v, M);
212
+ },
213
+ approximately: function(a, b, precision) {
214
+ return abs$1(a - b) <= (precision || epsilon);
215
+ },
216
+ length: function(derivativeFn) {
217
+ const z = .5;
218
+ const len = utils.Tvalues.length;
219
+ let sum = 0;
220
+ for (let i = 0, t; i < len; i++) {
221
+ t = z * utils.Tvalues[i] + z;
222
+ sum += utils.Cvalues[i] * utils.arcfn(t, derivativeFn);
223
+ }
224
+ return z * sum;
225
+ },
226
+ map: function(v, ds, de, ts, te) {
227
+ const d1 = de - ds;
228
+ return ts + (te - ts) * ((v - ds) / d1);
229
+ },
230
+ lerp: function(r, v1, v2) {
231
+ const ret = {
232
+ x: v1.x + r * (v2.x - v1.x),
233
+ y: v1.y + r * (v2.y - v1.y)
159
234
  };
160
- return n.z !== void 0 && r.z !== void 0 && (i.z = n.z + e * (r.z - n.z)), i;
235
+ if (v1.z !== void 0 && v2.z !== void 0) ret.z = v1.z + r * (v2.z - v1.z);
236
+ return ret;
161
237
  },
162
- pointToString: function(e) {
163
- let n = e.x + "/" + e.y;
164
- return e.z !== void 0 && (n += "/" + e.z), n;
238
+ pointToString: function(p) {
239
+ let s = p.x + "/" + p.y;
240
+ if (typeof p.z !== "undefined") s += "/" + p.z;
241
+ return s;
165
242
  },
166
- pointsToString: function(e) {
167
- return "[" + e.map(g.pointToString).join(", ") + "]";
243
+ pointsToString: function(points) {
244
+ return "[" + points.map(utils.pointToString).join(", ") + "]";
168
245
  },
169
- copy: function(e) {
170
- return JSON.parse(JSON.stringify(e));
246
+ copy: function(obj) {
247
+ return JSON.parse(JSON.stringify(obj));
171
248
  },
172
- angle: function(e, n, r) {
173
- let i = n.x - e.x, o = n.y - e.y, s = r.x - e.x, c = r.y - e.y;
174
- return a(i * c - o * s, i * s + o * c);
249
+ angle: function(o, v1, v2) {
250
+ const dx1 = v1.x - o.x;
251
+ const dy1 = v1.y - o.y;
252
+ const dx2 = v2.x - o.x;
253
+ const dy2 = v2.y - o.y;
254
+ return atan2(dx1 * dy2 - dy1 * dx2, dx1 * dx2 + dy1 * dy2);
175
255
  },
176
- round: function(e, n) {
177
- let r = "" + e, i = r.indexOf(".");
178
- return parseFloat(r.substring(0, i + 1 + n));
256
+ round: function(v, d) {
257
+ const s = "" + v;
258
+ const pos = s.indexOf(".");
259
+ return parseFloat(s.substring(0, pos + 1 + d));
179
260
  },
180
- dist: function(e, n) {
181
- let r = e.x - n.x, i = e.y - n.y;
182
- return o(r * r + i * i);
261
+ dist: function(p1, p2) {
262
+ const dx = p1.x - p2.x;
263
+ const dy = p1.y - p2.y;
264
+ return sqrt$1(dx * dx + dy * dy);
183
265
  },
184
- closest: function(e, n) {
185
- let r = s(2, 63), i, a;
186
- return e.forEach(function(e, o) {
187
- a = g.dist(n, e), a < r && (r = a, i = o);
188
- }), {
189
- mdist: r,
190
- mpos: i
266
+ closest: function(LUT, point) {
267
+ let mdist = pow(2, 63);
268
+ let mpos;
269
+ let d;
270
+ LUT.forEach(function(p, idx) {
271
+ d = utils.dist(point, p);
272
+ if (d < mdist) {
273
+ mdist = d;
274
+ mpos = idx;
275
+ }
276
+ });
277
+ return {
278
+ mdist,
279
+ mpos
191
280
  };
192
281
  },
193
- abcratio: function(n, r) {
194
- if (r !== 2 && r !== 3) return !1;
195
- if (n === void 0) n = .5;
196
- else if (n === 0 || n === 1) return n;
197
- let i = s(n, r) + s(1 - n, r);
198
- return e((i - 1) / i);
199
- },
200
- projectionratio: function(e, n) {
201
- if (n !== 2 && n !== 3) return !1;
202
- if (e === void 0) e = .5;
203
- else if (e === 0 || e === 1) return e;
204
- let r = s(1 - e, n);
205
- return r / (s(e, n) + r);
206
- },
207
- lli8: function(e, n, r, i, a, o, s, c) {
208
- let l = (e * i - n * r) * (a - s) - (e - r) * (a * c - o * s), u = (e * i - n * r) * (o - c) - (n - i) * (a * c - o * s), f = (e - r) * (o - c) - (n - i) * (a - s);
209
- return f != 0 && {
210
- x: l / f,
211
- y: u / f
282
+ abcratio: function(t, n) {
283
+ if (n !== 2 && n !== 3) return false;
284
+ if (typeof t === "undefined") t = .5;
285
+ else if (t === 0 || t === 1) return t;
286
+ const bottom = pow(t, n) + pow(1 - t, n);
287
+ return abs$1((bottom - 1) / bottom);
288
+ },
289
+ projectionratio: function(t, n) {
290
+ if (n !== 2 && n !== 3) return false;
291
+ if (typeof t === "undefined") t = .5;
292
+ else if (t === 0 || t === 1) return t;
293
+ const top = pow(1 - t, n);
294
+ return top / (pow(t, n) + top);
295
+ },
296
+ lli8: function(x1, y1, x2, y2, x3, y3, x4, y4) {
297
+ const nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4);
298
+ const ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4);
299
+ const d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
300
+ if (d == 0) return false;
301
+ return {
302
+ x: nx / d,
303
+ y: ny / d
212
304
  };
213
305
  },
214
- lli4: function(e, n, r, i) {
215
- let a = e.x, o = e.y, s = n.x, c = n.y, l = r.x, u = r.y, f = i.x, p = i.y;
216
- return g.lli8(a, o, s, c, l, u, f, p);
306
+ lli4: function(p1, p2, p3, p4) {
307
+ const x1 = p1.x;
308
+ const y1 = p1.y;
309
+ const x2 = p2.x;
310
+ const y2 = p2.y;
311
+ const x3 = p3.x;
312
+ const y3 = p3.y;
313
+ const x4 = p4.x;
314
+ const y4 = p4.y;
315
+ return utils.lli8(x1, y1, x2, y2, x3, y3, x4, y4);
217
316
  },
218
- lli: function(e, n) {
219
- return g.lli4(e, e.c, n, n.c);
317
+ lli: function(v1, v2) {
318
+ return utils.lli4(v1, v1.c, v2, v2.c);
220
319
  },
221
- makeline: function(e, n) {
222
- return new E(e.x, e.y, (e.x + n.x) / 2, (e.y + n.y) / 2, n.x, n.y);
320
+ makeline: function(p1, p2) {
321
+ return new Bezier(p1.x, p1.y, (p1.x + p2.x) / 2, (p1.y + p2.y) / 2, p2.x, p2.y);
223
322
  },
224
- findbbox: function(e) {
225
- let n = p, r = p, i = m, a = m;
226
- return e.forEach(function(e) {
227
- let o = e.bbox();
228
- n > o.x.min && (n = o.x.min), r > o.y.min && (r = o.y.min), i < o.x.max && (i = o.x.max), a < o.y.max && (a = o.y.max);
229
- }), {
323
+ findbbox: function(sections) {
324
+ let mx = nMax;
325
+ let my = nMax;
326
+ let MX = nMin;
327
+ let MY = nMin;
328
+ sections.forEach(function(s) {
329
+ const bbox = s.bbox();
330
+ if (mx > bbox.x.min) mx = bbox.x.min;
331
+ if (my > bbox.y.min) my = bbox.y.min;
332
+ if (MX < bbox.x.max) MX = bbox.x.max;
333
+ if (MY < bbox.y.max) MY = bbox.y.max;
334
+ });
335
+ return {
230
336
  x: {
231
- min: n,
232
- mid: (n + i) / 2,
233
- max: i,
234
- size: i - n
337
+ min: mx,
338
+ mid: (mx + MX) / 2,
339
+ max: MX,
340
+ size: MX - mx
235
341
  },
236
342
  y: {
237
- min: r,
238
- mid: (r + a) / 2,
239
- max: a,
240
- size: a - r
343
+ min: my,
344
+ mid: (my + MY) / 2,
345
+ max: MY,
346
+ size: MY - my
241
347
  }
242
348
  };
243
349
  },
244
- shapeintersections: function(e, n, r, i, a) {
245
- if (!g.bboxoverlap(n, i)) return [];
246
- let o = [], s = [
247
- e.startcap,
248
- e.forward,
249
- e.back,
250
- e.endcap
251
- ], c = [
252
- r.startcap,
253
- r.forward,
254
- r.back,
255
- r.endcap
350
+ shapeintersections: function(s1, bbox1, s2, bbox2, curveIntersectionThreshold) {
351
+ if (!utils.bboxoverlap(bbox1, bbox2)) return [];
352
+ const intersections = [];
353
+ const a1 = [
354
+ s1.startcap,
355
+ s1.forward,
356
+ s1.back,
357
+ s1.endcap
256
358
  ];
257
- return s.forEach(function(n) {
258
- n.virtual || c.forEach(function(i) {
259
- if (i.virtual) return;
260
- let s = n.intersects(i, a);
261
- s.length > 0 && (s.c1 = n, s.c2 = i, s.s1 = e, s.s2 = r, o.push(s));
359
+ const a2 = [
360
+ s2.startcap,
361
+ s2.forward,
362
+ s2.back,
363
+ s2.endcap
364
+ ];
365
+ a1.forEach(function(l1) {
366
+ if (l1.virtual) return;
367
+ a2.forEach(function(l2) {
368
+ if (l2.virtual) return;
369
+ const iss = l1.intersects(l2, curveIntersectionThreshold);
370
+ if (iss.length > 0) {
371
+ iss.c1 = l1;
372
+ iss.c2 = l2;
373
+ iss.s1 = s1;
374
+ iss.s2 = s2;
375
+ intersections.push(iss);
376
+ }
262
377
  });
263
- }), o;
264
- },
265
- makeshape: function(e, n, r) {
266
- let i = n.points.length, a = e.points.length, o = g.makeline(n.points[i - 1], e.points[0]), s = g.makeline(e.points[a - 1], n.points[0]), c = {
267
- startcap: o,
268
- forward: e,
269
- back: n,
270
- endcap: s,
271
- bbox: g.findbbox([
272
- o,
273
- e,
274
- n,
275
- s
378
+ });
379
+ return intersections;
380
+ },
381
+ makeshape: function(forward, back, curveIntersectionThreshold) {
382
+ const bpl = back.points.length;
383
+ const fpl = forward.points.length;
384
+ const start = utils.makeline(back.points[bpl - 1], forward.points[0]);
385
+ const end = utils.makeline(forward.points[fpl - 1], back.points[0]);
386
+ const shape = {
387
+ startcap: start,
388
+ forward,
389
+ back,
390
+ endcap: end,
391
+ bbox: utils.findbbox([
392
+ start,
393
+ forward,
394
+ back,
395
+ end
276
396
  ])
277
397
  };
278
- return c.intersections = function(e) {
279
- return g.shapeintersections(c, c.bbox, e, e.bbox, r);
280
- }, c;
398
+ shape.intersections = function(s2) {
399
+ return utils.shapeintersections(shape, shape.bbox, s2, s2.bbox, curveIntersectionThreshold);
400
+ };
401
+ return shape;
281
402
  },
282
- getminmax: function(e, n, r) {
283
- if (!r) return {
403
+ getminmax: function(curve, d, list) {
404
+ if (!list) return {
284
405
  min: 0,
285
406
  max: 0
286
407
  };
287
- let i = p, a = m, o, s;
288
- r.indexOf(0) === -1 && (r = [0].concat(r)), r.indexOf(1) === -1 && r.push(1);
289
- for (let c = 0, l = r.length; c < l; c++) o = r[c], s = e.get(o), s[n] < i && (i = s[n]), s[n] > a && (a = s[n]);
408
+ let min = nMax;
409
+ let max = nMin;
410
+ let t;
411
+ let c;
412
+ if (list.indexOf(0) === -1) list = [0].concat(list);
413
+ if (list.indexOf(1) === -1) list.push(1);
414
+ for (let i = 0, len = list.length; i < len; i++) {
415
+ t = list[i];
416
+ c = curve.get(t);
417
+ if (c[d] < min) min = c[d];
418
+ if (c[d] > max) max = c[d];
419
+ }
290
420
  return {
291
- min: i,
292
- mid: (i + a) / 2,
293
- max: a,
294
- size: a - i
421
+ min,
422
+ mid: (min + max) / 2,
423
+ max,
424
+ size: max - min
295
425
  };
296
426
  },
297
- align: function(e, i) {
298
- let o = i.p1.x, s = i.p1.y, c = -a(i.p2.y - s, i.p2.x - o), d = function(e) {
427
+ align: function(points, line) {
428
+ const tx = line.p1.x;
429
+ const ty = line.p1.y;
430
+ const a = -atan2(line.p2.y - ty, line.p2.x - tx);
431
+ const d = function(v) {
299
432
  return {
300
- x: (e.x - o) * n(c) - (e.y - s) * r(c),
301
- y: (e.x - o) * r(c) + (e.y - s) * n(c)
433
+ x: (v.x - tx) * cos$1(a) - (v.y - ty) * sin$1(a),
434
+ y: (v.x - tx) * sin$1(a) + (v.y - ty) * cos$1(a)
302
435
  };
303
436
  };
304
- return e.map(d);
437
+ return points.map(d);
305
438
  },
306
- roots: function(e, r) {
307
- r ||= {
439
+ roots: function(points, line) {
440
+ line = line || {
308
441
  p1: {
309
442
  x: 0,
310
443
  y: 0
@@ -314,694 +447,1147 @@ var c = Math.PI, l = 2 * c, u = c / 2, f = 1e-6, p = 2 ** 53 - 1 || 900719925474
314
447
  y: 0
315
448
  }
316
449
  };
317
- let a = e.length - 1, s = g.align(e, r), reduce = function(e) {
318
- return 0 <= e && e <= 1;
450
+ const order = points.length - 1;
451
+ const aligned = utils.align(points, line);
452
+ const reduce = function(t) {
453
+ return 0 <= t && t <= 1;
319
454
  };
320
- if (a === 2) {
321
- let e = s[0].y, n = s[1].y, r = s[2].y, i = e - 2 * n + r;
322
- if (i !== 0) {
323
- let a = -o(n * n - e * r), s = -e + n;
324
- return [-(a + s) / i, -(-a + s) / i].filter(reduce);
455
+ if (order === 2) {
456
+ const a = aligned[0].y;
457
+ const b = aligned[1].y;
458
+ const c = aligned[2].y;
459
+ const d = a - 2 * b + c;
460
+ if (d !== 0) {
461
+ const m1 = -sqrt$1(b * b - a * c);
462
+ const m2 = -a + b;
463
+ return [-(m1 + m2) / d, -(-m1 + m2) / d].filter(reduce);
464
+ } else if (b !== c && d === 0) return [(2 * b - c) / (2 * b - 2 * c)].filter(reduce);
465
+ return [];
466
+ }
467
+ const pa = aligned[0].y;
468
+ const pb = aligned[1].y;
469
+ const pc = aligned[2].y;
470
+ const pd = aligned[3].y;
471
+ let d = -pa + 3 * pb - 3 * pc + pd;
472
+ let a = 3 * pa - 6 * pb + 3 * pc;
473
+ let b = -3 * pa + 3 * pb;
474
+ let c = pa;
475
+ if (utils.approximately(d, 0)) {
476
+ if (utils.approximately(a, 0)) {
477
+ if (utils.approximately(b, 0)) return [];
478
+ return [-c / b].filter(reduce);
325
479
  }
326
- return n !== r && i === 0 ? [(2 * n - r) / (2 * n - 2 * r)].filter(reduce) : [];
327
- }
328
- let c = s[0].y, u = s[1].y, f = s[2].y, p = s[3].y, m = -c + 3 * u - 3 * f + p, h = 3 * c - 6 * u + 3 * f, _ = -3 * c + 3 * u, v = c;
329
- if (g.approximately(m, 0)) {
330
- if (g.approximately(h, 0)) return g.approximately(_, 0) ? [] : [-v / _].filter(reduce);
331
- let e = o(_ * _ - 4 * h * v), n = 2 * h;
332
- return [(e - _) / n, (-_ - e) / n].filter(reduce);
333
- }
334
- h /= m, _ /= m, v /= m;
335
- let y = (3 * _ - h * h) / 3, b = y / 3, x = (2 * h * h * h - 9 * h * _ + 27 * v) / 27, S = x / 2, C = S * S + b * b * b, w, T, E, D, O;
336
- if (C < 0) {
337
- let e = -y / 3, r = o(e * e * e), a = -x / (2 * r), s = i(a < -1 ? -1 : a > 1 ? 1 : a), c = 2 * crt(r);
338
- return E = c * n(s / 3) - h / 3, D = c * n((s + l) / 3) - h / 3, O = c * n((s + 2 * l) / 3) - h / 3, [
339
- E,
340
- D,
341
- O
342
- ].filter(reduce);
480
+ const q = sqrt$1(b * b - 4 * a * c);
481
+ const a2 = 2 * a;
482
+ return [(q - b) / a2, (-b - q) / a2].filter(reduce);
343
483
  }
344
- if (C === 0) return w = S < 0 ? crt(-S) : -crt(S), E = 2 * w - h / 3, D = -w - h / 3, [E, D].filter(reduce);
345
- {
346
- let e = o(C);
347
- return w = crt(-S + e), T = crt(S + e), [w - T - h / 3].filter(reduce);
484
+ a /= d;
485
+ b /= d;
486
+ c /= d;
487
+ const p = (3 * b - a * a) / 3;
488
+ const p3 = p / 3;
489
+ const q = (2 * a * a * a - 9 * a * b + 27 * c) / 27;
490
+ const q2 = q / 2;
491
+ const discriminant = q2 * q2 + p3 * p3 * p3;
492
+ let u1;
493
+ let v1;
494
+ let x1;
495
+ let x2;
496
+ let x3;
497
+ if (discriminant < 0) {
498
+ const mp3 = -p / 3;
499
+ const r = sqrt$1(mp3 * mp3 * mp3);
500
+ const t = -q / (2 * r);
501
+ const phi = acos$1(t < -1 ? -1 : t > 1 ? 1 : t);
502
+ const t1 = 2 * crt(r);
503
+ x1 = t1 * cos$1(phi / 3) - a / 3;
504
+ x2 = t1 * cos$1((phi + tau) / 3) - a / 3;
505
+ x3 = t1 * cos$1((phi + 2 * tau) / 3) - a / 3;
506
+ return [
507
+ x1,
508
+ x2,
509
+ x3
510
+ ].filter(reduce);
511
+ } else if (discriminant === 0) {
512
+ u1 = q2 < 0 ? crt(-q2) : -crt(q2);
513
+ x1 = 2 * u1 - a / 3;
514
+ x2 = -u1 - a / 3;
515
+ return [x1, x2].filter(reduce);
516
+ } else {
517
+ const sd = sqrt$1(discriminant);
518
+ u1 = crt(-q2 + sd);
519
+ v1 = crt(q2 + sd);
520
+ return [u1 - v1 - a / 3].filter(reduce);
348
521
  }
349
522
  },
350
- droots: function(e) {
351
- if (e.length === 3) {
352
- let n = e[0], r = e[1], i = e[2], a = n - 2 * r + i;
353
- if (a !== 0) {
354
- let e = -o(r * r - n * i), s = -n + r;
355
- return [-(e + s) / a, -(-e + s) / a];
356
- }
357
- return r !== i && a === 0 ? [(2 * r - i) / (2 * (r - i))] : [];
523
+ droots: function(p) {
524
+ if (p.length === 3) {
525
+ const a = p[0];
526
+ const b = p[1];
527
+ const c = p[2];
528
+ const d = a - 2 * b + c;
529
+ if (d !== 0) {
530
+ const m1 = -sqrt$1(b * b - a * c);
531
+ const m2 = -a + b;
532
+ return [-(m1 + m2) / d, -(-m1 + m2) / d];
533
+ } else if (b !== c && d === 0) return [(2 * b - c) / (2 * (b - c))];
534
+ return [];
358
535
  }
359
- if (e.length === 2) {
360
- let n = e[0], r = e[1];
361
- return n === r ? [] : [n / (n - r)];
536
+ if (p.length === 2) {
537
+ const a = p[0];
538
+ const b = p[1];
539
+ if (a !== b) return [a / (a - b)];
540
+ return [];
362
541
  }
363
542
  return [];
364
543
  },
365
- curvature: function(n, r, i, a, c) {
366
- let l, u, f, p, m = 0, h = 0, _ = g.compute(n, r), v = g.compute(n, i), y = _.x * _.x + _.y * _.y;
367
- if (a ? (l = o(s(_.y * v.z - v.y * _.z, 2) + s(_.z * v.x - v.z * _.x, 2) + s(_.x * v.y - v.x * _.y, 2)), u = s(y + _.z * _.z, 3 / 2)) : (l = _.x * v.y - _.y * v.x, u = s(y, 3 / 2)), l === 0 || u === 0) return {
544
+ curvature: function(t, d1, d2, _3d, kOnly) {
545
+ let num;
546
+ let dnm;
547
+ let adk;
548
+ let dk;
549
+ let k = 0;
550
+ let r = 0;
551
+ const d = utils.compute(t, d1);
552
+ const dd = utils.compute(t, d2);
553
+ const qdsum = d.x * d.x + d.y * d.y;
554
+ if (_3d) {
555
+ num = sqrt$1(pow(d.y * dd.z - dd.y * d.z, 2) + pow(d.z * dd.x - dd.z * d.x, 2) + pow(d.x * dd.y - dd.x * d.y, 2));
556
+ dnm = pow(qdsum + d.z * d.z, 3 / 2);
557
+ } else {
558
+ num = d.x * dd.y - d.y * dd.x;
559
+ dnm = pow(qdsum, 3 / 2);
560
+ }
561
+ if (num === 0 || dnm === 0) return {
368
562
  k: 0,
369
563
  r: 0
370
564
  };
371
- if (m = l / u, h = u / l, !c) {
372
- let o = g.curvature(n - .001, r, i, a, !0).k, s = g.curvature(n + .001, r, i, a, !0).k;
373
- p = (s - m + (m - o)) / 2, f = (e(s - m) + e(m - o)) / 2;
565
+ k = num / dnm;
566
+ r = dnm / num;
567
+ if (!kOnly) {
568
+ const pk = utils.curvature(t - .001, d1, d2, _3d, true).k;
569
+ const nk = utils.curvature(t + .001, d1, d2, _3d, true).k;
570
+ dk = (nk - k + (k - pk)) / 2;
571
+ adk = (abs$1(nk - k) + abs$1(k - pk)) / 2;
374
572
  }
375
573
  return {
376
- k: m,
377
- r: h,
378
- dk: p,
379
- adk: f
574
+ k,
575
+ r,
576
+ dk,
577
+ adk
380
578
  };
381
579
  },
382
- inflections: function(e) {
383
- if (e.length < 4) return [];
384
- let n = g.align(e, {
385
- p1: e[0],
386
- p2: e.slice(-1)[0]
387
- }), r = n[2].x * n[1].y, i = n[3].x * n[1].y, a = n[1].x * n[2].y, o = n[3].x * n[2].y, s = 18 * (-3 * r + 2 * i + 3 * a - o), c = 18 * (3 * r - i - 3 * a), l = 18 * (a - r);
388
- if (g.approximately(s, 0)) {
389
- if (!g.approximately(c, 0)) {
390
- let e = -l / c;
391
- if (0 <= e && e <= 1) return [e];
580
+ inflections: function(points) {
581
+ if (points.length < 4) return [];
582
+ const p = utils.align(points, {
583
+ p1: points[0],
584
+ p2: points.slice(-1)[0]
585
+ });
586
+ const a = p[2].x * p[1].y;
587
+ const b = p[3].x * p[1].y;
588
+ const c = p[1].x * p[2].y;
589
+ const d = p[3].x * p[2].y;
590
+ const v1 = 18 * (-3 * a + 2 * b + 3 * c - d);
591
+ const v2 = 18 * (3 * a - b - 3 * c);
592
+ const v3 = 18 * (c - a);
593
+ if (utils.approximately(v1, 0)) {
594
+ if (!utils.approximately(v2, 0)) {
595
+ let t = -v3 / v2;
596
+ if (0 <= t && t <= 1) return [t];
392
597
  }
393
598
  return [];
394
599
  }
395
- let u = 2 * s;
396
- if (g.approximately(u, 0)) return [];
397
- let f = c * c - 4 * s * l;
398
- if (f < 0) return [];
399
- let p = Math.sqrt(f);
400
- return [(p - c) / u, -(c + p) / u].filter(function(e) {
401
- return 0 <= e && e <= 1;
600
+ const d2 = 2 * v1;
601
+ if (utils.approximately(d2, 0)) return [];
602
+ const trm = v2 * v2 - 4 * v1 * v3;
603
+ if (trm < 0) return [];
604
+ const sq = Math.sqrt(trm);
605
+ return [(sq - v2) / d2, -(v2 + sq) / d2].filter(function(r) {
606
+ return 0 <= r && r <= 1;
402
607
  });
403
608
  },
404
- bboxoverlap: function(n, r) {
405
- let i = ["x", "y"], a = i.length;
406
- for (let o = 0, s, c, l, u; o < a; o++) if (s = i[o], c = n[s].mid, l = r[s].mid, u = (n[s].size + r[s].size) / 2, e(c - l) >= u) return !1;
407
- return !0;
609
+ bboxoverlap: function(b1, b2) {
610
+ const dims = ["x", "y"];
611
+ const len = dims.length;
612
+ for (let i = 0, dim, l, t, d; i < len; i++) {
613
+ dim = dims[i];
614
+ l = b1[dim].mid;
615
+ t = b2[dim].mid;
616
+ d = (b1[dim].size + b2[dim].size) / 2;
617
+ if (abs$1(l - t) >= d) return false;
618
+ }
619
+ return true;
408
620
  },
409
- expandbox: function(e, n) {
410
- n.x.min < e.x.min && (e.x.min = n.x.min), n.y.min < e.y.min && (e.y.min = n.y.min), n.z && n.z.min < e.z.min && (e.z.min = n.z.min), n.x.max > e.x.max && (e.x.max = n.x.max), n.y.max > e.y.max && (e.y.max = n.y.max), n.z && n.z.max > e.z.max && (e.z.max = n.z.max), e.x.mid = (e.x.min + e.x.max) / 2, e.y.mid = (e.y.min + e.y.max) / 2, e.z && (e.z.mid = (e.z.min + e.z.max) / 2), e.x.size = e.x.max - e.x.min, e.y.size = e.y.max - e.y.min, e.z && (e.z.size = e.z.max - e.z.min);
621
+ expandbox: function(bbox, _bbox) {
622
+ if (_bbox.x.min < bbox.x.min) bbox.x.min = _bbox.x.min;
623
+ if (_bbox.y.min < bbox.y.min) bbox.y.min = _bbox.y.min;
624
+ if (_bbox.z && _bbox.z.min < bbox.z.min) bbox.z.min = _bbox.z.min;
625
+ if (_bbox.x.max > bbox.x.max) bbox.x.max = _bbox.x.max;
626
+ if (_bbox.y.max > bbox.y.max) bbox.y.max = _bbox.y.max;
627
+ if (_bbox.z && _bbox.z.max > bbox.z.max) bbox.z.max = _bbox.z.max;
628
+ bbox.x.mid = (bbox.x.min + bbox.x.max) / 2;
629
+ bbox.y.mid = (bbox.y.min + bbox.y.max) / 2;
630
+ if (bbox.z) bbox.z.mid = (bbox.z.min + bbox.z.max) / 2;
631
+ bbox.x.size = bbox.x.max - bbox.x.min;
632
+ bbox.y.size = bbox.y.max - bbox.y.min;
633
+ if (bbox.z) bbox.z.size = bbox.z.max - bbox.z.min;
411
634
  },
412
- pairiteration: function(e, n, r) {
413
- let i = e.bbox(), a = n.bbox(), o = 1e5, s = r || .5;
414
- if (i.x.size + i.y.size < s && a.x.size + a.y.size < s) return [(o * (e._t1 + e._t2) / 2 | 0) / o + "/" + (o * (n._t1 + n._t2) / 2 | 0) / o];
415
- let c = e.split(.5), l = n.split(.5), u = [
635
+ pairiteration: function(c1, c2, curveIntersectionThreshold) {
636
+ const c1b = c1.bbox();
637
+ const c2b = c2.bbox();
638
+ const r = 1e5;
639
+ const threshold = curveIntersectionThreshold || .5;
640
+ if (c1b.x.size + c1b.y.size < threshold && c2b.x.size + c2b.y.size < threshold) return [(r * (c1._t1 + c1._t2) / 2 | 0) / r + "/" + (r * (c2._t1 + c2._t2) / 2 | 0) / r];
641
+ let cc1 = c1.split(.5);
642
+ let cc2 = c2.split(.5);
643
+ let pairs = [
416
644
  {
417
- left: c.left,
418
- right: l.left
645
+ left: cc1.left,
646
+ right: cc2.left
419
647
  },
420
648
  {
421
- left: c.left,
422
- right: l.right
649
+ left: cc1.left,
650
+ right: cc2.right
423
651
  },
424
652
  {
425
- left: c.right,
426
- right: l.right
653
+ left: cc1.right,
654
+ right: cc2.right
427
655
  },
428
656
  {
429
- left: c.right,
430
- right: l.left
657
+ left: cc1.right,
658
+ right: cc2.left
431
659
  }
432
660
  ];
433
- u = u.filter(function(e) {
434
- return g.bboxoverlap(e.left.bbox(), e.right.bbox());
661
+ pairs = pairs.filter(function(pair) {
662
+ return utils.bboxoverlap(pair.left.bbox(), pair.right.bbox());
435
663
  });
436
- let f = [];
437
- return u.length === 0 ? f : (u.forEach(function(e) {
438
- f = f.concat(g.pairiteration(e.left, e.right, s));
439
- }), f = f.filter(function(e, n) {
440
- return f.indexOf(e) === n;
441
- }), f);
664
+ let results = [];
665
+ if (pairs.length === 0) return results;
666
+ pairs.forEach(function(pair) {
667
+ results = results.concat(utils.pairiteration(pair.left, pair.right, threshold));
668
+ });
669
+ results = results.filter(function(v, i) {
670
+ return results.indexOf(v) === i;
671
+ });
672
+ return results;
442
673
  },
443
- getccenter: function(e, i, o) {
444
- let s = i.x - e.x, c = i.y - e.y, f = o.x - i.x, p = o.y - i.y, m = s * n(u) - c * r(u), h = s * r(u) + c * n(u), _ = f * n(u) - p * r(u), v = f * r(u) + p * n(u), y = (e.x + i.x) / 2, b = (e.y + i.y) / 2, x = (i.x + o.x) / 2, S = (i.y + o.y) / 2, C = y + m, w = b + h, T = x + _, E = S + v, D = g.lli8(y, b, C, w, x, S, T, E), O = g.dist(D, e), k = a(e.y - D.y, e.x - D.x), A = a(i.y - D.y, i.x - D.x), j = a(o.y - D.y, o.x - D.x), M;
445
- return k < j ? ((k > A || A > j) && (k += l), k > j && (M = j, j = k, k = M)) : j < A && A < k ? (M = j, j = k, k = M) : j += l, D.s = k, D.e = j, D.r = O, D;
674
+ getccenter: function(p1, p2, p3) {
675
+ const dx1 = p2.x - p1.x;
676
+ const dy1 = p2.y - p1.y;
677
+ const dx2 = p3.x - p2.x;
678
+ const dy2 = p3.y - p2.y;
679
+ const dx1p = dx1 * cos$1(quart) - dy1 * sin$1(quart);
680
+ const dy1p = dx1 * sin$1(quart) + dy1 * cos$1(quart);
681
+ const dx2p = dx2 * cos$1(quart) - dy2 * sin$1(quart);
682
+ const dy2p = dx2 * sin$1(quart) + dy2 * cos$1(quart);
683
+ const mx1 = (p1.x + p2.x) / 2;
684
+ const my1 = (p1.y + p2.y) / 2;
685
+ const mx2 = (p2.x + p3.x) / 2;
686
+ const my2 = (p2.y + p3.y) / 2;
687
+ const mx1n = mx1 + dx1p;
688
+ const my1n = my1 + dy1p;
689
+ const mx2n = mx2 + dx2p;
690
+ const my2n = my2 + dy2p;
691
+ const arc = utils.lli8(mx1, my1, mx1n, my1n, mx2, my2, mx2n, my2n);
692
+ const r = utils.dist(arc, p1);
693
+ let s = atan2(p1.y - arc.y, p1.x - arc.x);
694
+ let m = atan2(p2.y - arc.y, p2.x - arc.x);
695
+ let e = atan2(p3.y - arc.y, p3.x - arc.x);
696
+ let _;
697
+ if (s < e) {
698
+ if (s > m || m > e) s += tau;
699
+ if (s > e) {
700
+ _ = e;
701
+ e = s;
702
+ s = _;
703
+ }
704
+ } else if (e < m && m < s) {
705
+ _ = e;
706
+ e = s;
707
+ s = _;
708
+ } else e += tau;
709
+ arc.s = s;
710
+ arc.e = e;
711
+ arc.r = r;
712
+ return arc;
446
713
  },
447
- numberSort: function(e, n) {
448
- return e - n;
714
+ numberSort: function(a, b) {
715
+ return a - b;
449
716
  }
450
- }, _ = class PolyBezier {
451
- constructor(e) {
452
- this.curves = [], this._3d = !1, e && (this.curves = e, this._3d = this.curves[0]._3d);
717
+ };
718
+ //#endregion
719
+ //#region ../../node_modules/.pnpm/bezier-js@6.1.4/node_modules/bezier-js/src/poly-bezier.js
720
+ /**
721
+ * Poly Bezier
722
+ * @param {[type]} curves [description]
723
+ */
724
+ var PolyBezier = class PolyBezier {
725
+ constructor(curves) {
726
+ this.curves = [];
727
+ this._3d = false;
728
+ if (!!curves) {
729
+ this.curves = curves;
730
+ this._3d = this.curves[0]._3d;
731
+ }
453
732
  }
454
733
  valueOf() {
455
734
  return this.toString();
456
735
  }
457
736
  toString() {
458
- return "[" + this.curves.map(function(e) {
459
- return g.pointsToString(e.points);
737
+ return "[" + this.curves.map(function(curve) {
738
+ return utils.pointsToString(curve.points);
460
739
  }).join(", ") + "]";
461
740
  }
462
- addCurve(e) {
463
- this.curves.push(e), this._3d = this._3d || e._3d;
741
+ addCurve(curve) {
742
+ this.curves.push(curve);
743
+ this._3d = this._3d || curve._3d;
464
744
  }
465
745
  length() {
466
- return this.curves.map(function(e) {
467
- return e.length();
468
- }).reduce(function(e, n) {
469
- return e + n;
746
+ return this.curves.map(function(v) {
747
+ return v.length();
748
+ }).reduce(function(a, b) {
749
+ return a + b;
470
750
  });
471
751
  }
472
- curve(e) {
473
- return this.curves[e];
752
+ curve(idx) {
753
+ return this.curves[idx];
474
754
  }
475
755
  bbox() {
476
- let e = this.curves;
477
- for (var n = e[0].bbox(), r = 1; r < e.length; r++) g.expandbox(n, e[r].bbox());
478
- return n;
479
- }
480
- offset(e) {
481
- let n = [];
482
- return this.curves.forEach(function(r) {
483
- n.push(...r.offset(e));
484
- }), new PolyBezier(n);
485
- }
486
- }, { abs: v, min: y, max: b, cos: x, sin: S, acos: C, sqrt: w } = Math, T = Math.PI, E = class Bezier {
487
- constructor(e) {
488
- let n = e && e.forEach ? e : Array.from(arguments).slice(), r = !1;
489
- if (typeof n[0] == "object") {
490
- r = n.length;
491
- let e = [];
492
- n.forEach(function(n) {
756
+ const c = this.curves;
757
+ var bbox = c[0].bbox();
758
+ for (var i = 1; i < c.length; i++) utils.expandbox(bbox, c[i].bbox());
759
+ return bbox;
760
+ }
761
+ offset(d) {
762
+ const offset = [];
763
+ this.curves.forEach(function(v) {
764
+ offset.push(...v.offset(d));
765
+ });
766
+ return new PolyBezier(offset);
767
+ }
768
+ };
769
+ //#endregion
770
+ //#region ../../node_modules/.pnpm/bezier-js@6.1.4/node_modules/bezier-js/src/bezier.js
771
+ /**
772
+ A javascript Bezier curve library by Pomax.
773
+
774
+ Based on http://pomax.github.io/bezierinfo
775
+
776
+ This code is MIT licensed.
777
+ **/
778
+ var { abs, min, max, cos, sin, acos, sqrt } = Math;
779
+ var pi = Math.PI;
780
+ /**
781
+ * Bezier curve constructor.
782
+ *
783
+ * ...docs pending...
784
+ */
785
+ var Bezier = class Bezier {
786
+ constructor(coords) {
787
+ let args = coords && coords.forEach ? coords : Array.from(arguments).slice();
788
+ let coordlen = false;
789
+ if (typeof args[0] === "object") {
790
+ coordlen = args.length;
791
+ const newargs = [];
792
+ args.forEach(function(point) {
493
793
  [
494
794
  "x",
495
795
  "y",
496
796
  "z"
497
- ].forEach(function(r) {
498
- n[r] !== void 0 && e.push(n[r]);
797
+ ].forEach(function(d) {
798
+ if (typeof point[d] !== "undefined") newargs.push(point[d]);
499
799
  });
500
- }), n = e;
800
+ });
801
+ args = newargs;
501
802
  }
502
- let i = !1, a = n.length;
503
- if (r) {
504
- if (r > 4) {
505
- if (arguments.length !== 1) throw Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");
506
- i = !0;
803
+ let higher = false;
804
+ const len = args.length;
805
+ if (coordlen) {
806
+ if (coordlen > 4) {
807
+ if (arguments.length !== 1) throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");
808
+ higher = true;
507
809
  }
508
- } else if (a !== 6 && a !== 8 && a !== 9 && a !== 12 && arguments.length !== 1) throw Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");
509
- let o = this._3d = !i && (a === 9 || a === 12) || e && e[0] && e[0].z !== void 0, s = this.points = [];
510
- for (let e = 0, r = o ? 3 : 2; e < a; e += r) {
511
- var c = {
512
- x: n[e],
513
- y: n[e + 1]
810
+ } else if (len !== 6 && len !== 8 && len !== 9 && len !== 12) {
811
+ if (arguments.length !== 1) throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");
812
+ }
813
+ const _3d = this._3d = !higher && (len === 9 || len === 12) || coords && coords[0] && typeof coords[0].z !== "undefined";
814
+ const points = this.points = [];
815
+ for (let idx = 0, step = _3d ? 3 : 2; idx < len; idx += step) {
816
+ var point = {
817
+ x: args[idx],
818
+ y: args[idx + 1]
514
819
  };
515
- o && (c.z = n[e + 2]), s.push(c);
516
- }
517
- let l = this.order = s.length - 1, u = this.dims = ["x", "y"];
518
- o && u.push("z"), this.dimlen = u.length;
519
- let f = g.align(s, {
520
- p1: s[0],
521
- p2: s[l]
522
- }), p = g.dist(s[0], s[l]);
523
- this._linear = f.reduce((e, n) => e + v(n.y), 0) < p / 50, this._lut = [], this._t1 = 0, this._t2 = 1, this.update();
524
- }
525
- static quadraticFromPoints(e, n, r, i) {
526
- if (i === void 0 && (i = .5), i === 0) return new Bezier(n, n, r);
527
- if (i === 1) return new Bezier(e, n, n);
528
- let a = Bezier.getABC(2, e, n, r, i);
529
- return new Bezier(e, a.A, r);
530
- }
531
- static cubicFromPoints(e, n, r, i, a) {
532
- i === void 0 && (i = .5);
533
- let o = Bezier.getABC(3, e, n, r, i);
534
- a === void 0 && (a = g.dist(n, o.C));
535
- let s = a * (1 - i) / i, c = g.dist(e, r), l = (r.x - e.x) / c, u = (r.y - e.y) / c, f = a * l, p = a * u, m = s * l, h = s * u, _ = {
536
- x: n.x - f,
537
- y: n.y - p
538
- }, v = {
539
- x: n.x + m,
540
- y: n.y + h
541
- }, y = o.A, b = {
542
- x: y.x + (_.x - y.x) / (1 - i),
543
- y: y.y + (_.y - y.y) / (1 - i)
544
- }, x = {
545
- x: y.x + (v.x - y.x) / i,
546
- y: y.y + (v.y - y.y) / i
547
- }, S = {
548
- x: e.x + (b.x - e.x) / i,
549
- y: e.y + (b.y - e.y) / i
550
- }, C = {
551
- x: r.x + (x.x - r.x) / (1 - i),
552
- y: r.y + (x.y - r.y) / (1 - i)
820
+ if (_3d) point.z = args[idx + 2];
821
+ points.push(point);
822
+ }
823
+ const order = this.order = points.length - 1;
824
+ const dims = this.dims = ["x", "y"];
825
+ if (_3d) dims.push("z");
826
+ this.dimlen = dims.length;
827
+ const aligned = utils.align(points, {
828
+ p1: points[0],
829
+ p2: points[order]
830
+ });
831
+ const baselength = utils.dist(points[0], points[order]);
832
+ this._linear = aligned.reduce((t, p) => t + abs(p.y), 0) < baselength / 50;
833
+ this._lut = [];
834
+ this._t1 = 0;
835
+ this._t2 = 1;
836
+ this.update();
837
+ }
838
+ static quadraticFromPoints(p1, p2, p3, t) {
839
+ if (typeof t === "undefined") t = .5;
840
+ if (t === 0) return new Bezier(p2, p2, p3);
841
+ if (t === 1) return new Bezier(p1, p2, p2);
842
+ const abc = Bezier.getABC(2, p1, p2, p3, t);
843
+ return new Bezier(p1, abc.A, p3);
844
+ }
845
+ static cubicFromPoints(S, B, E, t, d1) {
846
+ if (typeof t === "undefined") t = .5;
847
+ const abc = Bezier.getABC(3, S, B, E, t);
848
+ if (typeof d1 === "undefined") d1 = utils.dist(B, abc.C);
849
+ const d2 = d1 * (1 - t) / t;
850
+ const selen = utils.dist(S, E);
851
+ const lx = (E.x - S.x) / selen;
852
+ const ly = (E.y - S.y) / selen;
853
+ const bx1 = d1 * lx;
854
+ const by1 = d1 * ly;
855
+ const bx2 = d2 * lx;
856
+ const by2 = d2 * ly;
857
+ const e1 = {
858
+ x: B.x - bx1,
859
+ y: B.y - by1
553
860
  };
554
- return new Bezier(e, S, C, r);
861
+ const e2 = {
862
+ x: B.x + bx2,
863
+ y: B.y + by2
864
+ };
865
+ const A = abc.A;
866
+ const v1 = {
867
+ x: A.x + (e1.x - A.x) / (1 - t),
868
+ y: A.y + (e1.y - A.y) / (1 - t)
869
+ };
870
+ const v2 = {
871
+ x: A.x + (e2.x - A.x) / t,
872
+ y: A.y + (e2.y - A.y) / t
873
+ };
874
+ const nc1 = {
875
+ x: S.x + (v1.x - S.x) / t,
876
+ y: S.y + (v1.y - S.y) / t
877
+ };
878
+ const nc2 = {
879
+ x: E.x + (v2.x - E.x) / (1 - t),
880
+ y: E.y + (v2.y - E.y) / (1 - t)
881
+ };
882
+ return new Bezier(S, nc1, nc2, E);
555
883
  }
556
884
  static getUtils() {
557
- return g;
885
+ return utils;
558
886
  }
559
887
  getUtils() {
560
888
  return Bezier.getUtils();
561
889
  }
562
890
  static get PolyBezier() {
563
- return _;
891
+ return PolyBezier;
564
892
  }
565
893
  valueOf() {
566
894
  return this.toString();
567
895
  }
568
896
  toString() {
569
- return g.pointsToString(this.points);
897
+ return utils.pointsToString(this.points);
570
898
  }
571
899
  toSVG() {
572
- if (this._3d) return !1;
573
- let e = this.points, n = [
900
+ if (this._3d) return false;
901
+ const p = this.points;
902
+ const s = [
574
903
  "M",
575
- e[0].x,
576
- e[0].y,
904
+ p[0].x,
905
+ p[0].y,
577
906
  this.order === 2 ? "Q" : "C"
578
907
  ];
579
- for (let r = 1, i = e.length; r < i; r++) n.push(e[r].x), n.push(e[r].y);
580
- return n.join(" ");
908
+ for (let i = 1, last = p.length; i < last; i++) {
909
+ s.push(p[i].x);
910
+ s.push(p[i].y);
911
+ }
912
+ return s.join(" ");
581
913
  }
582
- setRatios(e) {
583
- if (e.length !== this.points.length) throw Error("incorrect number of ratio values");
584
- this.ratios = e, this._lut = [];
914
+ setRatios(ratios) {
915
+ if (ratios.length !== this.points.length) throw new Error("incorrect number of ratio values");
916
+ this.ratios = ratios;
917
+ this._lut = [];
585
918
  }
586
919
  verify() {
587
- let e = this.coordDigest();
588
- e !== this._print && (this._print = e, this.update());
920
+ const print = this.coordDigest();
921
+ if (print !== this._print) {
922
+ this._print = print;
923
+ this.update();
924
+ }
589
925
  }
590
926
  coordDigest() {
591
- return this.points.map(function(e, n) {
592
- return "" + n + e.x + e.y + (e.z ? e.z : 0);
927
+ return this.points.map(function(c, pos) {
928
+ return "" + pos + c.x + c.y + (c.z ? c.z : 0);
593
929
  }).join("");
594
930
  }
595
931
  update() {
596
- this._lut = [], this.dpoints = g.derive(this.points, this._3d), this.computedirection();
932
+ this._lut = [];
933
+ this.dpoints = utils.derive(this.points, this._3d);
934
+ this.computedirection();
597
935
  }
598
936
  computedirection() {
599
- let e = this.points, n = g.angle(e[0], e[this.order], e[1]);
600
- this.clockwise = n > 0;
937
+ const points = this.points;
938
+ const angle = utils.angle(points[0], points[this.order], points[1]);
939
+ this.clockwise = angle > 0;
601
940
  }
602
941
  length() {
603
- return g.length(this.derivative.bind(this));
942
+ return utils.length(this.derivative.bind(this));
604
943
  }
605
- static getABC(e = 2, n, r, i, a = .5) {
606
- let o = g.projectionratio(a, e), s = 1 - o, c = {
607
- x: o * n.x + s * i.x,
608
- y: o * n.y + s * i.y
609
- }, l = g.abcratio(a, e);
944
+ static getABC(order = 2, S, B, E, t = .5) {
945
+ const u = utils.projectionratio(t, order);
946
+ const um = 1 - u;
947
+ const C = {
948
+ x: u * S.x + um * E.x,
949
+ y: u * S.y + um * E.y
950
+ };
951
+ const s = utils.abcratio(t, order);
610
952
  return {
611
953
  A: {
612
- x: r.x + (r.x - c.x) / l,
613
- y: r.y + (r.y - c.y) / l
954
+ x: B.x + (B.x - C.x) / s,
955
+ y: B.y + (B.y - C.y) / s
614
956
  },
615
- B: r,
616
- C: c,
617
- S: n,
618
- E: i
957
+ B,
958
+ C,
959
+ S,
960
+ E
619
961
  };
620
962
  }
621
- getABC(e, n) {
622
- n ||= this.get(e);
623
- let r = this.points[0], i = this.points[this.order];
624
- return Bezier.getABC(this.order, r, n, i, e);
963
+ getABC(t, B) {
964
+ B = B || this.get(t);
965
+ let S = this.points[0];
966
+ let E = this.points[this.order];
967
+ return Bezier.getABC(this.order, S, B, E, t);
625
968
  }
626
- getLUT(e) {
627
- if (this.verify(), e ||= 100, this._lut.length === e + 1) return this._lut;
628
- this._lut = [], e++, this._lut = [];
629
- for (let n = 0, r, i; n < e; n++) i = n / (e - 1), r = this.compute(i), r.t = i, this._lut.push(r);
969
+ getLUT(steps) {
970
+ this.verify();
971
+ steps = steps || 100;
972
+ if (this._lut.length === steps + 1) return this._lut;
973
+ this._lut = [];
974
+ steps++;
975
+ this._lut = [];
976
+ for (let i = 0, p, t; i < steps; i++) {
977
+ t = i / (steps - 1);
978
+ p = this.compute(t);
979
+ p.t = t;
980
+ this._lut.push(p);
981
+ }
630
982
  return this._lut;
631
983
  }
632
- on(e, n) {
633
- n ||= 5;
634
- let r = this.getLUT(), i = [];
635
- for (let a = 0, o, s = 0; a < r.length; a++) o = r[a], g.dist(o, e) < n && (i.push(o), s += a / r.length);
636
- return i.length ? t /= i.length : !1;
984
+ on(point, error) {
985
+ error = error || 5;
986
+ const lut = this.getLUT();
987
+ const hits = [];
988
+ for (let i = 0, c, t = 0; i < lut.length; i++) {
989
+ c = lut[i];
990
+ if (utils.dist(c, point) < error) {
991
+ hits.push(c);
992
+ t += i / lut.length;
993
+ }
994
+ }
995
+ if (!hits.length) return false;
996
+ return t /= hits.length;
637
997
  }
638
- project(e) {
639
- let n = this.getLUT(), r = n.length - 1, i = g.closest(n, e), a = i.mpos, o = (a - 1) / r, s = (a + 1) / r, c = .1 / r, l = i.mdist, u = o, f = u, p;
640
- l += 1;
641
- for (let n; u < s + c; u += c) p = this.compute(u), n = g.dist(e, p), n < l && (l = n, f = u);
642
- return f = f < 0 ? 0 : f > 1 ? 1 : f, p = this.compute(f), p.t = f, p.d = l, p;
998
+ project(point) {
999
+ const LUT = this.getLUT();
1000
+ const l = LUT.length - 1;
1001
+ const closest = utils.closest(LUT, point);
1002
+ const mpos = closest.mpos;
1003
+ const t1 = (mpos - 1) / l;
1004
+ const t2 = (mpos + 1) / l;
1005
+ const step = .1 / l;
1006
+ let mdist = closest.mdist;
1007
+ let t = t1;
1008
+ let ft = t;
1009
+ let p;
1010
+ mdist += 1;
1011
+ for (let d; t < t2 + step; t += step) {
1012
+ p = this.compute(t);
1013
+ d = utils.dist(point, p);
1014
+ if (d < mdist) {
1015
+ mdist = d;
1016
+ ft = t;
1017
+ }
1018
+ }
1019
+ ft = ft < 0 ? 0 : ft > 1 ? 1 : ft;
1020
+ p = this.compute(ft);
1021
+ p.t = ft;
1022
+ p.d = mdist;
1023
+ return p;
643
1024
  }
644
- get(e) {
645
- return this.compute(e);
1025
+ get(t) {
1026
+ return this.compute(t);
646
1027
  }
647
- point(e) {
648
- return this.points[e];
1028
+ point(idx) {
1029
+ return this.points[idx];
649
1030
  }
650
- compute(e) {
651
- return this.ratios ? g.computeWithRatios(e, this.points, this.ratios, this._3d) : g.compute(e, this.points, this._3d, this.ratios);
1031
+ compute(t) {
1032
+ if (this.ratios) return utils.computeWithRatios(t, this.points, this.ratios, this._3d);
1033
+ return utils.compute(t, this.points, this._3d, this.ratios);
652
1034
  }
653
1035
  raise() {
654
- let e = this.points, n = [e[0]], r = e.length;
655
- for (let i = 1, a, o; i < r; i++) a = e[i], o = e[i - 1], n[i] = {
656
- x: (r - i) / r * a.x + i / r * o.x,
657
- y: (r - i) / r * a.y + i / r * o.y
658
- };
659
- return n[r] = e[r - 1], new Bezier(n);
1036
+ const p = this.points;
1037
+ const np = [p[0]];
1038
+ const k = p.length;
1039
+ for (let i = 1, pi, pim; i < k; i++) {
1040
+ pi = p[i];
1041
+ pim = p[i - 1];
1042
+ np[i] = {
1043
+ x: (k - i) / k * pi.x + i / k * pim.x,
1044
+ y: (k - i) / k * pi.y + i / k * pim.y
1045
+ };
1046
+ }
1047
+ np[k] = p[k - 1];
1048
+ return new Bezier(np);
660
1049
  }
661
- derivative(e) {
662
- return g.compute(e, this.dpoints[0], this._3d);
1050
+ derivative(t) {
1051
+ return utils.compute(t, this.dpoints[0], this._3d);
663
1052
  }
664
- dderivative(e) {
665
- return g.compute(e, this.dpoints[1], this._3d);
1053
+ dderivative(t) {
1054
+ return utils.compute(t, this.dpoints[1], this._3d);
666
1055
  }
667
1056
  align() {
668
- let e = this.points;
669
- return new Bezier(g.align(e, {
670
- p1: e[0],
671
- p2: e[e.length - 1]
1057
+ let p = this.points;
1058
+ return new Bezier(utils.align(p, {
1059
+ p1: p[0],
1060
+ p2: p[p.length - 1]
672
1061
  }));
673
1062
  }
674
- curvature(e) {
675
- return g.curvature(e, this.dpoints[0], this.dpoints[1], this._3d);
1063
+ curvature(t) {
1064
+ return utils.curvature(t, this.dpoints[0], this.dpoints[1], this._3d);
676
1065
  }
677
1066
  inflections() {
678
- return g.inflections(this.points);
1067
+ return utils.inflections(this.points);
679
1068
  }
680
- normal(e) {
681
- return this._3d ? this.__normal3(e) : this.__normal2(e);
1069
+ normal(t) {
1070
+ return this._3d ? this.__normal3(t) : this.__normal2(t);
682
1071
  }
683
- __normal2(e) {
684
- let n = this.derivative(e), r = w(n.x * n.x + n.y * n.y);
1072
+ __normal2(t) {
1073
+ const d = this.derivative(t);
1074
+ const q = sqrt(d.x * d.x + d.y * d.y);
685
1075
  return {
686
- t: e,
687
- x: -n.y / r,
688
- y: n.x / r
1076
+ t,
1077
+ x: -d.y / q,
1078
+ y: d.x / q
689
1079
  };
690
1080
  }
691
- __normal3(e) {
692
- let n = this.derivative(e), r = this.derivative(e + .01), i = w(n.x * n.x + n.y * n.y + n.z * n.z), a = w(r.x * r.x + r.y * r.y + r.z * r.z);
693
- n.x /= i, n.y /= i, n.z /= i, r.x /= a, r.y /= a, r.z /= a;
694
- let o = {
695
- x: r.y * n.z - r.z * n.y,
696
- y: r.z * n.x - r.x * n.z,
697
- z: r.x * n.y - r.y * n.x
698
- }, s = w(o.x * o.x + o.y * o.y + o.z * o.z);
699
- o.x /= s, o.y /= s, o.z /= s;
700
- let c = [
701
- o.x * o.x,
702
- o.x * o.y - o.z,
703
- o.x * o.z + o.y,
704
- o.x * o.y + o.z,
705
- o.y * o.y,
706
- o.y * o.z - o.x,
707
- o.x * o.z - o.y,
708
- o.y * o.z + o.x,
709
- o.z * o.z
1081
+ __normal3(t) {
1082
+ const r1 = this.derivative(t);
1083
+ const r2 = this.derivative(t + .01);
1084
+ const q1 = sqrt(r1.x * r1.x + r1.y * r1.y + r1.z * r1.z);
1085
+ const q2 = sqrt(r2.x * r2.x + r2.y * r2.y + r2.z * r2.z);
1086
+ r1.x /= q1;
1087
+ r1.y /= q1;
1088
+ r1.z /= q1;
1089
+ r2.x /= q2;
1090
+ r2.y /= q2;
1091
+ r2.z /= q2;
1092
+ const c = {
1093
+ x: r2.y * r1.z - r2.z * r1.y,
1094
+ y: r2.z * r1.x - r2.x * r1.z,
1095
+ z: r2.x * r1.y - r2.y * r1.x
1096
+ };
1097
+ const m = sqrt(c.x * c.x + c.y * c.y + c.z * c.z);
1098
+ c.x /= m;
1099
+ c.y /= m;
1100
+ c.z /= m;
1101
+ const R = [
1102
+ c.x * c.x,
1103
+ c.x * c.y - c.z,
1104
+ c.x * c.z + c.y,
1105
+ c.x * c.y + c.z,
1106
+ c.y * c.y,
1107
+ c.y * c.z - c.x,
1108
+ c.x * c.z - c.y,
1109
+ c.y * c.z + c.x,
1110
+ c.z * c.z
710
1111
  ];
711
1112
  return {
712
- t: e,
713
- x: c[0] * n.x + c[1] * n.y + c[2] * n.z,
714
- y: c[3] * n.x + c[4] * n.y + c[5] * n.z,
715
- z: c[6] * n.x + c[7] * n.y + c[8] * n.z
1113
+ t,
1114
+ x: R[0] * r1.x + R[1] * r1.y + R[2] * r1.z,
1115
+ y: R[3] * r1.x + R[4] * r1.y + R[5] * r1.z,
1116
+ z: R[6] * r1.x + R[7] * r1.y + R[8] * r1.z
716
1117
  };
717
1118
  }
718
- hull(e) {
719
- let n = this.points, r = [], i = [], a = 0;
720
- for (i[a++] = n[0], i[a++] = n[1], i[a++] = n[2], this.order === 3 && (i[a++] = n[3]); n.length > 1;) {
721
- r = [];
722
- for (let o = 0, s, c = n.length - 1; o < c; o++) s = g.lerp(e, n[o], n[o + 1]), i[a++] = s, r.push(s);
723
- n = r;
1119
+ hull(t) {
1120
+ let p = this.points;
1121
+ let _p = [];
1122
+ let q = [];
1123
+ let idx = 0;
1124
+ q[idx++] = p[0];
1125
+ q[idx++] = p[1];
1126
+ q[idx++] = p[2];
1127
+ if (this.order === 3) q[idx++] = p[3];
1128
+ while (p.length > 1) {
1129
+ _p = [];
1130
+ for (let i = 0, pt, l = p.length - 1; i < l; i++) {
1131
+ pt = utils.lerp(t, p[i], p[i + 1]);
1132
+ q[idx++] = pt;
1133
+ _p.push(pt);
1134
+ }
1135
+ p = _p;
724
1136
  }
725
- return i;
1137
+ return q;
726
1138
  }
727
- split(e, n) {
728
- if (e === 0 && n) return this.split(n).left;
729
- if (n === 1) return this.split(e).right;
730
- let r = this.hull(e), i = {
1139
+ split(t1, t2) {
1140
+ if (t1 === 0 && !!t2) return this.split(t2).left;
1141
+ if (t2 === 1) return this.split(t1).right;
1142
+ const q = this.hull(t1);
1143
+ const result = {
731
1144
  left: this.order === 2 ? new Bezier([
732
- r[0],
733
- r[3],
734
- r[5]
1145
+ q[0],
1146
+ q[3],
1147
+ q[5]
735
1148
  ]) : new Bezier([
736
- r[0],
737
- r[4],
738
- r[7],
739
- r[9]
1149
+ q[0],
1150
+ q[4],
1151
+ q[7],
1152
+ q[9]
740
1153
  ]),
741
1154
  right: this.order === 2 ? new Bezier([
742
- r[5],
743
- r[4],
744
- r[2]
1155
+ q[5],
1156
+ q[4],
1157
+ q[2]
745
1158
  ]) : new Bezier([
746
- r[9],
747
- r[8],
748
- r[6],
749
- r[3]
1159
+ q[9],
1160
+ q[8],
1161
+ q[6],
1162
+ q[3]
750
1163
  ]),
751
- span: r
1164
+ span: q
752
1165
  };
753
- return i.left._t1 = g.map(0, 0, 1, this._t1, this._t2), i.left._t2 = g.map(e, 0, 1, this._t1, this._t2), i.right._t1 = g.map(e, 0, 1, this._t1, this._t2), i.right._t2 = g.map(1, 0, 1, this._t1, this._t2), n ? (n = g.map(n, e, 1, 0, 1), i.right.split(n).left) : i;
1166
+ result.left._t1 = utils.map(0, 0, 1, this._t1, this._t2);
1167
+ result.left._t2 = utils.map(t1, 0, 1, this._t1, this._t2);
1168
+ result.right._t1 = utils.map(t1, 0, 1, this._t1, this._t2);
1169
+ result.right._t2 = utils.map(1, 0, 1, this._t1, this._t2);
1170
+ if (!t2) return result;
1171
+ t2 = utils.map(t2, t1, 1, 0, 1);
1172
+ return result.right.split(t2).left;
754
1173
  }
755
1174
  extrema() {
756
- let e = {}, n = [];
757
- return this.dims.forEach(function(r) {
758
- let mfn = function(e) {
759
- return e[r];
760
- }, i = this.dpoints[0].map(mfn);
761
- e[r] = g.droots(i), this.order === 3 && (i = this.dpoints[1].map(mfn), e[r] = e[r].concat(g.droots(i))), e[r] = e[r].filter(function(e) {
762
- return e >= 0 && e <= 1;
763
- }), n = n.concat(e[r].sort(g.numberSort));
764
- }.bind(this)), e.values = n.sort(g.numberSort).filter(function(e, r) {
765
- return n.indexOf(e) === r;
766
- }), e;
1175
+ const result = {};
1176
+ let roots = [];
1177
+ this.dims.forEach(function(dim) {
1178
+ let mfn = function(v) {
1179
+ return v[dim];
1180
+ };
1181
+ let p = this.dpoints[0].map(mfn);
1182
+ result[dim] = utils.droots(p);
1183
+ if (this.order === 3) {
1184
+ p = this.dpoints[1].map(mfn);
1185
+ result[dim] = result[dim].concat(utils.droots(p));
1186
+ }
1187
+ result[dim] = result[dim].filter(function(t) {
1188
+ return t >= 0 && t <= 1;
1189
+ });
1190
+ roots = roots.concat(result[dim].sort(utils.numberSort));
1191
+ }.bind(this));
1192
+ result.values = roots.sort(utils.numberSort).filter(function(v, idx) {
1193
+ return roots.indexOf(v) === idx;
1194
+ });
1195
+ return result;
767
1196
  }
768
1197
  bbox() {
769
- let e = this.extrema(), n = {};
770
- return this.dims.forEach(function(r) {
771
- n[r] = g.getminmax(this, r, e[r]);
772
- }.bind(this)), n;
773
- }
774
- overlaps(e) {
775
- let n = this.bbox(), r = e.bbox();
776
- return g.bboxoverlap(n, r);
777
- }
778
- offset(e, n) {
779
- if (n !== void 0) {
780
- let r = this.get(e), i = this.normal(e), a = {
781
- c: r,
782
- n: i,
783
- x: r.x + i.x * n,
784
- y: r.y + i.y * n
1198
+ const extrema = this.extrema();
1199
+ const result = {};
1200
+ this.dims.forEach(function(d) {
1201
+ result[d] = utils.getminmax(this, d, extrema[d]);
1202
+ }.bind(this));
1203
+ return result;
1204
+ }
1205
+ overlaps(curve) {
1206
+ const lbbox = this.bbox();
1207
+ const tbbox = curve.bbox();
1208
+ return utils.bboxoverlap(lbbox, tbbox);
1209
+ }
1210
+ offset(t, d) {
1211
+ if (typeof d !== "undefined") {
1212
+ const c = this.get(t);
1213
+ const n = this.normal(t);
1214
+ const ret = {
1215
+ c,
1216
+ n,
1217
+ x: c.x + n.x * d,
1218
+ y: c.y + n.y * d
785
1219
  };
786
- return this._3d && (a.z = r.z + i.z * n), a;
1220
+ if (this._3d) ret.z = c.z + n.z * d;
1221
+ return ret;
787
1222
  }
788
1223
  if (this._linear) {
789
- let n = this.normal(0), r = this.points.map(function(r) {
790
- let i = {
791
- x: r.x + e * n.x,
792
- y: r.y + e * n.y
1224
+ const nv = this.normal(0);
1225
+ const coords = this.points.map(function(p) {
1226
+ const ret = {
1227
+ x: p.x + t * nv.x,
1228
+ y: p.y + t * nv.y
793
1229
  };
794
- return r.z && n.z && (i.z = r.z + e * n.z), i;
1230
+ if (p.z && nv.z) ret.z = p.z + t * nv.z;
1231
+ return ret;
795
1232
  });
796
- return [new Bezier(r)];
1233
+ return [new Bezier(coords)];
797
1234
  }
798
- return this.reduce().map(function(n) {
799
- return n._linear ? n.offset(e)[0] : n.scale(e);
1235
+ return this.reduce().map(function(s) {
1236
+ if (s._linear) return s.offset(t)[0];
1237
+ return s.scale(t);
800
1238
  });
801
1239
  }
802
1240
  simple() {
803
1241
  if (this.order === 3) {
804
- let e = g.angle(this.points[0], this.points[3], this.points[1]), n = g.angle(this.points[0], this.points[3], this.points[2]);
805
- if (e > 0 && n < 0 || e < 0 && n > 0) return !1;
1242
+ const a1 = utils.angle(this.points[0], this.points[3], this.points[1]);
1243
+ const a2 = utils.angle(this.points[0], this.points[3], this.points[2]);
1244
+ if (a1 > 0 && a2 < 0 || a1 < 0 && a2 > 0) return false;
806
1245
  }
807
- let e = this.normal(0), n = this.normal(1), r = e.x * n.x + e.y * n.y;
808
- return this._3d && (r += e.z * n.z), v(C(r)) < T / 3;
1246
+ const n1 = this.normal(0);
1247
+ const n2 = this.normal(1);
1248
+ let s = n1.x * n2.x + n1.y * n2.y;
1249
+ if (this._3d) s += n1.z * n2.z;
1250
+ return abs(acos(s)) < pi / 3;
809
1251
  }
810
1252
  reduce() {
811
- let e, n = 0, r = 0, i = .01, a, o = [], s = [], c = this.extrema().values;
812
- for (c.indexOf(0) === -1 && (c = [0].concat(c)), c.indexOf(1) === -1 && c.push(1), n = c[0], e = 1; e < c.length; e++) r = c[e], a = this.split(n, r), a._t1 = n, a._t2 = r, o.push(a), n = r;
813
- return o.forEach(function(e) {
814
- for (n = 0, r = 0; r <= 1;) for (r = n + i; r <= 1.01; r += i) if (a = e.split(n, r), !a.simple()) {
815
- if (r -= i, v(n - r) < i) return [];
816
- a = e.split(n, r), a._t1 = g.map(n, 0, 1, e._t1, e._t2), a._t2 = g.map(r, 0, 1, e._t1, e._t2), s.push(a), n = r;
817
- break;
1253
+ let i;
1254
+ let t1 = 0;
1255
+ let t2 = 0;
1256
+ let step = .01;
1257
+ let segment;
1258
+ let pass1 = [];
1259
+ let pass2 = [];
1260
+ let extrema = this.extrema().values;
1261
+ if (extrema.indexOf(0) === -1) extrema = [0].concat(extrema);
1262
+ if (extrema.indexOf(1) === -1) extrema.push(1);
1263
+ for (t1 = extrema[0], i = 1; i < extrema.length; i++) {
1264
+ t2 = extrema[i];
1265
+ segment = this.split(t1, t2);
1266
+ segment._t1 = t1;
1267
+ segment._t2 = t2;
1268
+ pass1.push(segment);
1269
+ t1 = t2;
1270
+ }
1271
+ pass1.forEach(function(p1) {
1272
+ t1 = 0;
1273
+ t2 = 0;
1274
+ while (t2 <= 1) for (t2 = t1 + step; t2 <= 1.01; t2 += step) {
1275
+ segment = p1.split(t1, t2);
1276
+ if (!segment.simple()) {
1277
+ t2 -= step;
1278
+ if (abs(t1 - t2) < step) return [];
1279
+ segment = p1.split(t1, t2);
1280
+ segment._t1 = utils.map(t1, 0, 1, p1._t1, p1._t2);
1281
+ segment._t2 = utils.map(t2, 0, 1, p1._t1, p1._t2);
1282
+ pass2.push(segment);
1283
+ t1 = t2;
1284
+ break;
1285
+ }
818
1286
  }
819
- n < 1 && (a = e.split(n, 1), a._t1 = g.map(n, 0, 1, e._t1, e._t2), a._t2 = e._t2, s.push(a));
820
- }), s;
821
- }
822
- translate(e, n, r) {
823
- r = typeof r == "number" ? r : n;
824
- let i = this.order, a = this.points.map((e, a) => (1 - a / i) * n + a / i * r);
825
- return new Bezier(this.points.map((n, r) => ({
826
- x: n.x + e.x * a[r],
827
- y: n.y + e.y * a[r]
1287
+ if (t1 < 1) {
1288
+ segment = p1.split(t1, 1);
1289
+ segment._t1 = utils.map(t1, 0, 1, p1._t1, p1._t2);
1290
+ segment._t2 = p1._t2;
1291
+ pass2.push(segment);
1292
+ }
1293
+ });
1294
+ return pass2;
1295
+ }
1296
+ translate(v, d1, d2) {
1297
+ d2 = typeof d2 === "number" ? d2 : d1;
1298
+ const o = this.order;
1299
+ let d = this.points.map((_, i) => (1 - i / o) * d1 + i / o * d2);
1300
+ return new Bezier(this.points.map((p, i) => ({
1301
+ x: p.x + v.x * d[i],
1302
+ y: p.y + v.y * d[i]
828
1303
  })));
829
1304
  }
830
- scale(e) {
831
- let n = this.order, r = !1;
832
- if (typeof e == "function" && (r = e), r && n === 2) return this.raise().scale(r);
833
- let i = this.clockwise, a = this.points;
834
- if (this._linear) return this.translate(this.normal(0), r ? r(0) : e, r ? r(1) : e);
835
- let o = r ? r(0) : e, s = r ? r(1) : e, c = [this.offset(0, 10), this.offset(1, 10)], l = [], u = g.lli4(c[0], c[0].c, c[1], c[1].c);
836
- if (!u) throw Error("cannot scale this curve. Try reducing it first.");
837
- return [0, 1].forEach(function(e) {
838
- let r = l[e * n] = g.copy(a[e * n]);
839
- r.x += (e ? s : o) * c[e].n.x, r.y += (e ? s : o) * c[e].n.y;
840
- }), r ? ([0, 1].forEach(function(o) {
841
- if (!(n === 2 && o)) {
842
- var s = a[o + 1], c = {
843
- x: s.x - u.x,
844
- y: s.y - u.y
845
- }, f = r ? r((o + 1) / n) : e;
846
- r && !i && (f = -f);
847
- var p = w(c.x * c.x + c.y * c.y);
848
- c.x /= p, c.y /= p, l[o + 1] = {
849
- x: s.x + f * c.x,
850
- y: s.y + f * c.y
1305
+ scale(d) {
1306
+ const order = this.order;
1307
+ let distanceFn = false;
1308
+ if (typeof d === "function") distanceFn = d;
1309
+ if (distanceFn && order === 2) return this.raise().scale(distanceFn);
1310
+ const clockwise = this.clockwise;
1311
+ const points = this.points;
1312
+ if (this._linear) return this.translate(this.normal(0), distanceFn ? distanceFn(0) : d, distanceFn ? distanceFn(1) : d);
1313
+ const r1 = distanceFn ? distanceFn(0) : d;
1314
+ const r2 = distanceFn ? distanceFn(1) : d;
1315
+ const v = [this.offset(0, 10), this.offset(1, 10)];
1316
+ const np = [];
1317
+ const o = utils.lli4(v[0], v[0].c, v[1], v[1].c);
1318
+ if (!o) throw new Error("cannot scale this curve. Try reducing it first.");
1319
+ [0, 1].forEach(function(t) {
1320
+ const p = np[t * order] = utils.copy(points[t * order]);
1321
+ p.x += (t ? r2 : r1) * v[t].n.x;
1322
+ p.y += (t ? r2 : r1) * v[t].n.y;
1323
+ });
1324
+ if (!distanceFn) {
1325
+ [0, 1].forEach((t) => {
1326
+ if (order === 2 && !!t) return;
1327
+ const p = np[t * order];
1328
+ const d = this.derivative(t);
1329
+ const p2 = {
1330
+ x: p.x + d.x,
1331
+ y: p.y + d.y
851
1332
  };
1333
+ np[t + 1] = utils.lli4(p, p2, o, points[t + 1]);
1334
+ });
1335
+ return new Bezier(np);
1336
+ }
1337
+ [0, 1].forEach(function(t) {
1338
+ if (order === 2 && !!t) return;
1339
+ var p = points[t + 1];
1340
+ var ov = {
1341
+ x: p.x - o.x,
1342
+ y: p.y - o.y
1343
+ };
1344
+ var rc = distanceFn ? distanceFn((t + 1) / order) : d;
1345
+ if (distanceFn && !clockwise) rc = -rc;
1346
+ var m = sqrt(ov.x * ov.x + ov.y * ov.y);
1347
+ ov.x /= m;
1348
+ ov.y /= m;
1349
+ np[t + 1] = {
1350
+ x: p.x + rc * ov.x,
1351
+ y: p.y + rc * ov.y
1352
+ };
1353
+ });
1354
+ return new Bezier(np);
1355
+ }
1356
+ outline(d1, d2, d3, d4) {
1357
+ d2 = d2 === void 0 ? d1 : d2;
1358
+ if (this._linear) {
1359
+ const n = this.normal(0);
1360
+ const start = this.points[0];
1361
+ const end = this.points[this.points.length - 1];
1362
+ let s;
1363
+ let mid;
1364
+ let e;
1365
+ if (d3 === void 0) {
1366
+ d3 = d1;
1367
+ d4 = d2;
852
1368
  }
853
- }), new Bezier(l)) : ([0, 1].forEach((e) => {
854
- if (n === 2 && e) return;
855
- let r = l[e * n], i = this.derivative(e), o = {
856
- x: r.x + i.x,
857
- y: r.y + i.y
1369
+ s = {
1370
+ x: start.x + n.x * d1,
1371
+ y: start.y + n.y * d1
858
1372
  };
859
- l[e + 1] = g.lli4(r, o, u, a[e + 1]);
860
- }), new Bezier(l));
861
- }
862
- outline(e, n, r, i) {
863
- if (n = n === void 0 ? e : n, this._linear) {
864
- let a = this.normal(0), o = this.points[0], s = this.points[this.points.length - 1], c, l, u;
865
- r === void 0 && (r = e, i = n), c = {
866
- x: o.x + a.x * e,
867
- y: o.y + a.y * e
868
- }, u = {
869
- x: s.x + a.x * r,
870
- y: s.y + a.y * r
871
- }, l = {
872
- x: (c.x + u.x) / 2,
873
- y: (c.y + u.y) / 2
1373
+ e = {
1374
+ x: end.x + n.x * d3,
1375
+ y: end.y + n.y * d3
874
1376
  };
875
- let f = [
876
- c,
877
- l,
878
- u
1377
+ mid = {
1378
+ x: (s.x + e.x) / 2,
1379
+ y: (s.y + e.y) / 2
1380
+ };
1381
+ const fline = [
1382
+ s,
1383
+ mid,
1384
+ e
879
1385
  ];
880
- c = {
881
- x: o.x - a.x * n,
882
- y: o.y - a.y * n
883
- }, u = {
884
- x: s.x - a.x * i,
885
- y: s.y - a.y * i
886
- }, l = {
887
- x: (c.x + u.x) / 2,
888
- y: (c.y + u.y) / 2
1386
+ s = {
1387
+ x: start.x - n.x * d2,
1388
+ y: start.y - n.y * d2
1389
+ };
1390
+ e = {
1391
+ x: end.x - n.x * d4,
1392
+ y: end.y - n.y * d4
889
1393
  };
890
- let p = [
891
- u,
892
- l,
893
- c
894
- ], m = g.makeline(p[2], f[0]), h = g.makeline(f[2], p[0]);
895
- return new _([
896
- m,
897
- new Bezier(f),
898
- h,
899
- new Bezier(p)
1394
+ mid = {
1395
+ x: (s.x + e.x) / 2,
1396
+ y: (s.y + e.y) / 2
1397
+ };
1398
+ const bline = [
1399
+ e,
1400
+ mid,
1401
+ s
1402
+ ];
1403
+ const ls = utils.makeline(bline[2], fline[0]);
1404
+ const le = utils.makeline(fline[2], bline[0]);
1405
+ return new PolyBezier([
1406
+ ls,
1407
+ new Bezier(fline),
1408
+ le,
1409
+ new Bezier(bline)
900
1410
  ]);
901
1411
  }
902
- let a = this.reduce(), o = a.length, s = [], c = [], l, u = 0, f = this.length(), p = r !== void 0 && i !== void 0;
903
- function linearDistanceFunction(e, n, r, i, a) {
904
- return function(o) {
905
- let s = i / r, c = (i + a) / r, l = n - e;
906
- return g.map(o, 0, 1, e + s * l, e + c * l);
1412
+ const reduced = this.reduce();
1413
+ const len = reduced.length;
1414
+ const fcurves = [];
1415
+ let bcurves = [];
1416
+ let p;
1417
+ let alen = 0;
1418
+ let tlen = this.length();
1419
+ const graduated = typeof d3 !== "undefined" && typeof d4 !== "undefined";
1420
+ function linearDistanceFunction(s, e, tlen, alen, slen) {
1421
+ return function(v) {
1422
+ const f1 = alen / tlen;
1423
+ const f2 = (alen + slen) / tlen;
1424
+ const d = e - s;
1425
+ return utils.map(v, 0, 1, s + f1 * d, s + f2 * d);
907
1426
  };
908
1427
  }
909
- a.forEach(function(a) {
910
- let o = a.length();
911
- p ? (s.push(a.scale(linearDistanceFunction(e, r, f, u, o))), c.push(a.scale(linearDistanceFunction(-n, -i, f, u, o)))) : (s.push(a.scale(e)), c.push(a.scale(-n))), u += o;
912
- }), c = c.map(function(e) {
913
- return l = e.points, e.points = l[3] ? [
914
- l[3],
915
- l[2],
916
- l[1],
917
- l[0]
918
- ] : [
919
- l[2],
920
- l[1],
921
- l[0]
922
- ], e;
1428
+ reduced.forEach(function(segment) {
1429
+ const slen = segment.length();
1430
+ if (graduated) {
1431
+ fcurves.push(segment.scale(linearDistanceFunction(d1, d3, tlen, alen, slen)));
1432
+ bcurves.push(segment.scale(linearDistanceFunction(-d2, -d4, tlen, alen, slen)));
1433
+ } else {
1434
+ fcurves.push(segment.scale(d1));
1435
+ bcurves.push(segment.scale(-d2));
1436
+ }
1437
+ alen += slen;
1438
+ });
1439
+ bcurves = bcurves.map(function(s) {
1440
+ p = s.points;
1441
+ if (p[3]) s.points = [
1442
+ p[3],
1443
+ p[2],
1444
+ p[1],
1445
+ p[0]
1446
+ ];
1447
+ else s.points = [
1448
+ p[2],
1449
+ p[1],
1450
+ p[0]
1451
+ ];
1452
+ return s;
923
1453
  }).reverse();
924
- let m = s[0].points[0], h = s[o - 1].points[s[o - 1].points.length - 1], v = c[o - 1].points[c[o - 1].points.length - 1], y = c[0].points[0], b = g.makeline(v, m), x = g.makeline(h, y);
925
- return new _([b].concat(s, [x], c));
926
- }
927
- outlineshapes(e, n, r) {
928
- n ||= e;
929
- let i = this.outline(e, n).curves, a = [];
930
- for (let e = 1, n = i.length; e < n / 2; e++) {
931
- let o = g.makeshape(i[e], i[n - e], r);
932
- o.startcap.virtual = e > 1, o.endcap.virtual = e < n / 2 - 1, a.push(o);
933
- }
934
- return a;
935
- }
936
- intersects(e, n) {
937
- return e ? e.p1 && e.p2 ? this.lineIntersects(e) : (e instanceof Bezier && (e = e.reduce()), this.curveintersects(this.reduce(), e, n)) : this.selfintersects(n);
938
- }
939
- lineIntersects(e) {
940
- let n = y(e.p1.x, e.p2.x), r = y(e.p1.y, e.p2.y), i = b(e.p1.x, e.p2.x), a = b(e.p1.y, e.p2.y);
941
- return g.roots(this.points, e).filter((e) => {
942
- var o = this.get(e);
943
- return g.between(o.x, n, i) && g.between(o.y, r, a);
1454
+ const fs = fcurves[0].points[0];
1455
+ const fe = fcurves[len - 1].points[fcurves[len - 1].points.length - 1];
1456
+ const bs = bcurves[len - 1].points[bcurves[len - 1].points.length - 1];
1457
+ const be = bcurves[0].points[0];
1458
+ const ls = utils.makeline(bs, fs);
1459
+ const le = utils.makeline(fe, be);
1460
+ return new PolyBezier([ls].concat(fcurves).concat([le]).concat(bcurves));
1461
+ }
1462
+ outlineshapes(d1, d2, curveIntersectionThreshold) {
1463
+ d2 = d2 || d1;
1464
+ const outline = this.outline(d1, d2).curves;
1465
+ const shapes = [];
1466
+ for (let i = 1, len = outline.length; i < len / 2; i++) {
1467
+ const shape = utils.makeshape(outline[i], outline[len - i], curveIntersectionThreshold);
1468
+ shape.startcap.virtual = i > 1;
1469
+ shape.endcap.virtual = i < len / 2 - 1;
1470
+ shapes.push(shape);
1471
+ }
1472
+ return shapes;
1473
+ }
1474
+ intersects(curve, curveIntersectionThreshold) {
1475
+ if (!curve) return this.selfintersects(curveIntersectionThreshold);
1476
+ if (curve.p1 && curve.p2) return this.lineIntersects(curve);
1477
+ if (curve instanceof Bezier) curve = curve.reduce();
1478
+ return this.curveintersects(this.reduce(), curve, curveIntersectionThreshold);
1479
+ }
1480
+ lineIntersects(line) {
1481
+ const mx = min(line.p1.x, line.p2.x);
1482
+ const my = min(line.p1.y, line.p2.y);
1483
+ const MX = max(line.p1.x, line.p2.x);
1484
+ const MY = max(line.p1.y, line.p2.y);
1485
+ return utils.roots(this.points, line).filter((t) => {
1486
+ var p = this.get(t);
1487
+ return utils.between(p.x, mx, MX) && utils.between(p.y, my, MY);
944
1488
  });
945
1489
  }
946
- selfintersects(e) {
947
- let n = this.reduce(), r = n.length - 2, i = [];
948
- for (let a = 0, o, s, c; a < r; a++) s = n.slice(a, a + 1), c = n.slice(a + 2), o = this.curveintersects(s, c, e), i.push(...o);
949
- return i;
950
- }
951
- curveintersects(e, n, r) {
952
- let i = [];
953
- e.forEach(function(e) {
954
- n.forEach(function(n) {
955
- e.overlaps(n) && i.push({
956
- left: e,
957
- right: n
1490
+ selfintersects(curveIntersectionThreshold) {
1491
+ const reduced = this.reduce();
1492
+ const len = reduced.length - 2;
1493
+ const results = [];
1494
+ for (let i = 0, result, left, right; i < len; i++) {
1495
+ left = reduced.slice(i, i + 1);
1496
+ right = reduced.slice(i + 2);
1497
+ result = this.curveintersects(left, right, curveIntersectionThreshold);
1498
+ results.push(...result);
1499
+ }
1500
+ return results;
1501
+ }
1502
+ curveintersects(c1, c2, curveIntersectionThreshold) {
1503
+ const pairs = [];
1504
+ c1.forEach(function(l) {
1505
+ c2.forEach(function(r) {
1506
+ if (l.overlaps(r)) pairs.push({
1507
+ left: l,
1508
+ right: r
958
1509
  });
959
1510
  });
960
1511
  });
961
- let a = [];
962
- return i.forEach(function(e) {
963
- let n = g.pairiteration(e.left, e.right, r);
964
- n.length > 0 && (a = a.concat(n));
965
- }), a;
1512
+ let intersections = [];
1513
+ pairs.forEach(function(pair) {
1514
+ const result = utils.pairiteration(pair.left, pair.right, curveIntersectionThreshold);
1515
+ if (result.length > 0) intersections = intersections.concat(result);
1516
+ });
1517
+ return intersections;
966
1518
  }
967
- arcs(e) {
968
- return e ||= .5, this._iterate(e, []);
1519
+ arcs(errorThreshold) {
1520
+ errorThreshold = errorThreshold || .5;
1521
+ return this._iterate(errorThreshold, []);
969
1522
  }
970
- _error(e, n, r, i) {
971
- let a = (i - r) / 4, o = this.get(r + a), s = this.get(i - a), c = g.dist(e, n), l = g.dist(e, o), u = g.dist(e, s);
972
- return v(l - c) + v(u - c);
1523
+ _error(pc, np1, s, e) {
1524
+ const q = (e - s) / 4;
1525
+ const c1 = this.get(s + q);
1526
+ const c2 = this.get(e - q);
1527
+ const ref = utils.dist(pc, np1);
1528
+ const d1 = utils.dist(pc, c1);
1529
+ const d2 = utils.dist(pc, c2);
1530
+ return abs(d1 - ref) + abs(d2 - ref);
973
1531
  }
974
- _iterate(e, n) {
975
- let r = 0, i = 1, a;
1532
+ _iterate(errorThreshold, circles) {
1533
+ let t_s = 0;
1534
+ let t_e = 1;
1535
+ let safety;
976
1536
  do {
977
- a = 0, i = 1;
978
- let o = this.get(r), s, c, l, u, f = !1, p = !1, m, h = i, _ = 1, v = 0;
979
- do
980
- if (p = f, u = l, h = (r + i) / 2, v++, s = this.get(h), c = this.get(i), l = g.getccenter(o, s, c), l.interval = {
981
- start: r,
982
- end: i
983
- }, f = this._error(l, o, r, i) <= e, m = p && !f, m || (_ = i), f) {
984
- if (i >= 1) {
985
- if (l.interval.end = _ = 1, u = l, i > 1) {
986
- let e = {
987
- x: l.x + l.r * x(l.e),
988
- y: l.y + l.r * S(l.e)
1537
+ safety = 0;
1538
+ t_e = 1;
1539
+ let np1 = this.get(t_s);
1540
+ let np2;
1541
+ let np3;
1542
+ let arc;
1543
+ let prev_arc;
1544
+ let curr_good = false;
1545
+ let prev_good = false;
1546
+ let done;
1547
+ let t_m = t_e;
1548
+ let prev_e = 1;
1549
+ let step = 0;
1550
+ do {
1551
+ prev_good = curr_good;
1552
+ prev_arc = arc;
1553
+ t_m = (t_s + t_e) / 2;
1554
+ step++;
1555
+ np2 = this.get(t_m);
1556
+ np3 = this.get(t_e);
1557
+ arc = utils.getccenter(np1, np2, np3);
1558
+ arc.interval = {
1559
+ start: t_s,
1560
+ end: t_e
1561
+ };
1562
+ curr_good = this._error(arc, np1, t_s, t_e) <= errorThreshold;
1563
+ done = prev_good && !curr_good;
1564
+ if (!done) prev_e = t_e;
1565
+ if (curr_good) {
1566
+ if (t_e >= 1) {
1567
+ arc.interval.end = prev_e = 1;
1568
+ prev_arc = arc;
1569
+ if (t_e > 1) {
1570
+ let d = {
1571
+ x: arc.x + arc.r * cos(arc.e),
1572
+ y: arc.y + arc.r * sin(arc.e)
989
1573
  };
990
- l.e += g.angle({
991
- x: l.x,
992
- y: l.y
993
- }, e, this.get(1));
1574
+ arc.e += utils.angle({
1575
+ x: arc.x,
1576
+ y: arc.y
1577
+ }, d, this.get(1));
994
1578
  }
995
1579
  break;
996
1580
  }
997
- i += (i - r) / 2;
998
- } else i = h;
999
- while (!m && a++ < 100);
1000
- if (a >= 100) break;
1001
- u ||= l, n.push(u), r = _;
1002
- } while (i < 1);
1003
- return n;
1581
+ t_e = t_e + (t_e - t_s) / 2;
1582
+ } else t_e = t_m;
1583
+ } while (!done && safety++ < 100);
1584
+ if (safety >= 100) break;
1585
+ prev_arc = prev_arc ? prev_arc : arc;
1586
+ circles.push(prev_arc);
1587
+ t_s = prev_e;
1588
+ } while (t_e < 1);
1589
+ return circles;
1004
1590
  }
1005
1591
  };
1006
1592
  //#endregion
1007
- export { E as t };
1593
+ export { Bezier as t };