@weasel-js/geom 1.15.1 → 1.16.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 (56) hide show
  1. package/dist/3d/index.d.ts +16 -2
  2. package/dist/3d/index.js +17 -10
  3. package/dist/3d/index.js.map +1 -1
  4. package/dist/booleans/index.js +5 -5
  5. package/dist/{chunk-B3D6KWW3.js → chunk-346XYYMX.js} +154 -3
  6. package/dist/chunk-346XYYMX.js.map +1 -0
  7. package/dist/{chunk-FROQPADA.js → chunk-5W425HJA.js} +82 -16
  8. package/dist/chunk-5W425HJA.js.map +1 -0
  9. package/dist/chunk-DNX24KBT.js +82 -0
  10. package/dist/chunk-DNX24KBT.js.map +1 -0
  11. package/dist/chunk-FOXMA54X.js +266 -0
  12. package/dist/chunk-FOXMA54X.js.map +1 -0
  13. package/dist/{chunk-3HQJGI63.js → chunk-HTT5AQIU.js} +3 -4
  14. package/dist/chunk-HTT5AQIU.js.map +1 -0
  15. package/dist/chunk-IOD2NFHQ.js +212 -0
  16. package/dist/chunk-IOD2NFHQ.js.map +1 -0
  17. package/dist/{chunk-HNLJO3E7.js → chunk-MOCSUHEI.js} +22 -8
  18. package/dist/chunk-MOCSUHEI.js.map +1 -0
  19. package/dist/{chunk-3YH5XU3H.js → chunk-OBPXEPUH.js} +14 -23
  20. package/dist/chunk-OBPXEPUH.js.map +1 -0
  21. package/dist/chunk-QSVZO7QZ.js +40 -0
  22. package/dist/chunk-QSVZO7QZ.js.map +1 -0
  23. package/dist/{chunk-EURWZUNY.js → chunk-TBS4NHGQ.js} +70 -93
  24. package/dist/chunk-TBS4NHGQ.js.map +1 -0
  25. package/dist/{chunk-HMGGJZTM.js → chunk-VJG5ZWCR.js} +7 -21
  26. package/dist/chunk-VJG5ZWCR.js.map +1 -0
  27. package/dist/{chunk-ZOMUTU7J.js → chunk-ZV24QZ6X.js} +5 -11
  28. package/dist/chunk-ZV24QZ6X.js.map +1 -0
  29. package/dist/{curvature-CDOI32hv.d.ts → curvature-DKPO4Qeh.d.ts} +0 -27
  30. package/dist/curves/index.d.ts +1 -1
  31. package/dist/curves/index.js +4 -4
  32. package/dist/index.d.ts +193 -13
  33. package/dist/index.js +409 -273
  34. package/dist/index.js.map +1 -1
  35. package/dist/lengthTable-Cv3W6lsH.d.ts +64 -0
  36. package/dist/nd/index.d.ts +28 -1
  37. package/dist/nd/index.js +2 -5
  38. package/dist/nd/index.js.map +1 -1
  39. package/dist/tessellate/index.d.ts +23 -1
  40. package/dist/tessellate/index.js +31 -17
  41. package/dist/tessellate/index.js.map +1 -1
  42. package/dist/warp/index.js +9 -15
  43. package/dist/warp/index.js.map +1 -1
  44. package/package.json +2 -2
  45. package/dist/chunk-2N6OWA7E.js +0 -104
  46. package/dist/chunk-2N6OWA7E.js.map +0 -1
  47. package/dist/chunk-3HQJGI63.js.map +0 -1
  48. package/dist/chunk-3YH5XU3H.js.map +0 -1
  49. package/dist/chunk-755Y4YZS.js +0 -32
  50. package/dist/chunk-755Y4YZS.js.map +0 -1
  51. package/dist/chunk-B3D6KWW3.js.map +0 -1
  52. package/dist/chunk-EURWZUNY.js.map +0 -1
  53. package/dist/chunk-FROQPADA.js.map +0 -1
  54. package/dist/chunk-HMGGJZTM.js.map +0 -1
  55. package/dist/chunk-HNLJO3E7.js.map +0 -1
  56. package/dist/chunk-ZOMUTU7J.js.map +0 -1
@@ -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-VJG5ZWCR.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,6 +1,5 @@
1
- import { nearestOnLine } from './chunk-2N6OWA7E.js';
2
- import { resolveCorners, fitCubicWithTangents } from './chunk-EURWZUNY.js';
3
- import { forEachSegment, PATH_Z, PATH_Q, elevateQuadraticToCubic, cubicBounds, PATH_C, PATH_L, PATH_M } from './chunk-B3D6KWW3.js';
1
+ import { resolveCorners, fitCubicWithTangents } from './chunk-TBS4NHGQ.js';
2
+ import { forEachSegment, PATH_Z, PATH_Q, elevateQuadraticToCubic, cubicBounds, PATH_C, PATH_L, PATH_M, nearestOnLine, pointSegmentDist2 } from './chunk-346XYYMX.js';
4
3
 
5
4
  // src/paths/bounds.ts
6
5
  function boundsOfPath(path) {
@@ -157,12 +156,7 @@ function worstFromPolyline(from, to, bound) {
157
156
  const px = from[i], py = from[i + 1];
158
157
  let near = Infinity, at = hint;
159
158
  for (let j = hint, end = Math.min(edges, hint + reach); j < end; j++) {
160
- const x0 = to[2 * j], y0 = to[2 * j + 1];
161
- const dx = to[2 * j + 2] - x0, dy = to[2 * j + 3] - y0;
162
- const len = dx * dx + dy * dy;
163
- const s = len === 0 ? 0 : Math.min(1, Math.max(0, ((px - x0) * dx + (py - y0) * dy) / len));
164
- const ex = x0 + s * dx - px, ey = y0 + s * dy - py;
165
- const d = ex * ex + ey * ey;
159
+ const d = pointSegmentDist2(px, py, to[2 * j], to[2 * j + 1], to[2 * j + 2], to[2 * j + 3]);
166
160
  if (d < near) {
167
161
  near = d;
168
162
  at = j;
@@ -245,5 +239,5 @@ function unit(p) {
245
239
  }
246
240
 
247
241
  export { boundsOfPath, fitPointRun, keepCorner };
248
- //# sourceMappingURL=chunk-ZOMUTU7J.js.map
249
- //# sourceMappingURL=chunk-ZOMUTU7J.js.map
242
+ //# sourceMappingURL=chunk-ZV24QZ6X.js.map
243
+ //# sourceMappingURL=chunk-ZV24QZ6X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/paths/bounds.ts","../src/paths/fitHandles.ts","../src/paths/fitRun.ts"],"names":["al","be"],"mappings":"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","file":"chunk-ZV24QZ6X.js","sourcesContent":["import { cubicBounds, elevateQuadraticToCubic } from '../curve';\nimport { forEachSegment, PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { Path, RectPath } from '../path';\nimport { resolveCorners } from './corners';\n\n/**\n * AABB of a `Path`, returned as a `RectPath` for direct reuse with rect-fast-path machinery.\n * Control points are NOT included directly; they're used only to compute extrema that actually\n * lie on the curve. Corner shapes are bounded as they are drawn, expanded. Empty paths (no commands) return a zero-size rect anchored at the origin.\n */\nexport function boundsOfPath(path: Path): RectPath {\n if (path.kind === 'rect') return path;\n\n const { commands, coords } = resolveCorners(path);\n if (commands.length === 0) {\n return { kind: 'rect', x: 0, y: 0, width: 0, height: 0 };\n }\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n let seen = false;\n\n const include = (x: number, y: number) => {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n seen = true;\n };\n\n forEachSegment(commands, coords, (cmd, ci, px, py) => {\n switch (cmd) {\n case PATH_M:\n case PATH_L: {\n include(coords[ci], coords[ci + 1]);\n break;\n }\n case PATH_C: {\n const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(\n px, py,\n coords[ci], coords[ci + 1],\n coords[ci + 2], coords[ci + 3],\n coords[ci + 4], coords[ci + 5],\n );\n include(bMinX, bMinY);\n include(bMaxX, bMaxY);\n break;\n }\n case PATH_Q: {\n const qx2 = coords[ci + 2], qy2 = coords[ci + 3];\n const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(px, py, coords[ci], coords[ci + 1], qx2, qy2);\n const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(px, py, c1x, c1y, c2x, c2y, qx2, qy2);\n include(bMinX, bMinY);\n include(bMaxX, bMaxY);\n break;\n }\n case PATH_Z:\n break;\n default:\n throw new Error(`boundsOfPath: unknown command ${cmd}`);\n }\n });\n\n if (!seen) return { kind: 'rect', x: 0, y: 0, width: 0, height: 0 };\n return {\n kind: 'rect', x: minX + (path.origin?.x ?? 0), y: minY + (path.origin?.y ?? 0),\n width: maxX - minX, height: maxY - minY,\n };\n}\n\n","/**\n * How far a cubic and a run of samples stray from each other, and the handle\n * lengths that bring them closest: the measure and the search behind\n * `fitPointRun`. Both work on flattened cubics and on the run as a polyline.\n */\nimport type { Point } from './cubicMath';\nimport { pointSegmentDist2 } from '../points2';\n\n/** A cubic's two handles. */\nexport interface Handles {\n cp1: Point;\n cp2: Point;\n}\n\n/** Handle lengths tried on each axis of the coarse search, as shares of the chord. */\nconst GRID = [0.02, 0.1, 0.2, 0.3, 0.45, 0.6, 0.8, 1.05];\n/** Most steps of the pattern search after the coarse one. */\nconst MAX_STEPS = 60;\n/** Segments the cubic is flattened to while the search compares handle lengths. */\nconst SEARCH_FLAT = 48;\n/** The search stops once the run and the cubic are within this share of the tolerance. */\nconst TARGET = 0.9;\n/** A least-squares fit farther than this many tolerances from the run is not searched around. */\nconst SEARCH_REACH = 4;\n/** A coarse best farther than this many tolerances is not worth refining. */\nconst GIVE_UP = 2;\n/** How far a flattened cubic may sit from the cubic, as a share of the tolerance, when checking a fit. */\nconst CHECK_SAG = 1 / 16;\nconst MAX_CHECK_FLAT = 512;\n\n/** `pts` as interleaved `x, y`. */\nexport function packRun(pts: readonly Point[]): Float64Array {\n const run = new Float64Array(2 * pts.length);\n pts.forEach((p, i) => { run[2 * i] = p.x; run[2 * i + 1] = p.y; });\n return run;\n}\n\n/**\n * Whether the cubic from `a` to `e` lies within `tol` of the polyline through\n * `run`, and every sample of `run` within `tol` of it. The samples hold the\n * run to the cubic; the other way holds the cubic to the run, which a cubic\n * bulging across a sparsely sampled flat fails. The cubic is flattened finely\n * enough that its chords stay within a sixteenth of `tol` of it, and that\n * much is taken off the bound.\n */\nexport function cubicWithin(run: Float64Array, a: Point, cp1: Point, cp2: Point, e: Point, tol: number): boolean {\n // A chord of a cubic split N ways sits within max|B''| / 8N² of it, and |B''| is at most 6 × the larger second difference.\n const bend = 6 * Math.max(Math.hypot(a.x - 2 * cp1.x + cp2.x, a.y - 2 * cp1.y + cp2.y), Math.hypot(cp1.x - 2 * cp2.x + e.x, cp1.y - 2 * cp2.y + e.y));\n const n = Math.min(MAX_CHECK_FLAT, Math.max(8, Math.ceil(Math.sqrt(bend / (8 * CHECK_SAG * tol)))));\n const sag = bend / (8 * n * n);\n const bound = tol - sag;\n if (bound <= 0) return false;\n const flat = new Float64Array(2 * (n + 1));\n flatten(a, cp1, cp2, e, flat);\n return worstFromPolyline(run, flat, bound) <= bound && worstFromPolyline(flat, run, bound) <= bound;\n}\n\n/**\n * The handle lengths, directions held, that bring the run nearest the cubic\n * both ways: a coarse grid, then a pattern search from its best; null when\n * even the best of the grid is far off. Least squares minimizes the sum, so\n * its worst sample can sit well outside a tolerance other lengths meet, often\n * in another basin entirely: a bend near one end wants that end's handle\n * short. The caller checks the result with {@link cubicWithin}.\n */\nexport function searchHandles(run: Float64Array, a: Point, e: Point, tStart: Point, tEnd: Point, tol: number, from: Handles): Handles | null {\n const chord = Math.hypot(e.x - a.x, e.y - a.y);\n const at = (al: number, be: number): Handles => ({\n cp1: { x: a.x + al * tStart.x, y: a.y + al * tStart.y },\n cp2: { x: e.x + be * tEnd.x, y: e.y + be * tEnd.y },\n });\n const flat = new Float64Array(2 * (SEARCH_FLAT + 1));\n /** How far apart the run and the cubic get, or some figure above `bound` once they pass it. */\n const spread = (al: number, be: number, bound: number) => {\n const { cp1, cp2 } = at(al, be);\n flatten(a, cp1, cp2, e, flat);\n const out = worstFromPolyline(run, flat, bound);\n return out > bound ? out : Math.max(out, worstFromPolyline(flat, run, bound));\n };\n const fromAl = Math.max(0, (from.cp1.x - a.x) * tStart.x + (from.cp1.y - a.y) * tStart.y);\n const fromBe = Math.max(0, (from.cp2.x - e.x) * tEnd.x + (from.cp2.y - e.y) * tEnd.y);\n let al = fromAl, be = fromBe, best = spread(al, be, Infinity);\n if (best > SEARCH_REACH * tol) return null;\n for (const fa of GRID) for (const fb of GRID) {\n const d = spread(fa * chord, fb * chord, best);\n if (d < best) { best = d; al = fa * chord; be = fb * chord; }\n }\n if (best > GIVE_UP * tol) return null;\n let step = chord * 0.05;\n for (let i = 0; i < MAX_STEPS && best > TARGET * tol && step > tol / 32; i++) {\n let moved = false;\n for (const [da, db] of STEPS) {\n const na = al + da * step, nb = be + db * step;\n if (na < 0 || nb < 0) continue;\n const d = spread(na, nb, best);\n if (d < best) { best = d; al = na; be = nb; moved = true; break; }\n }\n if (!moved) step /= 2;\n }\n return at(al, be);\n}\n\nconst STEPS = [[1, 0], [-1, 0], [0, 1], [0, -1], [1, 1], [-1, -1], [1, -1], [-1, 1]];\n\n/** The cubic at even parameters, as many as `out` holds points, into `out`. */\nfunction flatten(a: Point, cp1: Point, cp2: Point, e: Point, out: Float64Array): void {\n const n = out.length / 2 - 1;\n const ax = e.x - a.x + 3 * (cp1.x - cp2.x), ay = e.y - a.y + 3 * (cp1.y - cp2.y);\n const bx = 3 * (a.x - 2 * cp1.x + cp2.x), by = 3 * (a.y - 2 * cp1.y + cp2.y);\n const cx = 3 * (cp1.x - a.x), cy = 3 * (cp1.y - a.y);\n for (let k = 0; k <= n; k++) {\n const t = k / n;\n out[2 * k] = ((ax * t + bx) * t + cx) * t + a.x;\n out[2 * k + 1] = ((ay * t + by) * t + cy) * t + a.y;\n }\n}\n\n/**\n * The farthest any interior point of `from` lies from the polyline through\n * `to`, both interleaved `x, y` and running the same way; it stops early,\n * with a figure above `bound`, once one is farther than that. Each point\n * looks only a stretch ahead of where the last one landed, so a polyline\n * doubling back reads as farther than it is, never nearer.\n */\nfunction worstFromPolyline(from: Float64Array, to: Float64Array, bound: number): number {\n const edges = to.length / 2 - 1;\n const reach = Math.max(4, edges >> 2);\n const limit = bound * bound;\n let hint = 0, worst = 0;\n for (let i = 2; i < from.length - 2; i += 2) {\n const px = from[i], py = from[i + 1];\n let near = Infinity, at = hint;\n for (let j = hint, end = Math.min(edges, hint + reach); j < end; j++) {\n const d = pointSegmentDist2(px, py, to[2 * j], to[2 * j + 1], to[2 * j + 2], to[2 * j + 3]);\n if (d < near) { near = d; at = j; }\n }\n hint = at;\n if (near > worst) {\n worst = near;\n if (worst > limit) break;\n }\n }\n return Math.sqrt(worst);\n}\n","/**\n * Fitting a run of sampled points with as few cubics as hold it within a\n * tolerance, each held to the run's end tangents: the refit `simplifyPath`\n * and `warpPath` share.\n */\nimport { nearestOnLine } from '../nearest';\nimport type { PenAnchor } from './anchors';\nimport type { Point } from './cubicMath';\nimport { cubicWithin, packRun, searchHandles } from './fitHandles';\nimport { fitCubicWithTangents } from './schneiderFit';\n\n/** Give `to`, an anchor a refit kept where `from` was, `from`'s corner spec. */\nexport function keepCorner(to: PenAnchor, from: PenAnchor): void {\n if (from.corner) to.corner = { ...from.corner };\n}\n\n/**\n * Fit `pts` with cubics held to the end tangents, each the longest stretch one\n * cubic holds within `tol`, and append the anchors after the first to `out`\n * (the first too when `out` is empty). `closing` folds the final anchor,\n * which lands on the subpath's first, into that first one.\n */\nexport function fitPointRun(pts: Point[], tStart: Point, tEnd: Point, tol: number, out: PenAnchor[], closing: boolean): void {\n if (out.length === 0) out.push({ x: pts[0].x, y: pts[0].y });\n const segs: Seg[] = [];\n fitGreedy(pts, tStart, tEnd, tol, segs);\n segs.forEach((seg, i) => {\n const prev = out[out.length - 1];\n if (seg.c1) prev.outHandle = seg.c1;\n const isLast = i === segs.length - 1;\n if (closing && isLast) {\n if (seg.c2) out[0].inHandle = seg.c2;\n return;\n }\n out.push(seg.c2 ? { x: seg.end.x, y: seg.end.y, inHandle: seg.c2 } : { x: seg.end.x, y: seg.end.y });\n });\n}\n\ntype Seg = { c1?: Point; c2?: Point; end: Point };\n\n/**\n * Each piece is the longest prefix of what is left that one cubic holds,\n * found by bisecting on its end sample. Splitting at the worst sample instead\n * cuts where a poor first fit strays most, which is rarely where a piece has\n * to end: it refit a puppet-warped bar with twice the anchors it needed.\n */\nfunction fitGreedy(pts: Point[], tStart: Point, tEnd: Point, tol: number, out: Seg[]): void {\n let from = 0;\n let tIn = tStart;\n for (;;) {\n const whole = fitOne(pts.slice(from), tIn, tEnd, tol);\n if (whole) { out.push(whole); return; }\n let lo = from + 1, hi = pts.length - 1;\n let piece: Seg = { end: pts[lo] };\n while (hi - lo > 1) {\n const mid = (lo + hi) >> 1;\n const fit = fitOne(pts.slice(from, mid + 1), tIn, neg(tangentAt(pts, mid)), tol);\n if (fit) { lo = mid; piece = fit; } else hi = mid;\n }\n out.push(piece);\n tIn = tangentAt(pts, lo);\n from = lo;\n }\n}\n\nconst tangentAt = (pts: Point[], k: number): Point => unit(sub2(pts[k + 1], pts[k - 1]));\n\n/** One cubic held to the run's end tangents within `tol` of the run both ways, or null. */\nfunction fitOne(pts: Point[], tStart: Point, tEnd: Point, tol: number): Seg | null {\n const a = pts[0];\n const e = pts[pts.length - 1];\n if (pts.length <= 2 || withinLine(pts, a, e, tol)) return { end: e };\n const run = packRun(pts);\n const { cp1, cp2 } = fitCubicWithTangents(pts, tStart, tEnd);\n if (cubicWithin(run, a, cp1, cp2, e, tol)) return { c1: cp1, c2: cp2, end: e };\n const found = searchHandles(run, a, e, tStart, tEnd, tol, { cp1, cp2 });\n return found && cubicWithin(run, a, found.cp1, found.cp2, e, tol) ? { c1: found.cp1, c2: found.cp2, end: e } : null;\n}\n\nfunction withinLine(pts: Point[], a: Point, e: Point, tol: number): boolean {\n for (let i = 1; i < pts.length - 1; i++) {\n if (nearestOnLine(pts[i].x, pts[i].y, a.x, a.y, e.x, e.y).dist > tol) return false;\n }\n return true;\n}\n\nconst sub2 = (p: Point, q: Point): Point => ({ x: p.x - q.x, y: p.y - q.y });\nconst neg = (p: Point): Point => ({ x: -p.x, y: -p.y });\nfunction unit(p: Point): Point {\n const len = Math.hypot(p.x, p.y);\n return len === 0 ? { x: 0, y: 0 } : { x: p.x / len, y: p.y / len };\n}\n"]}
@@ -54,33 +54,6 @@ declare function eulerCurvatureAt(seg: EulerSegment, s: number): number;
54
54
  * to world arc length, at fraction `s` of it. */
55
55
  declare function eulerCurvatureDerivativesAt(seg: EulerSegment, s: number): [number, number];
56
56
 
57
- /**
58
- * Spiro curves: a spline defined by on-curve points alone. Between each pair
59
- * of neighboring points runs an Euler-spiral segment (`eulerSpiral`), and the
60
- * segments are solved together so that, at every smooth point, both the
61
- * tangent and the curvature carry straight through. The curve has no handles
62
- * to tune; moving a point re-solves the whole curve.
63
- *
64
- * Each point's kind says what holds at it:
65
- *
66
- * | kind | at the point |
67
- * |---|---|
68
- * | `smooth` | tangent and curvature continue (G2); next to a straight segment, the curve leaves along the line |
69
- * | `g4` | tangent, curvature, and the curvature's first two derivatives continue (G4); otherwise as `smooth` |
70
- * | `corner` | the two sides are independent; each meets the point with zero curvature |
71
- * | `left` | the segment arriving is straight, and the curve leaving continues the line |
72
- * | `right` | the segment leaving is straight, and the curve arriving runs into the line |
73
- *
74
- * The ends of an open curve meet their points with zero curvature, as a
75
- * corner's sides do.
76
- *
77
- * A segment with a `g4` point at either end is a cubic-curvature segment,
78
- * with two more unknowns than an Euler spiral's two end tangents. A `g4`
79
- * point between two curved segments pays for its side's two with its two
80
- * extra equations; anywhere else, such a segment's curvature stops bending
81
- * at that end (its second derivative is zero there).
82
- */
83
-
84
57
  /** What holds at a spiro point; see the table at the top of `spiro.ts`. */
85
58
  type SpiroKind = 'smooth' | 'g4' | 'corner' | 'left' | 'right';
86
59
  /** Every {@link SpiroKind}, in the order a picker lists them. */
@@ -1,5 +1,5 @@
1
1
  import { P as PolygonPath } from '../path-t80OoJnM.js';
2
- import { S as SpiroKind, C as CurvatureSource } from '../curvature-CDOI32hv.js';
2
+ import { S as SpiroKind, C as CurvatureSource } from '../curvature-DKPO4Qeh.js';
3
3
 
4
4
  /** A point in the shared anchor set. Every representation reads only the
5
5
  * fields it cares about: cubic Bezier reads inHandle/outHandle; NURBS
@@ -1,7 +1,7 @@
1
- import { cubicCurvatureAt, SPIRO_KINDS, eulerCurvatureAt, spiroToPath, eulerPointAt, solveSpiro } from '../chunk-HNLJO3E7.js';
2
- import '../chunk-3HQJGI63.js';
3
- import '../chunk-2N6OWA7E.js';
4
- import { PATH_M, cubicPointAt, PATH_L, PATH_Q, PATH_C } from '../chunk-B3D6KWW3.js';
1
+ import { cubicCurvatureAt, SPIRO_KINDS, eulerCurvatureAt, spiroToPath, eulerPointAt, solveSpiro } from '../chunk-MOCSUHEI.js';
2
+ import '../chunk-HTT5AQIU.js';
3
+ import { PATH_M, cubicPointAt, PATH_L, PATH_Q, PATH_C } from '../chunk-346XYYMX.js';
4
+ import '../chunk-DNX24KBT.js';
5
5
 
6
6
  // src/curves/anchorHandles.ts
7
7
  var DEFAULT_HANDLE_FRACTION = 1 / 3;