@weasel-js/geom 1.15.0 → 1.15.2

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 (47) hide show
  1. package/dist/3d/index.d.ts +3 -1
  2. package/dist/3d/index.js +7 -10
  3. package/dist/3d/index.js.map +1 -1
  4. package/dist/booleans/index.js +4 -5
  5. package/dist/booleans/index.js.map +1 -1
  6. package/dist/{chunk-B3D6KWW3.js → chunk-346XYYMX.js} +154 -3
  7. package/dist/chunk-346XYYMX.js.map +1 -0
  8. package/dist/chunk-DNX24KBT.js +82 -0
  9. package/dist/chunk-DNX24KBT.js.map +1 -0
  10. package/dist/{chunk-EURWZUNY.js → chunk-GA5R5KWD.js} +59 -65
  11. package/dist/chunk-GA5R5KWD.js.map +1 -0
  12. package/dist/{chunk-3HQJGI63.js → chunk-HTT5AQIU.js} +3 -4
  13. package/dist/chunk-HTT5AQIU.js.map +1 -0
  14. package/dist/{chunk-FROQPADA.js → chunk-IDSKOHA4.js} +4 -4
  15. package/dist/{chunk-FROQPADA.js.map → chunk-IDSKOHA4.js.map} +1 -1
  16. package/dist/{chunk-HMGGJZTM.js → chunk-MIKP4V2C.js} +7 -21
  17. package/dist/chunk-MIKP4V2C.js.map +1 -0
  18. package/dist/{chunk-HNLJO3E7.js → chunk-MOCSUHEI.js} +22 -8
  19. package/dist/chunk-MOCSUHEI.js.map +1 -0
  20. package/dist/{chunk-3YH5XU3H.js → chunk-OQP5M5VD.js} +14 -23
  21. package/dist/chunk-OQP5M5VD.js.map +1 -0
  22. package/dist/{chunk-ZOMUTU7J.js → chunk-STYO7J4Y.js} +5 -11
  23. package/dist/chunk-STYO7J4Y.js.map +1 -0
  24. package/dist/{curvature-CDOI32hv.d.ts → curvature-DKPO4Qeh.d.ts} +0 -27
  25. package/dist/curves/index.d.ts +1 -1
  26. package/dist/curves/index.js +4 -4
  27. package/dist/index.d.ts +108 -3
  28. package/dist/index.js +159 -162
  29. package/dist/index.js.map +1 -1
  30. package/dist/nd/index.d.ts +28 -1
  31. package/dist/nd/index.js +2 -5
  32. package/dist/nd/index.js.map +1 -1
  33. package/dist/tessellate/index.js +5 -5
  34. package/dist/warp/index.js +8 -15
  35. package/dist/warp/index.js.map +1 -1
  36. package/package.json +3 -3
  37. package/dist/chunk-2N6OWA7E.js +0 -104
  38. package/dist/chunk-2N6OWA7E.js.map +0 -1
  39. package/dist/chunk-3HQJGI63.js.map +0 -1
  40. package/dist/chunk-3YH5XU3H.js.map +0 -1
  41. package/dist/chunk-755Y4YZS.js +0 -32
  42. package/dist/chunk-755Y4YZS.js.map +0 -1
  43. package/dist/chunk-B3D6KWW3.js.map +0 -1
  44. package/dist/chunk-EURWZUNY.js.map +0 -1
  45. package/dist/chunk-HMGGJZTM.js.map +0 -1
  46. package/dist/chunk-HNLJO3E7.js.map +0 -1
  47. package/dist/chunk-ZOMUTU7J.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { pointInPolygon, resolveCorners, fillsOpenSubpaths, flattenCubicWithArcLen, flattenQuadraticWithArcLen, DEFAULT_FLATTEN_TOLERANCE } from './chunk-EURWZUNY.js';
2
- import { rectToContour, originFor, coordsFrom, forEachSegment, PATH_Z, PATH_C, PATH_Q, PATH_L, PATH_M } from './chunk-B3D6KWW3.js';
1
+ import { ringSignedArea, pointInPolygon, resolveCorners, fillsOpenSubpaths, flattenCubicWithArcLen, flattenQuadraticWithArcLen, DEFAULT_FLATTEN_TOLERANCE } from './chunk-GA5R5KWD.js';
2
+ import { pointSegmentDist, rectToContour, originFor, coordsFrom, forEachSegment, PATH_Z, PATH_C, PATH_Q, PATH_L, PATH_M } from './chunk-346XYYMX.js';
3
3
  import earcut from 'earcut';
4
4
 
5
5
  // src/tessellate/sweep.ts
@@ -306,7 +306,7 @@ function nestRings(flat) {
306
306
  const total = coords.length / 2;
307
307
  const rings = contourStarts.map((start, c) => {
308
308
  const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;
309
- return { start, end, area: signedArea(coords, start, end), parent: -1, winding: 0 };
309
+ return { start, end, area: ringSignedArea(coords, start, end), parent: -1, winding: 0 };
310
310
  });
311
311
  const boxes = rings.map((r) => boxOf(coords, r.start, r.end));
312
312
  const bySize = rings.map((_, i) => i).filter((i) => rings[i].area !== 0);
@@ -337,10 +337,7 @@ function onOutline(coords, o, x, y, eps) {
337
337
  for (let i = o.start; i < o.end; i++) {
338
338
  const j = i + 1 === o.end ? o.start : i + 1;
339
339
  const ax = coords[i * 2], ay = coords[i * 2 + 1];
340
- const dx = coords[j * 2] - ax, dy = coords[j * 2 + 1] - ay;
341
- const len2 = dx * dx + dy * dy;
342
- const s = len2 > 0 ? Math.max(0, Math.min(1, ((x - ax) * dx + (y - ay) * dy) / len2)) : 0;
343
- if (Math.hypot(ax + dx * s - x, ay + dy * s - y) <= eps) return true;
340
+ if (pointSegmentDist(x, y, ax, ay, coords[j * 2], coords[j * 2 + 1]) <= eps) return true;
344
341
  }
345
342
  return false;
346
343
  }
@@ -355,14 +352,6 @@ function boxOf(coords, start, end) {
355
352
  }
356
353
  return [minX, minY, maxX, maxY];
357
354
  }
358
- function signedArea(coords, start, end) {
359
- let a = 0;
360
- for (let i = start; i < end; i++) {
361
- const j = i + 1 === end ? start : i + 1;
362
- a += coords[i * 2] * coords[j * 2 + 1] - coords[j * 2] * coords[i * 2 + 1];
363
- }
364
- return a * 0.5;
365
- }
366
355
 
367
356
  // src/tessellate/evenOdd.ts
368
357
  function evenOddRings(flat) {
@@ -452,10 +441,7 @@ function foldsBack(ux, uy, vx, vy) {
452
441
  return Math.abs(cross) <= 1e-9 * Math.hypot(ux, uy) * Math.hypot(vx, vy) && ux * vx + uy * vy < 0;
453
442
  }
454
443
  function near(px, py, ax, ay, bx, by, eps) {
455
- const dx = bx - ax, dy = by - ay;
456
- const len2 = dx * dx + dy * dy;
457
- const t = len2 > 0 ? Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / len2)) : 0;
458
- return Math.hypot(ax + dx * t - px, ay + dy * t - py) <= eps;
444
+ return pointSegmentDist(px, py, ax, ay, bx, by) <= eps;
459
445
  }
460
446
  function properCross(ax, ay, bx, by, cx, cy, dx, dy) {
461
447
  const o1 = orient(ax, ay, bx, by, cx, cy), o2 = orient(ax, ay, bx, by, dx, dy);
@@ -692,5 +678,5 @@ function tessellateEvenoddWithAnchors(coords, contourStarts, anchorA, anchorB, a
692
678
  }
693
679
 
694
680
  export { MAX_EVENODD_RESOLVE_WORK, flattenPolygon, nestRings, resolveCrossings, tessellate };
695
- //# sourceMappingURL=chunk-HMGGJZTM.js.map
696
- //# sourceMappingURL=chunk-HMGGJZTM.js.map
681
+ //# sourceMappingURL=chunk-MIKP4V2C.js.map
682
+ //# sourceMappingURL=chunk-MIKP4V2C.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tessellate/sweep.ts","../src/tessellate/crossings.ts","../src/tessellate/nesting.ts","../src/tessellate/evenOdd.ts","../src/tessellate/tessellate.ts"],"names":["near","rings"],"mappings":"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","file":"chunk-MIKP4V2C.js","sourcesContent":["/** Finding where straight segments cross, by a sweep along x. */\n\nconst LOW_WORD = new Uint8Array(new Uint16Array([1]).buffer)[0] === 1 ? 0 : 1;\n/** How far, relative to itself, writing an index into a key's low word can\n * move it. A zero key becomes a subnormal, which the sweep's 1e-300 covers. */\nconst KEY_SLACK = 2 ** -19;\n\n/**\n * Call `visit` for every pair of segments that cross inside both, with how far\n * along each the crossing lies; `visit` returns `true` to stop. `ends` holds\n * `n` segments as `x0, y0, x1, y1`. Of each pair, `e` is the one whose\n * smallest x is smaller.\n */\nexport function forEachCrossing(\n ends: Float64Array,\n n: number,\n visit: (e: number, f: number, s: number, u: number) => boolean | void,\n): void {\n const keys = sortedMinX(ends, n);\n const index = new Uint32Array(keys.buffer);\n for (let i = 0; i < n; i++) {\n const ei = index[i * 2 + LOW_WORD], e = ei * 4;\n const ex0 = ends[e], ey0 = ends[e + 1], ex1 = ends[e + 2], ey1 = ends[e + 3];\n const maxX = Math.max(ex0, ex1);\n const stop = maxX + Math.abs(maxX) * KEY_SLACK + 1e-300;\n for (let j = i + 1; j < n; j++) {\n if (keys[j] > stop) break;\n const fi = index[j * 2 + LOW_WORD], f = fi * 4;\n const fx0 = ends[f], fy0 = ends[f + 1], fx1 = ends[f + 2], fy1 = ends[f + 3];\n if (Math.max(ey0, ey1) < Math.min(fy0, fy1)) continue;\n if (Math.max(fy0, fy1) < Math.min(ey0, ey1)) continue;\n const hit = crossingParams(ex0, ey0, ex1, ey1, fx0, fy0, fx1, fy1);\n if (hit && visit(ei, fi, hit[0], hit[1])) return;\n }\n }\n}\n\n/**\n * Each segment's smallest x in ascending order, with the segment's index\n * written into the key's low 32 bits, read back through a `Uint32Array` view.\n * A native numeric sort runs about three times as fast as one through a\n * comparator; the index moves each key by under `KEY_SLACK` of itself, which\n * the sweep's stop allows for.\n */\nfunction sortedMinX(ends: Float64Array, n: number): Float64Array {\n const keys = new Float64Array(n);\n const index = new Uint32Array(keys.buffer);\n for (let e = 0; e < n; e++) {\n keys[e] = Math.min(ends[e * 4], ends[e * 4 + 2]);\n index[e * 2 + LOW_WORD] = e;\n }\n return keys.sort();\n}\n\n/** Where segment E crosses segment F inside both, as fractions along each. */\nfunction crossingParams(\n ex0: number, ey0: number, ex1: number, ey1: number,\n fx0: number, fy0: number, fx1: number, fy1: number,\n): [number, number] | null {\n const rx = ex1 - ex0, ry = ey1 - ey0;\n const qx = fx1 - fx0, qy = fy1 - fy0;\n const den = rx * qy - ry * qx;\n if (den === 0) return null;\n const dx = fx0 - ex0, dy = fy0 - ey0;\n const s = (dx * qy - dy * qx) / den;\n const u = (dx * ry - dy * rx) / den;\n const lo = 1e-9, hi = 1 - 1e-9;\n if (s <= lo || s >= hi || u <= lo || u >= hi) return null;\n return [s, u];\n}\n","/** Rebuilding outlines as the non-crossing boundary of their fill. */\n\nimport { forEachCrossing } from './sweep';\n\n/** Flattened contours with each vertex's anchor parameterization. */\nexport interface FlattenedContours {\n coords: number[];\n contourStarts: number[];\n anchorA: number[];\n anchorB: number[];\n anchorT: number[];\n}\n\ninterface Node {\n x: number;\n y: number;\n a: number;\n b: number;\n t: number;\n}\n\ninterface Edge {\n from: Node;\n to: Node;\n /** Where crossings cut this edge, by parameter along it. */\n cuts: { s: number; node: Node }[];\n}\n\ninterface Piece {\n from: Node;\n to: Node;\n}\n\nconst keyOf = (n: Node): string => `${n.x},${n.y}`;\n\n/**\n * The boundary of `flat`'s nonzero fill as loops that do not cross, each with\n * the fill on its left, or `null` when no two edges cross and `always` is\n * not set.\n */\nexport function resolveCrossings(flat: FlattenedContours, always = false): FlattenedContours | null {\n if (!always && !anyCrossing(flat)) return null;\n return resolve(flat, (w) => w !== 0)!.contours;\n}\n\n/**\n * How much work resolving an even-odd fill may take, as boundary pieces times\n * edges: each piece is judged by a winding count over every edge. 2^20 of it\n * took 10 ms on an Apple M-series core (1024 edges, 2026-10-31), and parity is\n * what the stencil computes for free, so a fill past it keeps the stencil.\n */\nexport const MAX_EVENODD_RESOLVE_WORK = 2 ** 20;\n\n/**\n * The boundary of `flat`'s even-odd fill as loops that neither cross nor\n * overlap, each with the fill on its left, for outlines that cross or touch.\n * `null` when resolving would pass {@link MAX_EVENODD_RESOLVE_WORK}, or a\n * boundary piece would not close into a loop.\n */\nexport function resolveEvenOdd(flat: FlattenedContours): FlattenedContours | null {\n const edges = edgeCount(flat);\n const maxCrossings = Math.floor((MAX_EVENODD_RESOLVE_WORK / edges - edges) / 2);\n if (!(maxCrossings >= 0)) return null;\n const out = resolve(flat, (w) => (w & 1) !== 0, maxCrossings);\n return out !== null && out.complete ? out.contours : null;\n}\n\nfunction resolve(\n flat: FlattenedContours, filled: (winding: number) => boolean, maxCrossings = Infinity,\n): { contours: FlattenedContours; complete: boolean } | null {\n const edges = edgesOf(flat);\n const eps = contactTolerance(edges);\n if (!cutAtCrossings(edges, maxCrossings)) return null;\n cutAtContacts(edges, eps);\n weld(edges, eps);\n const pieces = boundaryPieces(edges, filled);\n const { loops, complete } = chainLoops(pieces);\n return { contours: loopsToContours(loops), complete };\n}\n\nfunction edgeCount(flat: FlattenedContours): number {\n const { coords, contourStarts } = flat;\n const total = coords.length / 2;\n let n = 0;\n contourStarts.forEach((start, c) => {\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;\n for (let i = start; i < end; i++) {\n const j = i + 1 < end ? i + 1 : start;\n if (coords[i * 2] !== coords[j * 2] || coords[i * 2 + 1] !== coords[j * 2 + 1]) n++;\n }\n });\n return n;\n}\n\n/** Whether any two edges of `flat` cross. Every nonzero fill asks this, and\n * most cross nowhere, so it reads the coordinates without building edges. */\nexport function anyCrossing(flat: FlattenedContours): boolean {\n const { coords, contourStarts } = flat;\n const total = coords.length / 2;\n const ends = new Float64Array(total * 4);\n let n = 0;\n contourStarts.forEach((start, c) => {\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;\n for (let i = start; i < end; i++) {\n const j = i + 1 < end ? i + 1 : start;\n const x0 = coords[i * 2], y0 = coords[i * 2 + 1], x1 = coords[j * 2], y1 = coords[j * 2 + 1];\n if (x0 === x1 && y0 === y1) continue;\n ends[n * 4] = x0; ends[n * 4 + 1] = y0; ends[n * 4 + 2] = x1; ends[n * 4 + 3] = y1;\n n++;\n }\n });\n let found = false;\n forEachCrossing(ends, n, () => (found = true));\n return found;\n}\n\nfunction edgesOf(flat: FlattenedContours): Edge[] {\n const { coords, contourStarts, anchorA, anchorB, anchorT } = flat;\n const total = coords.length / 2;\n const node = (i: number): Node => ({ x: coords[i * 2], y: coords[i * 2 + 1], a: anchorA[i], b: anchorB[i], t: anchorT[i] });\n const edges: Edge[] = [];\n contourStarts.forEach((start, c) => {\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;\n for (let i = start; i < end; i++) {\n const from = node(i), to = node(i + 1 < end ? i + 1 : start);\n if (from.x !== to.x || from.y !== to.y) edges.push({ from, to, cuts: [] });\n }\n });\n return edges;\n}\n\n/** Record every interior crossing on both edges it cuts. `false`, having\n * stopped, when there are more than `max`. */\nfunction cutAtCrossings(edges: Edge[], max: number): boolean {\n const ends = new Float64Array(edges.length * 4);\n edges.forEach(({ from, to }, i) => ends.set([from.x, from.y, to.x, to.y], i * 4));\n let count = 0;\n forEachCrossing(ends, edges.length, (ei, fi, s, u) => {\n if (++count > max) return true;\n const e = edges[ei];\n const node = {\n x: e.from.x + (e.to.x - e.from.x) * s,\n y: e.from.y + (e.to.y - e.from.y) * s,\n ...anchorsAlong(e, s),\n };\n e.cuts.push({ s, node });\n edges[fi].cuts.push({ s: u, node });\n return false;\n });\n return count <= max;\n}\n\n/**\n * Cut every edge where another's end lies inside it, so outlines that touch\n * without crossing (a corner on an edge, a stretch of edge two contours share)\n * meet at a node both name. The cut takes the touching end's own coordinates,\n * so the two sides of a shared stretch come out as the same pieces.\n */\nfunction cutAtContacts(edges: Edge[], eps: number): void {\n const order = edges.map((_, i) => i);\n const lo = (e: Edge): number => Math.min(e.from.x, e.to.x);\n order.sort((a, b) => lo(edges[a]) - lo(edges[b]));\n for (let a = 0; a < order.length; a++) {\n const e = edges[order[a]];\n const stop = Math.max(e.from.x, e.to.x) + eps;\n for (let b = a + 1; b < order.length; b++) {\n const f = edges[order[b]];\n if (lo(f) > stop) break;\n if (Math.max(e.from.y, e.to.y) + eps < Math.min(f.from.y, f.to.y)) continue;\n if (Math.max(f.from.y, f.to.y) + eps < Math.min(e.from.y, e.to.y)) continue;\n cutAt(e, f.from, eps); cutAt(e, f.to, eps);\n cutAt(f, e.from, eps); cutAt(f, e.to, eps);\n }\n }\n}\n\n/** How near two points are to count as touching: the tolerance\n * `evenOddRings` judges contact by. */\nfunction contactTolerance(edges: Edge[]): number {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const { from: p } of edges) {\n minX = Math.min(minX, p.x); maxX = Math.max(maxX, p.x);\n minY = Math.min(minY, p.y); maxY = Math.max(maxY, p.y);\n }\n return Math.max(maxX - minX, maxY - minY, Math.abs(minX), Math.abs(maxX), Math.abs(minY), Math.abs(maxY)) * 1e-9;\n}\n\n/** Move every node within `eps` of one before it onto that one, so loops\n * chain through points that differ only by rounding. */\nfunction weld(edges: Edge[], eps: number): void {\n const nodes: Node[] = [];\n for (const e of edges) {\n nodes.push(e.from, e.to);\n for (const c of e.cuts) nodes.push(c.node);\n }\n nodes.sort((p, q) => p.x - q.x);\n for (let i = 0; i < nodes.length; i++) {\n const p = nodes[i];\n for (let j = i + 1; j < nodes.length && nodes[j].x - p.x <= eps; j++) {\n const q = nodes[j];\n if (q !== p && Math.abs(q.y - p.y) <= eps && (q.x !== p.x || q.y !== p.y)) {\n q.x = p.x;\n q.y = p.y;\n }\n }\n }\n}\n\n/** Cut `e` at `p` when `p` lies within `eps` of its inside, away from its ends\n * and from any cut already there. */\nfunction cutAt(e: Edge, p: Node, eps: number): void {\n const dx = e.to.x - e.from.x, dy = e.to.y - e.from.y;\n const len2 = dx * dx + dy * dy;\n const s = ((p.x - e.from.x) * dx + (p.y - e.from.y) * dy) / len2;\n if (!(s > 0 && s < 1)) return;\n if (Math.hypot(e.from.x + dx * s - p.x, e.from.y + dy * s - p.y) > eps) return;\n const at = (q: Node): boolean => Math.abs(q.x - p.x) <= eps && Math.abs(q.y - p.y) <= eps;\n if (at(e.from) || at(e.to) || e.cuts.some((c) => at(c.node))) return;\n e.cuts.push({ s, node: p });\n}\n\n/** Anchors for a point `s` of the way along `e`: interpolated within one\n * curve's run, else the nearer end's. */\nfunction anchorsAlong(e: Edge, s: number): { a: number; b: number; t: number } {\n const { from, to } = e;\n if (from.a === to.a && from.b === to.b) return { a: from.a, b: from.b, t: from.t + (to.t - from.t) * s };\n const near = s < 0.5 ? from : to;\n return { a: near.a, b: near.b, t: near.t };\n}\n\n/** The pieces between cuts that have fill on exactly one side, turned so it\n * is on the left. A stretch two edges share comes out once. */\nfunction boundaryPieces(edges: Edge[], filledBy: (winding: number) => boolean): Piece[] {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const { from: p } of edges) {\n minX = Math.min(minX, p.x); maxX = Math.max(maxX, p.x);\n minY = Math.min(minY, p.y); maxY = Math.max(maxY, p.y);\n }\n const eps = Math.max(Math.hypot(maxX - minX, maxY - minY) * 1e-7, 1e-9);\n const filled = (x: number, y: number) => filledBy(windingAt(edges, x, y));\n\n const out: Piece[] = [];\n const seen = new Set<string>();\n const keep = (from: Node, to: Node): void => {\n const k = `${keyOf(from)}>${keyOf(to)}`;\n if (seen.has(k)) return;\n seen.add(k);\n out.push({ from, to });\n };\n for (const e of edges) {\n const stops = [e.from, ...e.cuts.sort((p, q) => p.s - q.s).map((c) => c.node), e.to];\n for (let k = 0; k + 1 < stops.length; k++) {\n const p = stops[k], q = stops[k + 1];\n const dx = q.x - p.x, dy = q.y - p.y;\n const len = Math.hypot(dx, dy);\n if (len === 0) continue;\n const mx = (p.x + q.x) / 2, my = (p.y + q.y) / 2;\n const nx = (-dy / len) * eps, ny = (dx / len) * eps;\n const left = filled(mx + nx, my + ny), right = filled(mx - nx, my - ny);\n if (left && !right) keep(p, q);\n else if (right && !left) keep(q, p);\n }\n }\n return out;\n}\n\nfunction windingAt(edges: Edge[], x: number, y: number): number {\n let w = 0;\n for (const { from: p, to: q } of edges) {\n const side = (q.x - p.x) * (y - p.y) - (x - p.x) * (q.y - p.y);\n if (p.y <= y && q.y > y && side > 0) w++;\n else if (q.y <= y && p.y > y && side < 0) w--;\n }\n return w;\n}\n\n/** Join pieces end to start into closed loops. Where a node has several ways\n * on, take the sharpest left turn, which keeps to the face being traced. */\nfunction chainLoops(pieces: Piece[]): { loops: Node[][]; complete: boolean } {\n const outgoing = new Map<string, Piece[]>();\n for (const p of pieces) {\n const k = keyOf(p.from);\n const list = outgoing.get(k);\n if (list) list.push(p);\n else outgoing.set(k, [p]);\n }\n const used = new Set<Piece>();\n const loops: Node[][] = [];\n let complete = true;\n for (const first of pieces) {\n if (used.has(first)) continue;\n used.add(first);\n const loop: Node[] = [first.from];\n const startKey = keyOf(first.from);\n let cur = first;\n while (keyOf(cur.to) !== startKey) {\n const next = sharpestLeft(cur, (outgoing.get(keyOf(cur.to)) ?? []).filter((p) => !used.has(p)));\n if (!next) break;\n used.add(next);\n loop.push(next.from);\n cur = next;\n }\n if (keyOf(cur.to) !== startKey) complete = false;\n else if (loop.length >= 3) loops.push(loop);\n }\n return { loops, complete };\n}\n\nfunction sharpestLeft(into: Piece, options: Piece[]): Piece | undefined {\n const ix = into.to.x - into.from.x, iy = into.to.y - into.from.y;\n let best: Piece | undefined;\n let bestTurn = -Infinity;\n for (const p of options) {\n const ox = p.to.x - p.from.x, oy = p.to.y - p.from.y;\n const turn = Math.atan2(ix * oy - iy * ox, ix * ox + iy * oy);\n if (turn > bestTurn) {\n bestTurn = turn;\n best = p;\n }\n }\n return best;\n}\n\nfunction loopsToContours(loops: Node[][]): FlattenedContours {\n const out: FlattenedContours = { coords: [], contourStarts: [], anchorA: [], anchorB: [], anchorT: [] };\n for (const loop of loops) {\n out.contourStarts.push(out.coords.length / 2);\n for (const n of loop) {\n out.coords.push(n.x, n.y);\n out.anchorA.push(n.a);\n out.anchorB.push(n.b);\n out.anchorT.push(n.t);\n }\n }\n return out;\n}\n","/** How the rings of a fill that does not cross itself sit inside one another. */\n\nimport { pointInPolygon, ringSignedArea } from '../polyline';\nimport type { FlattenedContours } from './crossings';\nimport { pointSegmentDist } from '../points2';\n\nexport interface Ring {\n start: number;\n end: number;\n area: number;\n /** The smallest ring this one lies inside, or -1. */\n parent: number;\n /** Nonzero winding number just inside this ring. */\n winding: number;\n}\n\n/** Each contour's ring. A zero-area ring has no parent and winding 0. */\nexport function nestRings(flat: FlattenedContours): Ring[] {\n const { coords, contourStarts } = flat;\n const total = coords.length / 2;\n const rings: Ring[] = contourStarts.map((start, c) => {\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;\n return { start, end, area: ringSignedArea(coords, start, end), parent: -1, winding: 0 };\n });\n const boxes = rings.map((r) => boxOf(coords, r.start, r.end));\n const bySize = rings.map((_, i) => i).filter((i) => rings[i].area !== 0);\n bySize.sort((i, j) => Math.abs(rings[j].area) - Math.abs(rings[i].area));\n for (let k = 0; k < bySize.length; k++) {\n const r = rings[bySize[k]];\n for (let m = k - 1; m >= 0; m--) {\n const o = bySize[m];\n if (contains(coords, rings[o], boxes[o], r)) {\n r.parent = o;\n break;\n }\n }\n r.winding = Math.sign(r.area) + (r.parent >= 0 ? rings[r.parent].winding : 0);\n }\n return rings;\n}\n\n/** Whether `r` lies inside `o`, given that neither crosses the other. Judged\n * at the first vertex of `r` not on `o`'s outline, since one on it is\n * inside or out by rounding. */\nfunction contains(coords: number[], o: Ring, box: number[], r: Ring): boolean {\n const eps = Math.max(box[2] - box[0], box[3] - box[1]) * 1e-9;\n for (let i = r.start; i < r.end; i++) {\n const x = coords[i * 2], y = coords[i * 2 + 1];\n if (x < box[0] || x > box[2] || y < box[1] || y > box[3]) return false;\n if (!onOutline(coords, o, x, y, eps)) return pointInPolygon(coords, x, y, o.start, o.end);\n }\n return false;\n}\n\nfunction onOutline(coords: number[], o: Ring, x: number, y: number, eps: number): boolean {\n for (let i = o.start; i < o.end; i++) {\n const j = i + 1 === o.end ? o.start : i + 1;\n const ax = coords[i * 2], ay = coords[i * 2 + 1];\n if (pointSegmentDist(x, y, ax, ay, coords[j * 2], coords[j * 2 + 1]) <= eps) return true;\n }\n return false;\n}\n\nfunction boxOf(coords: number[], start: number, end: number): number[] {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let i = start; i < end; i++) {\n const x = coords[i * 2], y = coords[i * 2 + 1];\n minX = Math.min(minX, x); maxX = Math.max(maxX, x);\n minY = Math.min(minY, y); maxY = Math.max(maxY, y);\n }\n return [minX, minY, maxX, maxY];\n}\n\n","/** Even-odd fills whose outlines never meet, which triangulate like nonzero ones. */\n\nimport type { FlattenedContours } from './crossings';\nimport { nestRings, type Ring } from './nesting';\nimport { pointSegmentDist } from '../points2';\n\n/**\n * The rings of an even-odd fill with each `winding` set to 1 where the fill\n * lies just inside it and 0 where a hole does, or `null` when two edges touch\n * anywhere but the vertex two neighbors share, or a ring has no area. Without\n * contact, each ring is filled or empty by how many rings enclose it, so the\n * fill is the even-depth rings less their children and earcut can draw it.\n * Contact is judged with a tolerance, so a near miss reads as a touch.\n */\nexport function evenOddRings(flat: FlattenedContours): Ring[] | null {\n if (anyContact(flat)) return null;\n const rings = nestRings(flat);\n if (rings.some((r) => r.area === 0)) return null;\n for (const r of rings) {\n let depth = 0;\n for (let p = r.parent; p >= 0; p = rings[p].parent) depth++;\n r.winding = depth % 2 === 0 ? 1 : 0;\n }\n return rings;\n}\n\n/** Segments as `x0, y0, x1, y1`, with each one's contour and position in it. */\ninterface Segments {\n ends: Float64Array;\n contour: Uint32Array;\n pos: Uint32Array;\n /** Segments in each contour. */\n count: number[];\n n: number;\n}\n\nfunction segmentsOf(flat: FlattenedContours): Segments {\n const { coords, contourStarts } = flat;\n const total = coords.length / 2;\n const ends = new Float64Array(total * 4);\n const contour = new Uint32Array(total);\n const pos = new Uint32Array(total);\n const count: number[] = [];\n let n = 0;\n contourStarts.forEach((start, c) => {\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : total;\n let k = 0;\n for (let i = start; i < end; i++) {\n const j = i + 1 < end ? i + 1 : start;\n const x0 = coords[i * 2], y0 = coords[i * 2 + 1], x1 = coords[j * 2], y1 = coords[j * 2 + 1];\n if (x0 === x1 && y0 === y1) continue;\n ends.set([x0, y0, x1, y1], n * 4);\n contour[n] = c;\n pos[n] = k++;\n n++;\n }\n count.push(k);\n });\n return { ends, contour, pos, count, n };\n}\n\n/** Whether any two segments meet other than at the end two neighbors share. */\nfunction anyContact(flat: FlattenedContours): boolean {\n const s = segmentsOf(flat);\n const { ends, n } = s;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let i = 0; i < n * 4; i += 2) {\n minX = Math.min(minX, ends[i]); maxX = Math.max(maxX, ends[i]);\n minY = Math.min(minY, ends[i + 1]); maxY = Math.max(maxY, ends[i + 1]);\n }\n const eps = Math.max(maxX - minX, maxY - minY, Math.abs(minX), Math.abs(maxX), Math.abs(minY), Math.abs(maxY)) * 1e-9;\n const order = Array.from({ length: n }, (_, i) => i);\n const lo = (e: number): number => Math.min(ends[e * 4], ends[e * 4 + 2]);\n order.sort((a, b) => lo(a) - lo(b));\n for (let a = 0; a < n; a++) {\n const e = order[a];\n const stop = Math.max(ends[e * 4], ends[e * 4 + 2]) + eps;\n for (let b = a + 1; b < n; b++) {\n const f = order[b];\n if (lo(f) > stop) break;\n if (touches(s, e, f, eps)) return true;\n }\n }\n return false;\n}\n\nfunction touches(s: Segments, e: number, f: number, eps: number): boolean {\n const { ends } = s;\n const ax = ends[e * 4], ay = ends[e * 4 + 1], bx = ends[e * 4 + 2], by = ends[e * 4 + 3];\n const cx = ends[f * 4], cy = ends[f * 4 + 1], dx = ends[f * 4 + 2], dy = ends[f * 4 + 3];\n if (Math.max(ay, by) + eps < Math.min(cy, dy) || Math.max(cy, dy) + eps < Math.min(ay, by)) return false;\n const shared = sharedEnd(s, e, f);\n if (shared === 'e-to') {\n // f starts where e ends: they meet only there unless f doubles back along e.\n return foldsBack(bx - ax, by - ay, dx - cx, dy - cy) || near(ax, ay, cx, cy, dx, dy, eps);\n }\n if (shared === 'f-to') {\n return foldsBack(dx - cx, dy - cy, bx - ax, by - ay) || near(cx, cy, ax, ay, bx, by, eps);\n }\n return near(ax, ay, cx, cy, dx, dy, eps) || near(bx, by, cx, cy, dx, dy, eps)\n || near(cx, cy, ax, ay, bx, by, eps) || near(dx, dy, ax, ay, bx, by, eps)\n || properCross(ax, ay, bx, by, cx, cy, dx, dy);\n}\n\n/** Which of the pair hands its end to the other as its start, when they are\n * neighbors in one contour. A contour of two segments has them meet at both\n * ends, and is caught for having no area. */\nfunction sharedEnd(s: Segments, e: number, f: number): 'e-to' | 'f-to' | null {\n if (s.contour[e] !== s.contour[f]) return null;\n const k = s.count[s.contour[e]];\n if (k < 3) return null;\n if ((s.pos[e] + 1) % k === s.pos[f]) return 'e-to';\n if ((s.pos[f] + 1) % k === s.pos[e]) return 'f-to';\n return null;\n}\n\n/** Whether the second direction turns back along the first. */\nfunction foldsBack(ux: number, uy: number, vx: number, vy: number): boolean {\n const cross = ux * vy - uy * vx;\n return Math.abs(cross) <= 1e-9 * Math.hypot(ux, uy) * Math.hypot(vx, vy) && ux * vx + uy * vy < 0;\n}\n\n/** Whether point P lies within `eps` of segment AB. */\nfunction near(px: number, py: number, ax: number, ay: number, bx: number, by: number, eps: number): boolean {\n return pointSegmentDist(px, py, ax, ay, bx, by) <= eps;\n}\n\nfunction properCross(\n ax: number, ay: number, bx: number, by: number,\n cx: number, cy: number, dx: number, dy: number,\n): boolean {\n const o1 = orient(ax, ay, bx, by, cx, cy), o2 = orient(ax, ay, bx, by, dx, dy);\n const o3 = orient(cx, cy, dx, dy, ax, ay), o4 = orient(cx, cy, dx, dy, bx, by);\n return o1 * o2 <= 0 && o3 * o4 <= 0;\n}\n\nconst orient = (ax: number, ay: number, bx: number, by: number, px: number, py: number): number =>\n Math.sign((bx - ax) * (py - ay) - (by - ay) * (px - ax));\n","import earcut from 'earcut';\nimport { forEachSegment, PATH_M, PATH_L, PATH_Z, PATH_C, PATH_Q } from '../commands';\nimport { resolveCorners } from '../paths/corners';\nimport { coordsFrom, originFor } from '../paths/pathOrigin';\nimport { rectToContour } from '../box';\nimport type { Path, PolygonPath, RectPath } from '../path';\nimport { fillsOpenSubpaths } from '../openFill';\nimport {\n DEFAULT_FLATTEN_TOLERANCE,\n flattenCubicWithArcLen,\n flattenQuadraticWithArcLen,\n} from '../flatten';\nimport type { Mesh } from './mesh';\nimport { resolveCrossings, resolveEvenOdd, type FlattenedContours } from './crossings';\nimport { nestRings, type Ring } from './nesting';\nimport { evenOddRings } from './evenOdd';\n\n/** Options for `tessellate`. A smaller tolerance means more triangles and\n * smoother curves; it is in path-local units, so callers rendering at a\n * larger scale should tighten it. */\nexport interface TessellateOptions {\n /** Flatness tolerance for bezier subdivision in path-local units. */\n flattenTolerance?: number;\n}\n\n/** Turn a path into a triangle mesh the renderer can draw: curves flattened to\n * line segments, then the resulting polygon triangulated. */\nexport function tessellate(path: Path, opts: TessellateOptions = {}): Mesh {\n if (path.kind === 'rect') return tessellateRect(path);\n const mesh = tessellatePolygon(resolveCorners(path), opts);\n return path.origin ? { ...mesh, origin: path.origin } : mesh;\n}\n\nfunction tessellateRect(p: RectPath): Mesh {\n const corners = rectToContour(p.x, p.y, p.width, p.height);\n const origin = originFor(corners);\n return {\n vertices: coordsFrom(origin, corners),\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\n anchorA: new Uint32Array([0, 1, 2, 3]),\n anchorB: new Uint32Array([0, 1, 2, 3]),\n anchorT: new Float32Array([0, 0, 0, 0]),\n ...(origin ? { origin } : {}),\n };\n}\n\n/** The contours a fill covers: all of them, or only those a `Z` closed. */\nexport function flattenPolygon(p: PolygonPath, tolerance: number): FlattenedContours {\n const closed = new Set<number>();\n const all = flattenContours(p, tolerance, closed);\n if (fillsOpenSubpaths(p)) return all;\n const kept: FlattenedContours = { coords: [], contourStarts: [], anchorA: [], anchorB: [], anchorT: [] };\n all.contourStarts.forEach((start, c) => {\n if (!closed.has(c)) return;\n const end = c + 1 < all.contourStarts.length ? all.contourStarts[c + 1] : all.coords.length / 2;\n kept.contourStarts.push(kept.coords.length / 2);\n kept.coords.push(...all.coords.slice(start * 2, end * 2));\n kept.anchorA.push(...all.anchorA.slice(start, end));\n kept.anchorB.push(...all.anchorB.slice(start, end));\n kept.anchorT.push(...all.anchorT.slice(start, end));\n });\n return kept;\n}\n\n/** Flatten every contour, noting in `closed` the index of each one a `Z` ends. */\nfunction flattenContours(p: PolygonPath, tolerance: number, closed: Set<number>): FlattenedContours {\n const { commands, coords } = p;\n const out: number[] = [];\n const anchorA: number[] = [];\n const anchorB: number[] = [];\n const anchorT: number[] = [];\n const contourStarts: number[] = [];\n let startAnchor = -1;\n let prevAnchor = -1;\n let anchorCounter = 0;\n\n // Anchor bookkeeping for the points a curve just appended: interior points\n // interpolate (prevAnchor → target); the last is pinned anchor-exact.\n const pushCurveAnchors = (anchorStart: number, arcAccum: number[], total: number, target: number): void => {\n for (let k = 0; k < arcAccum.length; k++) {\n anchorA.push(prevAnchor);\n anchorB.push(target);\n anchorT.push(total > 0 ? arcAccum[k] / total : 0);\n }\n const lastIdx = anchorStart + arcAccum.length - 1;\n anchorA[lastIdx] = target;\n anchorB[lastIdx] = target;\n anchorT[lastIdx] = 0;\n };\n\n forEachSegment(commands, coords, (cmd, coordIdx, prevX, prevY, _i, opensSubpath) => {\n if (opensSubpath) {\n const anchor = Math.max(startAnchor, 0);\n contourStarts.push(out.length / 2);\n out.push(prevX, prevY);\n anchorA.push(anchor);\n anchorB.push(anchor);\n anchorT.push(0);\n prevAnchor = anchor;\n }\n switch (cmd) {\n case PATH_M:\n case PATH_L: {\n if (cmd === PATH_M) {\n contourStarts.push(out.length / 2);\n startAnchor = anchorCounter;\n }\n out.push(coords[coordIdx], coords[coordIdx + 1]);\n anchorA.push(anchorCounter);\n anchorB.push(anchorCounter);\n anchorT.push(0);\n prevAnchor = anchorCounter;\n anchorCounter++;\n break;\n }\n case PATH_Q: {\n const target = anchorCounter;\n const arcAccum: number[] = [];\n const anchorStart = anchorA.length;\n const total = flattenQuadraticWithArcLen(\n prevX, prevY,\n coords[coordIdx], coords[coordIdx + 1],\n coords[coordIdx + 2], coords[coordIdx + 3],\n tolerance, out, arcAccum,\n );\n pushCurveAnchors(anchorStart, arcAccum, total, target);\n prevAnchor = target;\n anchorCounter++;\n break;\n }\n case PATH_C: {\n const target = anchorCounter;\n const arcAccum: number[] = [];\n const anchorStart = anchorA.length;\n const total = flattenCubicWithArcLen(\n prevX, prevY,\n coords[coordIdx], coords[coordIdx + 1],\n coords[coordIdx + 2], coords[coordIdx + 3],\n coords[coordIdx + 4], coords[coordIdx + 5],\n tolerance, out, arcAccum,\n );\n pushCurveAnchors(anchorStart, arcAccum, total, target);\n prevAnchor = target;\n anchorCounter++;\n break;\n }\n case PATH_Z:\n closed.add(contourStarts.length - 1);\n // The pen returns to the subpath start (forEachSegment does that); the\n // anchor it carries has to follow, or a curve after the Z interpolates\n // from the wrong end.\n prevAnchor = startAnchor;\n break;\n default:\n throw new Error(`tessellate: unknown command code ${cmd}`);\n }\n });\n\n return { coords: out, contourStarts, anchorA, anchorB, anchorT };\n}\n\nfunction tessellatePolygon(p: PolygonPath, opts: TessellateOptions): Mesh {\n const tolerance = opts.flattenTolerance ?? DEFAULT_FLATTEN_TOLERANCE;\n const flat = flattenPolygon(p, tolerance);\n\n if (p.fillRule === 'evenodd') {\n const rings = evenOddRings(flat);\n if (rings) return tessellateNonzero(flat, rings);\n const resolved = resolveEvenOdd(flat);\n if (resolved) return tessellateNonzero(resolved, nestRings(resolved));\n const { coords, contourStarts, anchorA, anchorB, anchorT } = flat;\n return tessellateEvenoddWithAnchors(coords, contourStarts, anchorA, anchorB, anchorT);\n }\n const crossed = resolveCrossings(flat);\n if (crossed) return tessellateNonzero(crossed, nestRings(crossed));\n const rings = nestRings(flat);\n if (rings.every((r) => Math.abs(r.winding) <= 1)) return tessellateNonzero(flat, rings);\n // Nested same-wound rings would cover the region they share twice.\n const rebuilt = resolveCrossings(flat, true)!;\n return tessellateNonzero(rebuilt, nestRings(rebuilt));\n}\n\n/** Triangulate rings that do not cross and wind at most once anywhere: each\n * ring with fill inside it, less the rings directly inside it, which are its\n * holes. */\nfunction tessellateNonzero(flat: FlattenedContours, rings: Ring[]): Mesh {\n const { coords, contourStarts, anchorA, anchorB, anchorT } = flat;\n const shapes: number[] = [];\n const holesByShape = new Map<number, number[]>();\n rings.forEach((r, i) => {\n if (r.area === 0) return;\n if (r.winding !== 0) shapes.push(i);\n else if (holesByShape.has(r.parent)) holesByShape.get(r.parent)!.push(i);\n else holesByShape.set(r.parent, [i]);\n });\n\n if (shapes.length <= 1 && (shapes[0] ?? 0) === 0) {\n const tri = earcut(coords, contourStarts.length > 1 ? contourStarts.slice(1) : undefined);\n return {\n vertices: new Float32Array(coords),\n indices: new Uint32Array(tri),\n anchorA: new Uint32Array(anchorA),\n anchorB: new Uint32Array(anchorB),\n anchorT: new Float32Array(anchorT),\n };\n }\n\n const finalCoords: number[] = [];\n const finalAnchorA: number[] = [];\n const finalAnchorB: number[] = [];\n const finalAnchorT: number[] = [];\n const finalIndices: number[] = [];\n for (const pos of shapes) {\n const holes = holesByShape.get(pos) ?? [];\n const offset = finalCoords.length / 2;\n const groupCoords: number[] = [];\n const groupStarts: number[] = [0];\n for (let i = rings[pos].start; i < rings[pos].end; i++) {\n groupCoords.push(coords[i * 2], coords[i * 2 + 1]);\n finalAnchorA.push(anchorA[i]);\n finalAnchorB.push(anchorB[i]);\n finalAnchorT.push(anchorT[i]);\n }\n for (const h of holes) {\n groupStarts.push(groupCoords.length / 2);\n for (let i = rings[h].start; i < rings[h].end; i++) {\n groupCoords.push(coords[i * 2], coords[i * 2 + 1]);\n finalAnchorA.push(anchorA[i]);\n finalAnchorB.push(anchorB[i]);\n finalAnchorT.push(anchorT[i]);\n }\n }\n const tri = earcut(groupCoords, groupStarts.length > 1 ? groupStarts.slice(1) : undefined);\n for (const v of groupCoords) finalCoords.push(v);\n for (const idx of tri) finalIndices.push(idx + offset);\n }\n\n return {\n vertices: new Float32Array(finalCoords),\n indices: new Uint32Array(finalIndices),\n anchorA: new Uint32Array(finalAnchorA),\n anchorB: new Uint32Array(finalAnchorB),\n anchorT: new Float32Array(finalAnchorT),\n };\n}\n\nfunction tessellateEvenoddWithAnchors(\n coords: number[],\n contourStarts: number[],\n anchorA: number[],\n anchorB: number[],\n anchorT: number[],\n): Mesh {\n const indices: number[] = [];\n const totalVerts = coords.length / 2;\n for (let c = 0; c < contourStarts.length; c++) {\n const start = contourStarts[c];\n const end = c + 1 < contourStarts.length ? contourStarts[c + 1] : totalVerts;\n for (let i = start + 1; i < end - 1; i++) {\n indices.push(start, i, i + 1);\n }\n }\n return {\n vertices: new Float32Array(coords),\n indices: new Uint32Array(indices),\n requiresStencil: true,\n anchorA: new Uint32Array(anchorA),\n anchorB: new Uint32Array(anchorB),\n anchorT: new Float32Array(anchorT),\n };\n}\n"]}
@@ -1,5 +1,21 @@
1
- import { segmentEnds, isStraightSegment, anchorsToPath, pathToAnchors } from './chunk-3HQJGI63.js';
2
- import { cubicPointAt } from './chunk-B3D6KWW3.js';
1
+ import { segmentEnds, isStraightSegment, anchorsToPath, pathToAnchors } from './chunk-HTT5AQIU.js';
2
+ import { cubicPointAt, distance } from './chunk-346XYYMX.js';
3
+
4
+ // src/angle.ts
5
+ var TAU = Math.PI * 2;
6
+ var DEG_TO_RAD = Math.PI / 180;
7
+ var RAD_TO_DEG = 180 / Math.PI;
8
+ function wrapAngle(a, half = "max") {
9
+ let r = a % TAU;
10
+ if (r > Math.PI) r -= TAU;
11
+ else if (r < -Math.PI) r += TAU;
12
+ if (r === Math.PI) return half === "min" ? -Math.PI : r;
13
+ if (r === -Math.PI) return half === "max" ? Math.PI : r;
14
+ return r;
15
+ }
16
+ function wrapPositive(a, period = TAU) {
17
+ return (a % period + period) % period;
18
+ }
3
19
 
4
20
  // src/paths/curvature.ts
5
21
  function cubicDerivativeAt(p0, p1, p2, p3, t) {
@@ -238,10 +254,8 @@ function eulerCubicError(seg, c1, c2) {
238
254
 
239
255
  // src/paths/spiro.ts
240
256
  var SPIRO_KINDS = ["smooth", "g4", "corner", "left", "right"];
241
- var TAU = Math.PI * 2;
242
- var wrap = (a) => a - TAU * Math.round(a / TAU);
257
+ var wrap = (a) => wrapAngle(a, "min");
243
258
  var angleOf = (p, q) => Math.atan2(q.y - p.y, q.x - p.x);
244
- var distance = (p, q) => Math.hypot(q.x - p.x, q.y - p.y);
245
259
  function isSpiroKind(kind) {
246
260
  return SPIRO_KINDS.includes(kind);
247
261
  }
@@ -528,6 +542,6 @@ function spiroContoursFromControl(control, before, fallback = "smooth") {
528
542
  }));
529
543
  }
530
544
 
531
- export { SPIRO_KINDS, combTeeth, cubicCurvatureAt, cubicCurvatureSource, cubicDerivativeAt, curvatureComb, eulerAngleAt, eulerCubicError, eulerCurvatureAt, eulerCurvatureDerivativesAt, eulerPointAt, eulerSegmentCubic, fitEulerSegment, integrateEuler, isSpiroKind, placeEulerSegment, solveSpiro, spiroContoursFromControl, spiroContoursOf, spiroControlPath, spiroToPath };
532
- //# sourceMappingURL=chunk-HNLJO3E7.js.map
533
- //# sourceMappingURL=chunk-HNLJO3E7.js.map
545
+ export { DEG_TO_RAD, RAD_TO_DEG, SPIRO_KINDS, combTeeth, cubicCurvatureAt, cubicCurvatureSource, cubicDerivativeAt, curvatureComb, eulerAngleAt, eulerCubicError, eulerCurvatureAt, eulerCurvatureDerivativesAt, eulerPointAt, eulerSegmentCubic, fitEulerSegment, integrateEuler, isSpiroKind, placeEulerSegment, solveSpiro, spiroContoursFromControl, spiroContoursOf, spiroControlPath, spiroToPath, wrapAngle, wrapPositive };
546
+ //# sourceMappingURL=chunk-MOCSUHEI.js.map
547
+ //# sourceMappingURL=chunk-MOCSUHEI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/angle.ts","../src/paths/curvature.ts","../src/paths/eulerSpiral.ts","../src/paths/spiro.ts","../src/paths/spiroPath.ts"],"names":[],"mappings":"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","file":"chunk-MOCSUHEI.js","sourcesContent":["/** Angle units and wrapping: one definition of each, so callers agree on where a half turn lands. */\n\nconst TAU = Math.PI * 2;\n\n/** Multiply degrees by this to get radians. */\nexport const DEG_TO_RAD = Math.PI / 180;\n\n/** Multiply radians by this to get degrees. */\nexport const RAD_TO_DEG = 180 / Math.PI;\n\n/**\n * Where {@link wrapAngle} puts a half turn, the one angle with two names:\n * `'max'` at `π`, `'min'` at `-π`, and `'sign'` at whichever of the two has\n * the input's sign, so `-3π` stays a turn the negative way.\n */\nexport type HalfTurn = 'max' | 'min' | 'sign';\n\n/**\n * `a` radians as the turn of at most half a circle that reaches it, in\n * `(-π, π]` by default. `half` picks the closed end (see {@link HalfTurn}).\n * `NaN` and infinities give `NaN`.\n */\nexport function wrapAngle(a: number, half: HalfTurn = 'max'): number {\n let r = a % TAU;\n if (r > Math.PI) r -= TAU;\n else if (r < -Math.PI) r += TAU;\n if (r === Math.PI) return half === 'min' ? -Math.PI : r;\n if (r === -Math.PI) return half === 'max' ? Math.PI : r;\n return r;\n}\n\n/**\n * `a` in `[0, period)`: radians by default, `wrapPositive(deg, 360)` for\n * degrees. Never returns `period` itself, however close to zero a negative\n * `a` is. `NaN` and infinities give `NaN`.\n */\nexport function wrapPositive(a: number, period: number = TAU): number {\n return ((a % period) + period) % period;\n}\n","import type { AnchorSet } from './anchorEdits';\nimport { isStraightSegment, segmentEnds } from './anchors';\nimport { cubicPointAt, type Point } from './cubicMath';\n\n/** First derivative of the cubic Bezier (p0, p1, p2, p3) at t. */\nexport function cubicDerivativeAt(p0: Point, p1: Point, p2: Point, p3: Point, t: number): Point {\n const u = 1 - t;\n return {\n x: 3 * u * u * (p1.x - p0.x) + 6 * u * t * (p2.x - p1.x) + 3 * t * t * (p3.x - p2.x),\n y: 3 * u * u * (p1.y - p0.y) + 6 * u * t * (p2.y - p1.y) + 3 * t * t * (p3.y - p2.y),\n };\n}\n\nfunction cubicSecondDerivativeAt(p0: Point, p1: Point, p2: Point, p3: Point, t: number): Point {\n const u = 1 - t;\n return {\n x: 6 * u * (p2.x - 2 * p1.x + p0.x) + 6 * t * (p3.x - 2 * p2.x + p1.x),\n y: 6 * u * (p2.y - 2 * p1.y + p0.y) + 6 * t * (p3.y - 2 * p2.y + p1.y),\n };\n}\n\n/**\n * Signed curvature of the cubic Bezier (p0, p1, p2, p3) at t: one over the\n * radius of the circle that fits the curve there. Positive where the curve\n * turns toward its left normal `(-dy, dx)`, negative where it turns away, so\n * the sign flips at an inflection. 0 where the curve has no direction at t, as\n * at an end whose handle sits on its anchor.\n */\nexport function cubicCurvatureAt(p0: Point, p1: Point, p2: Point, p3: Point, t: number): number {\n const d1 = cubicDerivativeAt(p0, p1, p2, p3, t);\n const d2 = cubicSecondDerivativeAt(p0, p1, p2, p3, t);\n const den = Math.pow(d1.x * d1.x + d1.y * d1.y, 1.5);\n if (den < 1e-12) return 0;\n return (d1.x * d2.y - d1.y * d2.x) / den;\n}\n\n/** One tooth of a curvature comb: a point on the curve and the tip of the\n * tooth standing on it. */\nexport interface CombTooth {\n /** The point on the curve. */\n x: number;\n y: number;\n /** The tooth's tip: off the curve along its normal, on the outside of the\n * bend, by the curvature times the comb's scale. */\n tipX: number;\n tipY: number;\n /** Signed curvature at the point, as {@link cubicCurvatureAt} gives it. */\n curvature: number;\n}\n\n/** The comb of one curved segment, which runs from anchor `segIdx` of\n * subpath `sub` to the next. */\nexport interface SegmentComb {\n sub: number;\n segIdx: number;\n /** Evenly spaced in t, ends included. */\n teeth: CombTooth[];\n}\n\n/** Options for {@link curvatureComb} and {@link combTeeth}. */\nexport interface CurvatureCombOptions {\n /** Tooth length per unit of curvature. A tooth over a stretch of radius r is\n * `scale / r` long, in the curve's own units. */\n scale: number;\n /** Teeth per segment for {@link curvatureComb}, or along the whole source\n * for {@link combTeeth}; ends included. Default 24; at least 2. */\n samplesPerSegment?: number;\n}\n\n/**\n * A curve parameterized over t in [0, 1], as a curvature comb reads it. Any\n * curve can stand a comb this way, whether or not it is a path.\n */\nexport interface CurvatureSource {\n /** The point on the curve at t. */\n pointAt(t: number): Point;\n /** A vector along the direction of travel at t. Only its direction is read;\n * a zero vector means the curve has no direction there. */\n tangentAt(t: number): Point;\n /** Signed curvature at t, positive where the curve turns toward its left\n * normal `(-dy, dx)`, as {@link cubicCurvatureAt} gives it. */\n curvatureAt(t: number): number;\n}\n\n/** How far in from an end a tooth moves when the curve has no direction at\n * the end itself, so it reports the curvature the end is approached with. */\nconst END_NUDGE = 1e-3;\n\nfunction sampleCount(opts: CurvatureCombOptions): number {\n return Math.max(2, Math.round(opts.samplesPerSegment ?? 24));\n}\n\n/**\n * The teeth of a curvature comb along `source`, evenly spaced in t with both\n * ends included. Each stands out of the curve along its normal, on the outside\n * of the bend, `scale` times the curvature long.\n */\nexport function combTeeth(source: CurvatureSource, opts: CurvatureCombOptions): CombTooth[] {\n const samples = sampleCount(opts);\n const teeth: CombTooth[] = [];\n for (let i = 0; i < samples; i++) teeth.push(toothAt(source, i / (samples - 1), opts.scale));\n return teeth;\n}\n\n/** The cubic Bezier (p0, p1, p2, p3) as a {@link CurvatureSource}. */\nexport function cubicCurvatureSource(p0: Point, p1: Point, p2: Point, p3: Point): CurvatureSource {\n return {\n pointAt: (t) => cubicPointAt(p0, p1, p2, p3, t),\n tangentAt: (t) => cubicDerivativeAt(p0, p1, p2, p3, t),\n curvatureAt: (t) => cubicCurvatureAt(p0, p1, p2, p3, t),\n };\n}\n\n/**\n * Curvature combs for every curved segment of `set`: teeth that stand out of\n * the curve, each as long as the curvature where it stands. Joining their tips\n * draws how the bend changes along the path. A tooth that jumps in length at\n * an anchor shows a curvature break there; teeth that change side show an\n * inflection. Straight segments have no curvature, and no comb.\n */\nexport function curvatureComb(set: AnchorSet, opts: CurvatureCombOptions): SegmentComb[] {\n const out: SegmentComb[] = [];\n for (let sub = 0; sub < set.anchors.length; sub++) {\n const count = set.anchors[sub].length - (set.closed[sub] ? 0 : 1);\n for (let segIdx = 0; segIdx < count; segIdx++) {\n const ends = segmentEnds(set.anchors, set.closed, sub, segIdx);\n if (!ends || isStraightSegment(ends.a, ends.b)) continue;\n const { a, b } = ends;\n const source = cubicCurvatureSource(a, a.outHandle ?? a, b.inHandle ?? b, b);\n out.push({ sub, segIdx, teeth: combTeeth(source, opts) });\n }\n }\n return out;\n}\n\nfunction toothAt(source: CurvatureSource, t: number, scale: number): CombTooth {\n const at = source.pointAt(t);\n let d = source.tangentAt(t);\n let k = source.curvatureAt(t);\n if (Math.hypot(d.x, d.y) < 1e-9) {\n const inner = t < 0.5 ? t + END_NUDGE : t - END_NUDGE;\n d = source.tangentAt(inner);\n k = source.curvatureAt(inner);\n }\n const len = Math.hypot(d.x, d.y);\n if (len < 1e-12) return { x: at.x, y: at.y, tipX: at.x, tipY: at.y, curvature: 0 };\n // The bend's center lies along the left normal times 1/k, so the tooth goes\n // the other way: outside the bend on either side of an inflection.\n const nx = -d.y / len;\n const ny = d.x / len;\n return { x: at.x, y: at.y, tipX: at.x - nx * k * scale, tipY: at.y - ny * k * scale, curvature: k };\n}\n","/**\n * One spiral segment, fitted between two points so it leaves the first and\n * reaches the second at given angles to the chord. `solveSpiro` joins these\n * into a curvature-continuous spline.\n *\n * In its normalized frame the segment has unit arc length and, with\n * `u = s − ½`, tangent angle `φ = k0·u + (k1/2)·u² + (k2/6)·u³ + (k3/24)·u⁴`,\n * so its curvature is `k0 + k1·u + (k2/2)·u² + (k3/6)·u³`. An Euler spiral has\n * `k2 = k3 = 0`: its curvature changes linearly along it. A cubic-curvature\n * segment uses all four, which is what lets a G4 point keep the curvature's\n * first two derivatives continuous as well.\n */\nimport type { Point } from './cubicMath';\n\n/** The shape of a fitted segment, in its normalized frame. */\nexport interface EulerFit {\n k0: number;\n k1: number;\n /** Zero on an Euler spiral; set on a cubic-curvature segment. */\n k2: number;\n k3: number;\n /** Chord over arc length: the normalized segment's chord length. */\n ratio: number;\n /** The normalized chord's angle, which the world chord is rotated onto. */\n chordAngle: number;\n}\n\n/** Steps of the Simpson rule that integrates a segment's tangent. Even. */\nconst STEPS = 48;\n/** A chord-relative angle past this has no sensible spiral. */\nconst MAX_ANGLE = Math.PI * 0.95;\n\nconst clampAngle = (a: number): number => Math.max(-MAX_ANGLE, Math.min(MAX_ANGLE, a));\n\n/** `∫₀^upTo e^{iφ(s)} ds` for the normalized segment `(k0, k1, k2, k3)`. */\nexport function integrateEuler(k0: number, k1: number, upTo = 1, k2 = 0, k3 = 0): Point {\n const n = Math.max(2, Math.ceil((STEPS * upTo) / 2) * 2);\n const h = upTo / n;\n let x = 0;\n let y = 0;\n for (let i = 0; i <= n; i++) {\n const u = i * h - 0.5;\n const phi = k0 * u + u * u * (k1 / 2 + u * (k2 / 6 + (u * k3) / 24));\n const w = i === 0 || i === n ? 1 : i % 2 === 1 ? 4 : 2;\n x += w * Math.cos(phi);\n y += w * Math.sin(phi);\n }\n return { x: (x * h) / 3, y: (y * h) / 3 };\n}\n\n/** How far the start angle of `(k0, k1, k2, k3)` is from `th0`. */\nfunction startError(k0: number, k1: number, k2: number, k3: number, th0: number): number {\n const c = integrateEuler(k0, k1, 1, k2, k3);\n return -k0 / 2 + k1 / 8 - k2 / 48 + k3 / 384 - Math.atan2(c.y, c.x) - th0;\n}\n\n/**\n * The spiral leaving its chord at angle `th0` and reaching the far end at\n * angle `th1`, both measured from the chord, counterclockwise positive. With\n * `k2` and `k3` left at zero it is an Euler spiral; given, they are the\n * cubic-curvature segment's higher terms, and `k0` and `k1` are fitted around them.\n */\nexport function fitEulerSegment(th0: number, th1: number, k2 = 0, k3 = 0): EulerFit {\n const t0 = clampAngle(th0);\n const t1 = clampAngle(th1);\n // The odd terms set the total turn; the even ones bow the segment.\n const k0 = t1 - t0 - k2 / 24;\n // The small-angle solution, then Newton on the one remaining unknown.\n let k1 = 6 * (t0 + t1) - k3 / 40;\n for (let iter = 0; iter < 12; iter++) {\n const e = startError(k0, k1, k2, k3, t0);\n if (Math.abs(e) < 1e-12) break;\n const d = (startError(k0, k1 + 1e-6, k2, k3, t0) - e) / 1e-6;\n if (!Number.isFinite(d) || Math.abs(d) < 1e-12) break;\n k1 -= e / d;\n }\n const c = integrateEuler(k0, k1, 1, k2, k3);\n return { k0, k1, k2, k3, ratio: Math.hypot(c.x, c.y), chordAngle: Math.atan2(c.y, c.x) };\n}\n\n/** A fitted segment placed between two world points. */\nexport interface EulerSegment extends EulerFit {\n p0: Point;\n p1: Point;\n /** World arc length. */\n length: number;\n /** The world angle the normalized frame is turned by. */\n rotation: number;\n}\n\n/** `fit` placed so it runs from `p0` to `p1`. */\nexport function placeEulerSegment(fit: EulerFit, p0: Point, p1: Point): EulerSegment {\n const chord = Math.hypot(p1.x - p0.x, p1.y - p0.y);\n const length = fit.ratio > 1e-9 ? chord / fit.ratio : chord;\n const rotation = Math.atan2(p1.y - p0.y, p1.x - p0.x) - fit.chordAngle;\n return { ...fit, p0, p1, length, rotation };\n}\n\n/** The point at fraction `s` of the arc length along `seg`. */\nexport function eulerPointAt(seg: EulerSegment, s: number): Point {\n const c = integrateEuler(seg.k0, seg.k1, s, seg.k2, seg.k3);\n const cos = Math.cos(seg.rotation);\n const sin = Math.sin(seg.rotation);\n return {\n x: seg.p0.x + seg.length * (c.x * cos - c.y * sin),\n y: seg.p0.y + seg.length * (c.x * sin + c.y * cos),\n };\n}\n\n/** World tangent angle at fraction `s` of `seg`'s arc length. */\nexport function eulerAngleAt(seg: EulerSegment, s: number): number {\n const u = s - 0.5;\n return seg.rotation + seg.k0 * u + u * u * (seg.k1 / 2 + u * (seg.k2 / 6 + (u * seg.k3) / 24));\n}\n\n/** Normalized curvature at `u = s − ½`. */\nconst bendAt = (f: EulerFit, u: number): number => f.k0 + u * (f.k1 + u * (f.k2 / 2 + (u * f.k3) / 6));\n\n/** Signed world curvature at fraction `s` of `seg`'s arc length;\n * positive turns counterclockwise. */\nexport function eulerCurvatureAt(seg: EulerSegment, s: number): number {\n if (seg.length < 1e-12) return 0;\n return bendAt(seg, s - 0.5) / seg.length;\n}\n\n/** The first and second derivatives of `seg`'s world curvature with respect\n * to world arc length, at fraction `s` of it. */\nexport function eulerCurvatureDerivativesAt(seg: EulerSegment, s: number): [number, number] {\n if (seg.length < 1e-12) return [0, 0];\n const u = s - 0.5;\n return [\n (seg.k1 + u * (seg.k2 + (u * seg.k3) / 2)) / seg.length ** 2,\n (seg.k2 + u * seg.k3) / seg.length ** 3,\n ];\n}\n\nconst SAMPLES = 16;\n\n/** Handle lengths `[a, b]` along `u0`, `u1` that best fit `samples` at the\n * cubic parameters `ts`, by least squares. Null when the fit degenerates. */\nfunction fitHandleLengths(\n p0: Point, p1: Point, u0: Point, u1: Point, samples: readonly Point[], ts: readonly number[],\n): [number, number] | null {\n // B(t) = base(t) + a·3(1−t)²t·u0 − b·3(1−t)t²·u1, linear in a and b.\n let m00 = 0, m01 = 0, m11 = 0, r0 = 0, r1 = 0;\n samples.forEach((q, i) => {\n const t = ts[i];\n const mt = 1 - t;\n const b0 = mt * mt * mt + 3 * mt * mt * t;\n const b3 = 3 * mt * t * t + t * t * t;\n const ex = q.x - (b0 * p0.x + b3 * p1.x);\n const ey = q.y - (b0 * p0.y + b3 * p1.y);\n const f1 = 3 * mt * mt * t;\n const f2 = 3 * mt * t * t;\n const ax = f1 * u0.x, ay = f1 * u0.y;\n const bx = -f2 * u1.x, by = -f2 * u1.y;\n m00 += ax * ax + ay * ay;\n m01 += ax * bx + ay * by;\n m11 += bx * bx + by * by;\n r0 += ax * ex + ay * ey;\n r1 += bx * ex + by * ey;\n });\n const det = m00 * m11 - m01 * m01;\n if (Math.abs(det) < 1e-12) return null;\n const a = (r0 * m11 - r1 * m01) / det;\n const b = (m00 * r1 - m01 * r0) / det;\n return a > 0 && b > 0 && Number.isFinite(a) && Number.isFinite(b) ? [a, b] : null;\n}\n\n/** One Newton step moving `t` toward the point of the cubic nearest `q`. */\nfunction nearerT(p: readonly Point[], q: Point, t: number): number {\n const mt = 1 - t;\n const at = (c0: number, c1: number, c2: number, c3: number) =>\n mt * mt * mt * c0 + 3 * mt * mt * t * c1 + 3 * mt * t * t * c2 + t * t * t * c3;\n const d1 = (c0: number, c1: number, c2: number, c3: number) =>\n 3 * (mt * mt * (c1 - c0) + 2 * mt * t * (c2 - c1) + t * t * (c3 - c2));\n const d2 = (c0: number, c1: number, c2: number, c3: number) =>\n 6 * (mt * (c2 - 2 * c1 + c0) + t * (c3 - 2 * c2 + c1));\n const ex = at(p[0].x, p[1].x, p[2].x, p[3].x) - q.x;\n const ey = at(p[0].y, p[1].y, p[2].y, p[3].y) - q.y;\n const dx = d1(p[0].x, p[1].x, p[2].x, p[3].x);\n const dy = d1(p[0].y, p[1].y, p[2].y, p[3].y);\n const ddx = d2(p[0].x, p[1].x, p[2].x, p[3].x);\n const ddy = d2(p[0].y, p[1].y, p[2].y, p[3].y);\n const den = dx * dx + dy * dy + ex * ddx + ey * ddy;\n if (Math.abs(den) < 1e-12) return t;\n return Math.min(1, Math.max(0, t - (ex * dx + ey * dy) / den));\n}\n\n/**\n * The two control points of a cubic that follows `seg`: each handle lies on\n * the spiral's tangent at its end, with lengths fitted to points sampled along\n * the spiral by least squares, re-pairing each sample with its nearest cubic\n * parameter between rounds.\n */\nexport function eulerSegmentCubic(seg: EulerSegment): { c1: Point; c2: Point } {\n const { p0, p1 } = seg;\n const a0 = eulerAngleAt(seg, 0);\n const a1 = eulerAngleAt(seg, 1);\n const u0 = { x: Math.cos(a0), y: Math.sin(a0) };\n const u1 = { x: Math.cos(a1), y: Math.sin(a1) };\n const samples: Point[] = [];\n const ts: number[] = [];\n for (let i = 1; i < SAMPLES; i++) {\n samples.push(eulerPointAt(seg, i / SAMPLES));\n ts.push(i / SAMPLES);\n }\n const chord = Math.hypot(p1.x - p0.x, p1.y - p0.y);\n let lengths: [number, number] = [chord / 3, chord / 3];\n const handles = ([a, b]: [number, number]) => ({\n c1: { x: p0.x + a * u0.x, y: p0.y + a * u0.y },\n c2: { x: p1.x - b * u1.x, y: p1.y - b * u1.y },\n });\n for (let round = 0; round < 4; round++) {\n const fit = fitHandleLengths(p0, p1, u0, u1, samples, ts);\n if (!fit) break;\n lengths = fit;\n const { c1, c2 } = handles(lengths);\n const ctrl = [p0, c1, c2, p1];\n samples.forEach((q, i) => { ts[i] = nearerT(ctrl, q, ts[i]); });\n }\n return handles(lengths);\n}\n\n/** The stretch of `seg` from fraction `s0` to `s1` of its arc length, as a\n * segment of its own: a piece of an Euler spiral is one. */\nexport function subEulerSegment(seg: EulerSegment, s0: number, s1: number): EulerSegment {\n const d = s1 - s0;\n const m = (s0 + s1) / 2 - 0.5;\n // The curvature polynomial re-centered on the piece and scaled to its length.\n const k0 = bendAt(seg, m) * d;\n const k1 = (seg.k1 + m * (seg.k2 + (m * seg.k3) / 2)) * d ** 2;\n const k2 = (seg.k2 + m * seg.k3) * d ** 3;\n const k3 = seg.k3 * d ** 4;\n const c = integrateEuler(k0, k1, 1, k2, k3);\n const fit: EulerFit = { k0, k1, k2, k3, ratio: Math.hypot(c.x, c.y), chordAngle: Math.atan2(c.y, c.x) };\n return placeEulerSegment(fit, eulerPointAt(seg, s0), eulerPointAt(seg, s1));\n}\n\n/** How far the cubic `(seg.p0, c1, c2, seg.p1)` strays from `seg`, measured\n * at a few points along the spiral. */\nexport function eulerCubicError(seg: EulerSegment, c1: Point, c2: Point): number {\n const ctrl = [seg.p0, c1, c2, seg.p1];\n let worst = 0;\n for (const s of [0.2, 0.4, 0.5, 0.6, 0.8]) {\n const q = eulerPointAt(seg, s);\n let t = s;\n for (let i = 0; i < 4; i++) t = nearerT(ctrl, q, t);\n const mt = 1 - t;\n const x = mt * mt * mt * seg.p0.x + 3 * mt * mt * t * c1.x + 3 * mt * t * t * c2.x + t * t * t * seg.p1.x;\n const y = mt * mt * mt * seg.p0.y + 3 * mt * mt * t * c1.y + 3 * mt * t * t * c2.y + t * t * t * seg.p1.y;\n worst = Math.max(worst, Math.hypot(x - q.x, y - q.y));\n }\n return worst;\n}\n","/**\n * Spiro curves: a spline defined by on-curve points alone. Between each pair\n * of neighboring points runs an Euler-spiral segment (`eulerSpiral`), and the\n * segments are solved together so that, at every smooth point, both the\n * tangent and the curvature carry straight through. The curve has no handles\n * to tune; moving a point re-solves the whole curve.\n *\n * Each point's kind says what holds at it:\n *\n * | kind | at the point |\n * |---|---|\n * | `smooth` | tangent and curvature continue (G2); next to a straight segment, the curve leaves along the line |\n * | `g4` | tangent, curvature, and the curvature's first two derivatives continue (G4); otherwise as `smooth` |\n * | `corner` | the two sides are independent; each meets the point with zero curvature |\n * | `left` | the segment arriving is straight, and the curve leaving continues the line |\n * | `right` | the segment leaving is straight, and the curve arriving runs into the line |\n *\n * The ends of an open curve meet their points with zero curvature, as a\n * corner's sides do.\n *\n * A segment with a `g4` point at either end is a cubic-curvature segment,\n * with two more unknowns than an Euler spiral's two end tangents. A `g4`\n * point between two curved segments pays for its side's two with its two\n * extra equations; anywhere else, such a segment's curvature stops bending\n * at that end (its second derivative is zero there).\n */\nimport { wrapAngle } from '../angle';\nimport type { Point } from './cubicMath';\nimport {\n eulerAngleAt, eulerCurvatureAt, eulerCurvatureDerivativesAt, fitEulerSegment, placeEulerSegment,\n type EulerSegment,\n} from './eulerSpiral';\nimport { distance } from '../points2';\n\n/** What holds at a spiro point; see the table at the top of `spiro.ts`. */\nexport type SpiroKind = 'smooth' | 'g4' | 'corner' | 'left' | 'right';\n\n/** Every {@link SpiroKind}, in the order a picker lists them. */\nexport const SPIRO_KINDS: readonly SpiroKind[] = ['smooth', 'g4', 'corner', 'left', 'right'];\n\n/** One on-curve point of a spiro curve. */\nexport interface SpiroPoint {\n x: number;\n y: number;\n kind: SpiroKind;\n}\n\n/** One solved segment of a spiro curve: a straight line, or a placed Euler\n * spiral (`spiral`) between the two points. */\nexport interface SpiroSegment {\n from: Point;\n to: Point;\n spiral: EulerSegment | null;\n}\n\ntype Side = { kind: 'none' } | { kind: 'line'; angle: number } | { kind: 'curve'; seg: number };\n\nconst wrap = (a: number): number => wrapAngle(a, 'min');\nconst angleOf = (p: Point, q: Point): number => Math.atan2(q.y - p.y, q.x - p.x);\n\n/** Whether `kind` is one of the {@link SpiroKind}s. */\nexport function isSpiroKind(kind: unknown): kind is SpiroKind {\n return SPIRO_KINDS.includes(kind as SpiroKind);\n}\n\ninterface System {\n points: readonly SpiroPoint[];\n /** Segment `i` runs from point `i` to point `ends[i]`. */\n ends: number[];\n straight: boolean[];\n /** The first unknown slot of each curved segment (start tangent, end\n * tangent, then a cubic-curvature segment's two higher terms), or -1. */\n slot: number[];\n /** Whether each segment is a cubic-curvature one. */\n cubic: boolean[];\n unknowns: number;\n}\n\nfunction buildSystem(points: readonly SpiroPoint[], closed: boolean): System {\n const n = points.length;\n const count = closed ? n : n - 1;\n const ends: number[] = [];\n const straight: boolean[] = [];\n const slot: number[] = [];\n const cubic: boolean[] = [];\n let unknowns = 0;\n for (let i = 0; i < count; i++) {\n const j = (i + 1) % n;\n ends.push(j);\n const line = points[i].kind === 'right' || points[j].kind === 'left'\n || distance(points[i], points[j]) < 1e-9;\n straight.push(line);\n slot.push(line ? -1 : unknowns);\n const higher = !line && (points[i].kind === 'g4' || points[j].kind === 'g4');\n cubic.push(higher);\n if (!line) unknowns += higher ? 4 : 2;\n }\n return { points, ends, straight, slot, cubic, unknowns };\n}\n\nfunction sides(sys: System, closed: boolean, i: number): [Side, Side] {\n const n = sys.points.length;\n const count = sys.ends.length;\n const side = (seg: number): Side => {\n if (seg < 0 || seg >= count) return { kind: 'none' };\n if (sys.straight[seg]) return { kind: 'line', angle: angleOf(sys.points[seg], sys.points[sys.ends[seg]]) };\n return { kind: 'curve', seg };\n };\n const into = i > 0 ? i - 1 : closed ? n - 1 : -1;\n const outOf = closed || i < n - 1 ? i : -1;\n return [side(into), side(outOf)];\n}\n\ninterface Fitted { seg: EulerSegment; chord: number; startAngle: number; endAngle: number; cubic: boolean }\n\nfunction fitSegment(sys: System, s: number, x: readonly number[]): Fitted {\n const p0 = sys.points[s];\n const p1 = sys.points[sys.ends[s]];\n const chord = angleOf(p0, p1);\n const k = sys.slot[s];\n const fit = sys.cubic[s]\n ? fitEulerSegment(wrap(x[k] - chord), wrap(x[k + 1] - chord), x[k + 2], x[k + 3])\n : fitEulerSegment(wrap(x[k] - chord), wrap(x[k + 1] - chord));\n const seg = placeEulerSegment(fit, p0, p1);\n const startAngle = eulerAngleAt(seg, 0);\n return { seg, chord: distance(p0, p1), startAngle, endAngle: eulerAngleAt(seg, 1), cubic: sys.cubic[s] };\n}\n\n/** Curvature at one end of `f`, times its chord so every equation is on one scale. */\nconst bend = (f: Fitted, at: 0 | 1): number => eulerCurvatureAt(f.seg, at) * f.chord;\n\n/** The second derivative of curvature at one end of `f`, on the same scale. */\nconst twist = (f: Fitted, at: 0 | 1): number => eulerCurvatureDerivativesAt(f.seg, at)[1] * f.chord ** 3;\n\n/** Angle, curvature, and the curvature's first two derivatives matched where\n * `fa` ends and `fb` begins. */\nfunction g4Join(fa: Fitted, fb: Fitted): number[] {\n const scale = (fa.chord + fb.chord) / 2;\n const [a1, a2] = eulerCurvatureDerivativesAt(fa.seg, 1);\n const [b1, b2] = eulerCurvatureDerivativesAt(fb.seg, 0);\n return [\n wrap(fa.endAngle - fb.startAngle),\n (eulerCurvatureAt(fa.seg, 1) - eulerCurvatureAt(fb.seg, 0)) * scale,\n (a1 - b1) * scale ** 2,\n (a2 - b2) * scale ** 3,\n ];\n}\n\nfunction residuals(sys: System, closed: boolean, fits: readonly Fitted[]): number[] {\n const out: number[] = [];\n const fitOf = (side: Side): Fitted => fits[(side as { seg: number }).seg];\n for (let i = 0; i < sys.points.length; i++) {\n const [a, b] = sides(sys, closed, i);\n const kind = sys.points[i].kind;\n const ac = a.kind === 'curve';\n const bc = b.kind === 'curve';\n if (!ac && !bc) continue;\n if (kind === 'g4' && ac && bc) {\n out.push(...g4Join(fitOf(a), fitOf(b)));\n continue;\n }\n if (kind === 'smooth' && ac && bc) {\n const fa = fitOf(a), fb = fitOf(b);\n out.push(...g4Join(fa, fb).slice(0, 2));\n if (fa.cubic) out.push(twist(fa, 1));\n if (fb.cubic) out.push(twist(fb, 0));\n continue;\n }\n // One curved side from here on, or a corner's two independent ones.\n for (const [side, other, at] of [[a, b, 1], [b, a, 0]] as const) {\n if (side.kind !== 'curve') continue;\n const f = fitOf(side);\n const angle = at === 1 ? f.endAngle : f.startAngle;\n const followsLine = other.kind === 'line' && kind !== 'corner';\n out.push(followsLine ? wrap(angle - other.angle) : bend(f, at));\n if (f.cubic) out.push(twist(f, at));\n }\n }\n return out;\n}\n\n/** A starting tangent at each point: along the bisector of its two chords. */\nfunction initialGuess(sys: System, closed: boolean): number[] {\n const x = new Array<number>(sys.unknowns).fill(0);\n const n = sys.points.length;\n const tangentAt = (i: number, seg: number): number => {\n const chord = angleOf(sys.points[seg], sys.points[sys.ends[seg]]);\n const [a, b] = sides(sys, closed, i);\n if (sys.points[i].kind === 'corner' || a.kind === 'none' || b.kind === 'none') return chord;\n if (a.kind === 'line') return a.angle;\n if (b.kind === 'line') return b.angle;\n const prev = sys.points[(i - 1 + n) % n];\n const next = sys.points[(i + 1) % n];\n const pin = angleOf(prev, sys.points[i]);\n const pout = angleOf(sys.points[i], next);\n return pin + wrap(pout - pin) / 2;\n };\n for (let s = 0; s < sys.ends.length; s++) {\n const k = sys.slot[s];\n if (k < 0) continue;\n x[k] = tangentAt(s, s);\n x[k + 1] = tangentAt(sys.ends[s], s);\n }\n return x;\n}\n\n/** Solve `m · d = r` in place by Gaussian elimination with partial pivoting. */\nfunction solveLinear(m: number[][], r: number[]): number[] | null {\n const n = r.length;\n for (let c = 0; c < n; c++) {\n let p = c;\n for (let i = c + 1; i < n; i++) if (Math.abs(m[i][c]) > Math.abs(m[p][c])) p = i;\n if (Math.abs(m[p][c]) < 1e-14) return null;\n [m[c], m[p]] = [m[p], m[c]];\n [r[c], r[p]] = [r[p], r[c]];\n for (let i = c + 1; i < n; i++) {\n const f = m[i][c] / m[c][c];\n if (f === 0) continue;\n for (let j = c; j < n; j++) m[i][j] -= f * m[c][j];\n r[i] -= f * r[c];\n }\n }\n const out = new Array<number>(n).fill(0);\n for (let i = n - 1; i >= 0; i--) {\n let v = r[i];\n for (let j = i + 1; j < n; j++) v -= m[i][j] * out[j];\n out[i] = v / m[i][i];\n }\n return out;\n}\n\nconst norm = (v: readonly number[]): number => Math.sqrt(v.reduce((s, e) => s + e * e, 0));\n\n/**\n * Solve the spiro curve through `points`. A closed curve has a segment from\n * the last point back to the first. Fewer than two points make no segments.\n */\nexport function solveSpiro(points: readonly SpiroPoint[], closed: boolean): SpiroSegment[] {\n if (points.length < 2) return [];\n const sys = buildSystem(points, closed && points.length > 2);\n const isClosed = closed && points.length > 2;\n let x = initialGuess(sys, isClosed);\n const fitAll = (v: readonly number[]): Fitted[] =>\n sys.ends.map((_, s) => (sys.slot[s] < 0 ? (null as unknown as Fitted) : fitSegment(sys, s, v)));\n let fits = fitAll(x);\n let r = residuals(sys, isClosed, fits);\n for (let iter = 0; iter < 40 && sys.unknowns > 0; iter++) {\n const err = norm(r);\n if (err < 1e-10) break;\n // Each unknown moves only its own segment, so a column refits one segment.\n const jac = r.map(() => new Array<number>(sys.unknowns).fill(0));\n for (let s = 0; s < sys.ends.length; s++) {\n const k = sys.slot[s];\n if (k < 0) continue;\n for (let u = k; u < k + (sys.cubic[s] ? 4 : 2); u++) {\n const h = 1e-6;\n const xs = x.slice();\n xs[u] += h;\n const moved = fits.slice();\n moved[s] = fitSegment(sys, s, xs);\n const rs = residuals(sys, isClosed, moved);\n for (let e = 0; e < r.length; e++) jac[e][u] = (rs[e] - r[e]) / h;\n }\n }\n const step = solveLinear(jac, r.map((v) => -v));\n if (!step) break;\n // Halve the step until it lowers the error.\n let t = 1;\n let accepted = false;\n for (let tries = 0; tries < 12; tries++, t /= 2) {\n const xt = x.map((v, i) => v + t * step[i]);\n const ft = fitAll(xt);\n const rt = residuals(sys, isClosed, ft);\n if (norm(rt) < err) {\n x = xt; fits = ft; r = rt; accepted = true;\n break;\n }\n }\n if (!accepted) break;\n }\n return sys.ends.map((end, s) => ({\n from: { x: points[s].x, y: points[s].y },\n to: { x: points[end].x, y: points[end].y },\n spiral: sys.slot[s] < 0 ? null : fits[s].seg,\n }));\n}\n","/**\n * Spiro curves as cubic paths, and back. A solved curve is written as cubics,\n * each spiral segment split into as many as it takes to stay within tolerance,\n * so most anchors of the path are not spiro points. `at` records which are:\n * `at[i]` is the flat anchor index of point `i`, counted across subpaths. The\n * points are then read back out of the path itself, so whatever moves the path\n * — a move, a resize, a rotation — moves them with it.\n */\nimport type { PolygonPath } from '../path';\nimport { anchorsToPath, pathToAnchors, type PenAnchor } from './anchors';\nimport { eulerCubicError, eulerSegmentCubic, subEulerSegment, type EulerSegment } from './eulerSpiral';\nimport { solveSpiro, type SpiroKind, type SpiroPoint } from './spiro';\n\n/** One subpath of a spiro curve: its points, and whether it closes. */\nexport interface SpiroContour {\n points: SpiroPoint[];\n closed: boolean;\n}\n\n/** A spiro curve written as a cubic path, with the anchor each point became. */\nexport interface SpiroPath {\n path: PolygonPath;\n /** The flat anchor index of each point, in contour order. */\n at: number[];\n}\n\n/** Options for {@link spiroToPath}. */\nexport interface SpiroToPathOptions {\n /** The furthest a cubic may stray from its spiral, as a fraction of that\n * segment's arc length. Default `1e-4`. */\n tolerance?: number;\n /** The path being reshaped, whose fill rules the result keeps. */\n like?: PolygonPath;\n}\n\nconst MAX_PIECES = 16;\n\ninterface Piece { end: EulerSegment; c1: { x: number; y: number }; c2: { x: number; y: number } }\n\n/** `spiral` as the fewest equal pieces whose cubics all stay within `tol`. */\nfunction cubicPieces(spiral: EulerSegment, tol: number): Piece[] {\n let best: Piece[] = [];\n for (let m = 1; m <= MAX_PIECES; m++) {\n best = [];\n let fits = true;\n for (let j = 0; j < m; j++) {\n const piece = m === 1 ? spiral : subEulerSegment(spiral, j / m, (j + 1) / m);\n const { c1, c2 } = eulerSegmentCubic(piece);\n best.push({ end: piece, c1, c2 });\n if (eulerCubicError(piece, c1, c2) > tol * spiral.length) fits = false;\n }\n if (fits) break;\n }\n return best;\n}\n\nfunction contourAnchors(c: SpiroContour, tol: number): { anchors: PenAnchor[]; at: number[] } {\n const anchors: PenAnchor[] = [];\n const at: number[] = [];\n const segments = solveSpiro(c.points, c.closed);\n // The handle the last piece of a segment arrives with, for the point after it.\n let arriving: { x: number; y: number } | null = null;\n c.points.forEach((p, i) => {\n at.push(anchors.length);\n anchors.push({ x: p.x, y: p.y, ...(arriving ? { inHandle: arriving } : {}) });\n arriving = null;\n const spiral = segments[i]?.spiral;\n if (!spiral) return;\n const pieces = cubicPieces(spiral, tol);\n pieces.forEach((piece, j) => {\n anchors[anchors.length - 1].outHandle = { x: piece.c1.x, y: piece.c1.y };\n const c2 = { x: piece.c2.x, y: piece.c2.y };\n if (j < pieces.length - 1) anchors.push({ x: piece.end.p1.x, y: piece.end.p1.y, inHandle: c2 });\n else arriving = c2;\n });\n });\n if (arriving) anchors[0].inHandle = arriving;\n return { anchors, at };\n}\n\n/**\n * Solve each contour and write it as a cubic path. Straight segments carry no\n * handles.\n */\nexport function spiroToPath(contours: readonly SpiroContour[], options: SpiroToPathOptions = {}): SpiroPath {\n const tol = options.tolerance ?? 1e-4;\n const subs: PenAnchor[][] = [];\n const closed: boolean[] = [];\n const at: number[] = [];\n let base = 0;\n for (const c of contours) {\n if (c.points.length === 0) continue;\n const written = contourAnchors(c, tol);\n subs.push(written.anchors);\n closed.push(c.closed && c.points.length > 2);\n at.push(...written.at.map((i) => i + base));\n base += written.anchors.length;\n }\n return { path: anchorsToPath(subs, closed, options.like), at };\n}\n\n/**\n * The spiro points `path` holds, given the kind of each and the anchor each\n * became. Null when `kinds` and `at` do not describe `path`: the counts\n * differ, an index is out of order or out of range, or a subpath does not\n * start on a point.\n */\nexport function spiroContoursOf(\n path: PolygonPath,\n kinds: readonly SpiroKind[],\n at: readonly number[],\n): SpiroContour[] | null {\n if (kinds.length !== at.length || at.length === 0) return null;\n const { anchors, closed } = pathToAnchors(path);\n const contours: SpiroContour[] = [];\n let flat = 0;\n let k = 0;\n for (let s = 0; s < anchors.length; s++) {\n const sub = anchors[s];\n if (at[k] !== flat) return null;\n const points: SpiroPoint[] = [];\n while (k < at.length && at[k] < flat + sub.length) {\n if (k > 0 && at[k] <= at[k - 1]) return null;\n const a = sub[at[k] - flat];\n points.push({ x: a.x, y: a.y, kind: kinds[k] });\n k++;\n }\n contours.push({ points, closed: closed[s] });\n flat += sub.length;\n }\n return k === at.length ? contours : null;\n}\n\n/** The straight-sided path through each contour's points: what an editor\n * shows and moves in place of the curve. */\nexport function spiroControlPath(contours: readonly SpiroContour[]): PolygonPath {\n return anchorsToPath(\n contours.map((c) => c.points.map((p) => ({ x: p.x, y: p.y }))),\n contours.map((c) => c.closed),\n );\n}\n\nconst key = (x: number, y: number): string => `${Math.round(x * 1e3)},${Math.round(y * 1e3)}`;\n\n/**\n * Read an edited control path back as contours: every anchor is a point.\n * Kinds follow from `before`, the contours the edit started from: point for\n * point when the count is unchanged, else by position, with an anchor that\n * lands nowhere a point was taking `fallback`. Handles are ignored.\n */\nexport function spiroContoursFromControl(\n control: PolygonPath,\n before: readonly SpiroContour[],\n fallback: SpiroKind = 'smooth',\n): SpiroContour[] {\n const { anchors, closed } = pathToAnchors(control);\n const old = before.flatMap((c) => c.points);\n const count = anchors.reduce((n, sub) => n + sub.length, 0);\n const byPlace = new Map<string, SpiroKind>();\n for (const p of old) if (!byPlace.has(key(p.x, p.y))) byPlace.set(key(p.x, p.y), p.kind);\n let i = 0;\n return anchors.map((sub, s) => ({\n closed: closed[s],\n points: sub.map((a) => {\n const kind = count === old.length ? old[i].kind : byPlace.get(key(a.x, a.y)) ?? fallback;\n i++;\n return { x: a.x, y: a.y, kind };\n }),\n }));\n}\n"]}
@@ -1,7 +1,6 @@
1
- import { nearestOnLine, nearestOnCubic } from './chunk-2N6OWA7E.js';
2
- import { cornerCuts, decodeContours, fillsOpenSubpaths, resolveCorners, segmentsCross, pointInPolygon } from './chunk-EURWZUNY.js';
3
- import { EPS } from './chunk-755Y4YZS.js';
4
- import { withoutCorners, compactCorners, worldCoords, PATH_M, PATH_L, PATH_Q, PATH_C, PATH_Z, originFor, coordsFrom, forEachSegment, pathCommandCoordCount, PathBuilder, splitQuadraticAt, splitCubicAt } from './chunk-B3D6KWW3.js';
1
+ import { cornerCuts, decodeContours, ringSignedArea, fillsOpenSubpaths, resolveCorners, segmentsCross, pointInPolygon } from './chunk-GA5R5KWD.js';
2
+ import { withoutCorners, compactCorners, worldCoords, PATH_M, PATH_L, PATH_Q, PATH_C, PATH_Z, originFor, coordsFrom, forEachSegment, pathCommandCoordCount, PathBuilder, distance, splitQuadraticAt, splitCubicAt, nearestOnLine, nearestOnCubic, lerpPoint } from './chunk-346XYYMX.js';
3
+ import { EPS } from './chunk-DNX24KBT.js';
5
4
 
6
5
  // src/paths/cornerCarry.ts
7
6
  var flatCache = /* @__PURE__ */ new WeakMap();
@@ -75,7 +74,6 @@ function keepCorners(sources, result, tolerance = CORNER_RESTORE_TOLERANCE) {
75
74
  const traces = sources.flatMap(cornerTraces);
76
75
  return traces.length === 0 ? result : restoreCorners(result, traces, tolerance);
77
76
  }
78
- var dist = (a, b) => Math.hypot(a.x - b.x, a.y - b.y);
79
77
  function onTrace(p, t, tol) {
80
78
  let from = t.start;
81
79
  for (const piece of t.pieces) {
@@ -86,10 +84,9 @@ function onTrace(p, t, tol) {
86
84
  return false;
87
85
  }
88
86
  function blossom(s, u, v, w) {
89
- const lerp = (a2, b2, t) => ({ x: a2.x + (b2.x - a2.x) * t, y: a2.y + (b2.y - a2.y) * t });
90
- const a = lerp(s.p0, s.c1, u), b = lerp(s.c1, s.c2, u), c = lerp(s.c2, s.p3, u);
91
- const d = lerp(a, b, v), e = lerp(b, c, v);
92
- return lerp(d, e, w);
87
+ const a = lerpPoint(s.p0, s.c1, u), b = lerpPoint(s.c1, s.c2, u), c = lerpPoint(s.c2, s.p3, u);
88
+ const d = lerpPoint(a, b, v), e = lerpPoint(b, c, v);
89
+ return lerpPoint(d, e, w);
93
90
  }
94
91
  function extendTo(s, target, from, tol) {
95
92
  const at = (u2) => blossom(s, u2, u2, u2);
@@ -99,14 +96,14 @@ function extendTo(s, target, from, tol) {
99
96
  };
100
97
  const speed = Math.hypot(d1(from).x, d1(from).y);
101
98
  if (speed === 0) return null;
102
- let u = from + (from === 1 ? 1 : -1) * dist(at(from), target) / speed;
99
+ let u = from + (from === 1 ? 1 : -1) * distance(at(from), target) / speed;
103
100
  for (let i = 0; i < 30; i++) {
104
101
  const p = at(u), d = d1(u);
105
102
  const dd = d.x * d.x + d.y * d.y;
106
103
  if (dd === 0) break;
107
104
  u -= ((p.x - target.x) * d.x + (p.y - target.y) * d.y) / dd;
108
105
  }
109
- return dist(at(u), target) <= tol ? u : null;
106
+ return distance(at(u), target) <= tol ? u : null;
110
107
  }
111
108
  function reachSeg(s, start, end, tol) {
112
109
  const p0 = start ?? s.p0, p3 = end ?? s.p3;
@@ -117,7 +114,7 @@ function reachSeg(s, start, end, tol) {
117
114
  return { line: false, p0, c1: blossom(s, u0, u0, u1), c2: blossom(s, u0, u1, u1), p3 };
118
115
  }
119
116
  function endsCut(a, edge, p, t, tol) {
120
- if (dist(a, p) <= tol) return true;
117
+ if (distance(a, p) <= tol) return true;
121
118
  return edge.line && onTrace(a, t, tol) && nearestOnLine(p.x, p.y, edge.p0.x, edge.p0.y, edge.p3.x, edge.p3.y).dist <= tol;
122
119
  }
123
120
  function findRun(c, t, tol) {
@@ -220,8 +217,8 @@ function failedTraces(path, tol, folded) {
220
217
  const bad = new Set(folded.map((r) => r.trace));
221
218
  for (const cut of cornerCuts(path)) {
222
219
  for (const t of bad) {
223
- if (dist(cut.anchor, t.anchor) > tol) continue;
224
- const same = dist(cut.start, t.start) <= tol && dist(cut.end, t.end) <= tol || dist(cut.start, t.end) <= tol && dist(cut.end, t.start) <= tol;
220
+ if (distance(cut.anchor, t.anchor) > tol) continue;
221
+ const same = distance(cut.start, t.start) <= tol && distance(cut.end, t.end) <= tol || distance(cut.start, t.end) <= tol && distance(cut.end, t.start) <= tol;
225
222
  if (same) bad.delete(t);
226
223
  }
227
224
  }
@@ -326,13 +323,7 @@ function sampleContour(c) {
326
323
  return out;
327
324
  }
328
325
  function signedArea(c) {
329
- const pts = sampleContour(c);
330
- let a = 0;
331
- for (let i = 0; i < pts.length; i += 2) {
332
- const j = (i + 2) % pts.length;
333
- a += pts[i] * pts[j + 1] - pts[j] * pts[i + 1];
334
- }
335
- return a / 2;
326
+ return ringSignedArea(sampleContour(c));
336
327
  }
337
328
  function sideCoeffs(s, o, d) {
338
329
  return s.map((p) => d.x * (p.y - o.y) - d.y * (p.x - o.x));
@@ -686,5 +677,5 @@ function writePath(subpaths, fillRule) {
686
677
  }
687
678
 
688
679
  export { CORNER_RESTORE_TOLERANCE, anchorRange, assembleRegions, carryCorners, contoursIntersect, cornerTraces, derivSeg, endSide, evalSeg, extentOf, intersectSegments, keepCorners, negligibleArea, orientBoundaries, parseContours, parseSubpaths, regionArea, restoreCorners, reverseContour, sampleContour, sideCoeffs, signChanges, signedArea, subSeg, toPath, windingAt, writePath };
689
- //# sourceMappingURL=chunk-3YH5XU3H.js.map
690
- //# sourceMappingURL=chunk-3YH5XU3H.js.map
680
+ //# sourceMappingURL=chunk-OQP5M5VD.js.map
681
+ //# sourceMappingURL=chunk-OQP5M5VD.js.map