@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/box.ts","../src/commands.ts","../src/curve.ts","../src/points2.ts","../src/nearest.ts","../src/paths/pathOrigin.ts","../src/paths/builder.ts","../src/paths/cornerSpec.ts","../src/paths/cubicMath.ts"],"names":["x","y"],"mappings":"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","file":"chunk-346XYYMX.js","sourcesContent":["/** Axis-aligned box as [minX, minY, maxX, maxY]. */\nexport type Box = readonly [number, number, number, number];\n\n/** An axis-aligned rectangle in object form. `Box` is the tuple form; this is\n * the one that survives being read by a human. */\nexport interface Rect { x: number; y: number; width: number; height: number }\n\n/** Tight bounds of an interleaved coord stream, or null if empty. */\nexport function boundsOfCoords(coords: ArrayLike<number>): Box | null {\n if (coords.length < 2) return null;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let i = 0; i + 1 < coords.length; i += 2) {\n const x = coords[i], y = coords[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n return [minX, minY, maxX, maxY];\n}\n\n/** Smallest box containing both inputs. */\nexport function unionBox(a: Box, b: Box): Box {\n return [\n Math.min(a[0], b[0]),\n Math.min(a[1], b[1]),\n Math.max(a[2], b[2]),\n Math.max(a[3], b[3]),\n ];\n}\n\n/** Inclusive point-in-box test. */\nexport function boxContainsPoint(b: Box, x: number, y: number): boolean {\n return x >= b[0] && x <= b[2] && y >= b[1] && y <= b[3];\n}\n\n/** Whether `outer` wholly holds `inner`, edges inclusive. Two boxes that merely\n * overlap answer false. */\nexport function boxContainsBox(outer: Box, inner: Box): boolean {\n return inner[0] >= outer[0] && inner[1] >= outer[1] && inner[2] <= outer[2] && inner[3] <= outer[3];\n}\n\n/** Interleaved corner ring for a rect at (x,y,w,h), wound clockwise from the\n * origin corner. The closing edge is implicit — the same unclosed shape\n * `pointInPolygon` takes, and what a repeated first vertex would leave as a\n * zero-length segment for anything that strokes it. */\nexport function rectToContour(x: number, y: number, w: number, h: number): Float64Array {\n return Float64Array.of(x, y, x + w, y, x + w, y + h, x, y + h);\n}\n\n/** Whether `a` and `b` meet, edges inclusive: boxes touching along an edge or\n * at a corner answer true. */\nexport function boxesIntersect(a: Box, b: Box): boolean {\n return a[0] <= b[2] && b[0] <= a[2] && a[1] <= b[3] && b[1] <= a[3];\n}\n\n/** Whether `a` and `b` share interior: rects that only touch along an edge or\n * at a corner answer false. */\nexport function rectsOverlap(a: Readonly<Rect>, b: Readonly<Rect>): boolean {\n return a.x < b.x + b.width && b.x < a.x + a.width && a.y < b.y + b.height && b.y < a.y + a.height;\n}\n\n/** Whether `a` and `b` meet, edges inclusive: rects touching along an edge or\n * at a corner answer true. {@link rectsOverlap} is the interior-only test. */\nexport function rectsIntersect(a: Readonly<Rect>, b: Readonly<Rect>): boolean {\n return a.x <= b.x + b.width && b.x <= a.x + a.width && a.y <= b.y + b.height && b.y <= a.y + a.height;\n}\n\n/** Inclusive point-in-rect test: a point on any edge is inside. */\nexport function rectContainsPoint(r: Readonly<Rect>, x: number, y: number): boolean {\n return x >= r.x && x <= r.x + r.width && y >= r.y && y <= r.y + r.height;\n}\n\n/** Half-open point-in-rect test: the left and top edges are inside, the right\n * and bottom ones outside, so rects that tile a plane never both claim a point. */\nexport function rectContainsPointHalfOpen(r: Readonly<Rect>, x: number, y: number): boolean {\n return x >= r.x && x < r.x + r.width && y >= r.y && y < r.y + r.height;\n}\n\n/** Smallest rect containing every one of `rects`, or null for none. A `NaN`\n * coordinate makes the matching edge of the result `NaN`. */\nexport function unionRects(rects: Iterable<Readonly<Rect>>): Rect | null {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n let any = false;\n for (const r of rects) {\n any = true;\n minX = Math.min(minX, r.x);\n minY = Math.min(minY, r.y);\n maxX = Math.max(maxX, r.x + r.width);\n maxY = Math.max(maxY, r.y + r.height);\n }\n return any ? { x: minX, y: minY, width: maxX - minX, height: maxY - minY } : null;\n}\n","/**\n * SVG-style command-stream encoding — the kit's single declaration of the path\n * opcodes.\n *\n * The codes index a `Uint8Array` command stream whose coords live in a\n * parallel float array, so a code declared anywhere but `PATH_COMMANDS` makes\n * every walker that doesn't know it misread the coord stream from that command\n * on — silently, for every path.\n */\n\n/** Opcode table: command code and the float coords it consumes. */\nexport const PATH_COMMANDS = {\n /** moveTo — opens a new subpath. */\n M: { code: 0, coords: 2 },\n /** Straight segment from the pen to the next coord pair. */\n L: { code: 1, coords: 2 },\n /** Cubic bezier: two control points then the endpoint. */\n C: { code: 2, coords: 6 },\n /** Quadratic bezier: one control point then the endpoint. */\n Q: { code: 3, coords: 4 },\n /** Close the current subpath back to its start. Consumes no coords and\n * leaves the pen where it is. */\n Z: { code: 4, coords: 0 },\n} as const;\n\n/** Mnemonic of a declared command (`'M' | 'L' | …`). */\nexport type PathCommandName = keyof typeof PATH_COMMANDS;\n/** Numeric code of a declared command. */\nexport type PathCommandCode = (typeof PATH_COMMANDS)[PathCommandName]['code'];\n\n/** Command code of `M` (moveTo). */\nexport const PATH_M = PATH_COMMANDS.M.code;\n/** Command code of `L` (lineTo). */\nexport const PATH_L = PATH_COMMANDS.L.code;\n/** Command code of `C` (cubic bezier). */\nexport const PATH_C = PATH_COMMANDS.C.code;\n/** Command code of `Q` (quadratic bezier). */\nexport const PATH_Q = PATH_COMMANDS.Q.code;\n/** Command code of `Z` (close subpath). */\nexport const PATH_Z = PATH_COMMANDS.Z.code;\n\n/** Float coords consumed by each command, indexed by command code. */\nexport const PATH_CMD_LENGTHS: readonly number[] = buildCmdLengths();\n\nfunction buildCmdLengths(): number[] {\n const lengths: number[] = [];\n for (const { code, coords } of Object.values(PATH_COMMANDS)) lengths[code] = coords;\n return lengths;\n}\n\n/** Float coords consumed by the command with this code. */\nexport function pathCommandCoordCount(cmd: number): number {\n return PATH_CMD_LENGTHS[cmd];\n}\n\n/**\n * Visit each command with its coord offset and the pen position BEFORE the\n * command consumes its coords (the segment start). The callback stops the\n * walk by returning `false`. `Z` returns the pen to the subpath's opening `M`.\n *\n * A command following a `Z` without an intervening `M` opens a new subpath at\n * the pen, as does a drawing command no `M` precedes at all. The visitor is\n * told with `opensSubpath`, and has to start its contour at `(penX, penY)`\n * then: there is no `M` to do it.\n *\n * A code `PATH_COMMANDS` does not declare throws once the visitor has seen it.\n */\nexport function forEachSegment(\n commands: ArrayLike<number>,\n coords: ArrayLike<number>,\n visit: (\n cmd: number,\n coordIndex: number,\n penX: number,\n penY: number,\n commandIndex: number,\n opensSubpath: boolean,\n ) => void | boolean,\n): void {\n let ci = 0;\n let px = 0, py = 0;\n let startX = 0, startY = 0;\n let open = false;\n for (let i = 0; i < commands.length; i++) {\n const cmd = commands[i];\n const opens = !open && cmd !== PATH_M && cmd !== PATH_Z;\n if (opens) { startX = px; startY = py; }\n open = cmd !== PATH_Z;\n if (visit(cmd, ci, px, py, i, opens) === false) return;\n const len = pathCommandCoordCount(cmd);\n if (len === undefined) throw new Error(`forEachSegment: unknown command code ${cmd}`);\n if (len > 0) {\n px = coords[ci + len - 2];\n py = coords[ci + len - 1];\n ci += len;\n if (cmd === PATH_M) { startX = px; startY = py; }\n } else if (cmd === PATH_Z) {\n px = startX; py = startY;\n }\n }\n}\n","import type { Box } from './box';\n\n/** Cubic Bezier point at parameter t (de Casteljau / Bernstein form). */\nexport function cubicEvalAt(\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number, t: number,\n): [number, number] {\n const u = 1 - t;\n const a = u * u * u, b = 3 * u * u * t, c = 3 * u * t * t, d = t * t * t;\n return [\n a * x0 + b * x1 + c * x2 + d * x3,\n a * y0 + b * y1 + c * y2 + d * y3,\n ];\n}\n\n/**\n * Degree-elevate a quadratic (q0, ctrl, q1) to a cubic. Returns the two\n * cubic control points [c1x, c1y, c2x, c2y]; the cubic endpoints equal the\n * quadratic endpoints. c1 = q0 + 2/3(ctrl-q0), c2 = q1 + 2/3(ctrl-q1).\n */\nexport function elevateQuadraticToCubic(\n q0x: number, q0y: number, cx: number, cy: number, q1x: number, q1y: number,\n): [number, number, number, number] {\n return [\n q0x + (2 / 3) * (cx - q0x),\n q0y + (2 / 3) * (cy - q0y),\n q1x + (2 / 3) * (cx - q1x),\n q1y + (2 / 3) * (cy - q1y),\n ];\n}\n\n/** The parameters in (0, 1) where one coordinate of a cubic, with control\n * values `p0..p3`, turns: the roots of its derivative. */\nexport function cubicAxisExtremaTs(p0: number, p1: number, p2: number, p3: number): number[] {\n // B'(t)=0 → quadratic a t² + b t + c = 0 with:\n const a = -p0 + 3 * p1 - 3 * p2 + p3;\n const b = 2 * (p0 - 2 * p1 + p2);\n const c = -p0 + p1;\n const ts: number[] = [];\n const push = (t: number) => { if (t > 0 && t < 1) ts.push(t); };\n if (Math.abs(a) < 1e-12) {\n if (Math.abs(b) > 1e-12) push(-c / b);\n } else {\n const disc = b * b - 4 * a * c;\n if (disc >= 0) {\n const sq = Math.sqrt(disc);\n push((-b + sq) / (2 * a));\n push((-b - sq) / (2 * a));\n }\n }\n return ts;\n}\n\n/** Tight AABB of a cubic, evaluating only extrema that lie on the curve. */\nexport function cubicBounds(\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number,\n): Box {\n let minX = Math.min(x0, x3), maxX = Math.max(x0, x3);\n let minY = Math.min(y0, y3), maxY = Math.max(y0, y3);\n for (const t of cubicAxisExtremaTs(x0, x1, x2, x3)) {\n const [ex] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, t);\n if (ex < minX) minX = ex;\n if (ex > maxX) maxX = ex;\n }\n for (const t of cubicAxisExtremaTs(y0, y1, y2, y3)) {\n const [, ey] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, t);\n if (ey < minY) minY = ey;\n if (ey > maxY) maxY = ey;\n }\n return [minX, minY, maxX, maxY];\n}\n\n/** Quadratic Bezier point at parameter t (Bernstein form). */\nexport function quadraticEvalAt(\n x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, t: number,\n): [number, number] {\n const u = 1 - t;\n const a = u * u, b = 2 * u * t, c = t * t;\n return [a * x0 + b * x1 + c * x2, a * y0 + b * y1 + c * y2];\n}\n\n/** A line segment's coords: start, end. */\nexport type LineCoords = [number, number, number, number];\n/** A quadratic Bezier's coords: start, control, end. */\nexport type QuadraticCoords = [number, number, number, number, number, number];\n/** A cubic Bezier's coords: start, two controls, end. */\nexport type CubicCoords = [number, number, number, number, number, number, number, number];\n\n/**\n * Split a cubic at parameter t (de Casteljau). The two halves share the point\n * at t and together trace the original exactly. A t outside [0, 1] splits the\n * curve's polynomial extension.\n */\nexport function splitCubicAt(\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number, t: number,\n): [CubicCoords, CubicCoords] {\n const ax = x0 + (x1 - x0) * t, ay = y0 + (y1 - y0) * t;\n const bx = x1 + (x2 - x1) * t, by = y1 + (y2 - y1) * t;\n const cx = x2 + (x3 - x2) * t, cy = y2 + (y3 - y2) * t;\n const dx = ax + (bx - ax) * t, dy = ay + (by - ay) * t;\n const ex = bx + (cx - bx) * t, ey = by + (cy - by) * t;\n const mx = dx + (ex - dx) * t, my = dy + (ey - dy) * t;\n return [[x0, y0, ax, ay, dx, dy, mx, my], [mx, my, ex, ey, cx, cy, x3, y3]];\n}\n\n/** Split a quadratic at parameter t (de Casteljau). See {@link splitCubicAt}. */\nexport function splitQuadraticAt(\n x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, t: number,\n): [QuadraticCoords, QuadraticCoords] {\n const ax = x0 + (x1 - x0) * t, ay = y0 + (y1 - y0) * t;\n const bx = x1 + (x2 - x1) * t, by = y1 + (y2 - y1) * t;\n const mx = ax + (bx - ax) * t, my = ay + (by - ay) * t;\n return [[x0, y0, ax, ay, mx, my], [mx, my, bx, by, x2, y2]];\n}\n\n/** Split a line segment at parameter t. See {@link splitCubicAt}. */\nexport function splitLineAt(\n x0: number, y0: number, x1: number, y1: number, t: number,\n): [LineCoords, LineCoords] {\n const mx = x0 + (x1 - x0) * t, my = y0 + (y1 - y0) * t;\n return [[x0, y0, mx, my], [mx, my, x1, y1]];\n}\n","/**\n * The rules of `./points` in the 2D kernel's currency. The segment functions\n * take loose scalars and allocate nothing, since hit tests call them per\n * pointermove and per vertex; the point functions take `Point`. Each goes\n * through the same scalar steps as its `./nd` counterpart, so the two agree\n * to the bit.\n */\n\nimport { segmentTFrom } from './points';\nimport { lerp } from './scalar';\nimport type { Point } from './paths/cubicMath';\n\n/** Squared distance between two points. */\nexport function distance2(a: Point, b: Point): number {\n const dx = a.x - b.x;\n const dy = a.y - b.y;\n return dx * dx + dy * dy;\n}\n\n/** Euclidean distance between two points. */\nexport function distance(a: Point, b: Point): number {\n return Math.sqrt(distance2(a, b));\n}\n\n/** The point `t` of the way from `a` to `b`; `t` outside [0, 1] extrapolates. */\nexport function lerpPoint(a: Point, b: Point, t: number): Point {\n return { x: lerp(a.x, b.x, t), y: lerp(a.y, b.y, t) };\n}\n\n/** The parameter, 0 to 1, of the point of segment (ax,ay)-(bx,by) nearest\n * (px,py). A zero-length segment answers 0. */\nexport function segmentT(\n px: number, py: number, ax: number, ay: number, bx: number, by: number,\n): number {\n const vx = bx - ax, vy = by - ay;\n return segmentTFrom((px - ax) * vx + (py - ay) * vy, vx * vx + vy * vy);\n}\n\n/** Squared distance from (px,py) to segment (ax,ay)-(bx,by), endpoint-clamped. */\nexport function pointSegmentDist2(\n px: number, py: number, ax: number, ay: number, bx: number, by: number,\n): number {\n const t = segmentT(px, py, ax, ay, bx, by);\n const dx = px - (t === 1 ? bx : lerp(ax, bx, t));\n const dy = py - (t === 1 ? by : lerp(ay, by, t));\n return dx * dx + dy * dy;\n}\n\n/** Distance from (px,py) to segment (ax,ay)-(bx,by), endpoint-clamped. */\nexport function pointSegmentDist(\n px: number, py: number, ax: number, ay: number, bx: number, by: number,\n): number {\n return Math.sqrt(pointSegmentDist2(px, py, ax, ay, bx, by));\n}\n","/**\n * Nearest point on a segment or a whole path to a probe point: where it is,\n * its curve parameter, and how far away it lies.\n */\nimport { cubicEvalAt, elevateQuadraticToCubic } from './curve';\nimport { segmentT } from './points2';\nimport { lerp } from './scalar';\nimport { forEachSegment, PATH_M, PATH_L, PATH_Q, PATH_C, PATH_Z } from './commands';\n\n/** The point on one segment nearest a probe. */\nexport interface CurveNearest {\n x: number;\n y: number;\n /** Curve parameter of the point, in [0, 1]. */\n t: number;\n /** Euclidean distance from the probe. */\n dist: number;\n}\n\n/** The point on a path nearest a probe, and the command whose segment holds it. */\nexport interface PathNearest extends CurveNearest {\n /** Index of the segment's command in the command stream (`L`, `Q`, `C` or `Z`). */\n commandIndex: number;\n /** Offset of that command's first coord; for a `Z`, where its coords would begin. */\n coordIndex: number;\n}\n\n/** Nearest point on segment (x0,y0)-(x1,y1) to (px,py). */\nexport function nearestOnLine(\n px: number, py: number, x0: number, y0: number, x1: number, y1: number,\n): CurveNearest {\n const t = segmentT(px, py, x0, y0, x1, y1);\n const x = t === 1 ? x1 : lerp(x0, x1, t);\n const y = t === 1 ? y1 : lerp(y0, y1, t);\n return { x, y, t, dist: Math.sqrt((px - x) * (px - x) + (py - y) * (py - y)) };\n}\n\n/** Coarse samples per cubic. Each local minimum among them is refined, so this\n * only has to separate the distance function's minima (a cubic has at most\n * three), not locate them. */\nconst CUBIC_SAMPLES = 32;\nconst REFINE_ITERS = 40;\nconst T_EPS = 1e-14;\n\n/**\n * Nearest point on the cubic (x0,y0)…(x3,y3) to (px,py). Samples the curve,\n * then refines every sampled local minimum with bracketed Newton on the\n * distance derivative, so a loop or cusp cannot capture it in the wrong basin.\n */\nexport function nearestOnCubic(\n px: number, py: number,\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number,\n): CurveNearest {\n // Power basis B(t) = a t³ + b t² + c t + p0, for the derivatives.\n const ax = -x0 + 3 * x1 - 3 * x2 + x3, ay = -y0 + 3 * y1 - 3 * y2 + y3;\n const bx = 3 * x0 - 6 * x1 + 3 * x2, by = 3 * y0 - 6 * y1 + 3 * y2;\n const cx = 3 * (x1 - x0), cy = 3 * (y1 - y0);\n\n const d2At = (t: number): number => {\n const [x, y] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, t);\n return (x - px) ** 2 + (y - py) ** 2;\n };\n\n const d2s: number[] = [];\n for (let k = 0; k <= CUBIC_SAMPLES; k++) d2s.push(d2At(k / CUBIC_SAMPLES));\n\n let bestT = 0, bestD2 = d2s[0];\n for (let k = 0; k <= CUBIC_SAMPLES; k++) {\n const d = d2s[k];\n const prev = k > 0 ? d2s[k - 1] : Infinity;\n const next = k < CUBIC_SAMPLES ? d2s[k + 1] : Infinity;\n if (!(d <= prev && d <= next)) continue;\n\n let lo = Math.max(0, (k - 1) / CUBIC_SAMPLES);\n let hi = Math.min(1, (k + 1) / CUBIC_SAMPLES);\n let t = k / CUBIC_SAMPLES;\n for (let i = 0; i < REFINE_ITERS; i++) {\n const t2 = t * t;\n const ex = ax * t2 * t + bx * t2 + cx * t + x0 - px;\n const ey = ay * t2 * t + by * t2 + cy * t + y0 - py;\n const dx = 3 * ax * t2 + 2 * bx * t + cx, dy = 3 * ay * t2 + 2 * by * t + cy;\n const ddx = 6 * ax * t + 2 * bx, ddy = 6 * ay * t + 2 * by;\n // g = ½ d/dt |B - P|², zero at a critical point; its sign says which side the minimum is on.\n const g = ex * dx + ey * dy;\n const gp = dx * dx + dy * dy + ex * ddx + ey * ddy;\n if (g > 0) hi = t; else if (g < 0) lo = t; else break;\n let tn = gp > 0 ? t - g / gp : NaN;\n if (!(tn > lo && tn < hi)) tn = (lo + hi) / 2;\n const step = Math.abs(tn - t);\n t = tn;\n if (step < T_EPS || hi - lo < T_EPS) break;\n }\n const refined = d2At(t);\n const [tk, dk] = refined <= d ? [t, refined] : [k / CUBIC_SAMPLES, d];\n if (dk < bestD2) { bestD2 = dk; bestT = tk; }\n }\n\n const [x, y] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, bestT);\n return { x, y, t: bestT, dist: Math.hypot(x - px, y - py) };\n}\n\n/** Nearest point on the quadratic (x0,y0)(x1,y1)(x2,y2) to (px,py). */\nexport function nearestOnQuadratic(\n px: number, py: number,\n x0: number, y0: number, x1: number, y1: number, x2: number, y2: number,\n): CurveNearest {\n // Degree elevation keeps the parameterization, so t carries over unchanged.\n const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(x0, y0, x1, y1, x2, y2);\n return nearestOnCubic(px, py, x0, y0, c1x, c1y, c2x, c2y, x2, y2);\n}\n\n/**\n * Nearest point on a command-stream path to (px,py), over every `L`, `Q`, `C`\n * and the closing edge each `Z` draws. The earliest segment wins a tie.\n * Returns `null` when the path has no segment, and throws on a command code\n * `PATH_COMMANDS` does not declare.\n */\nexport function nearestOnPath(\n commands: ArrayLike<number>,\n coords: ArrayLike<number>,\n px: number,\n py: number,\n): PathNearest | null {\n let best: PathNearest | null = null;\n let startX = 0, startY = 0;\n forEachSegment(commands, coords, (cmd, ci, x0, y0, commandIndex) => {\n let hit: CurveNearest;\n if (cmd === PATH_M) {\n startX = coords[ci]; startY = coords[ci + 1];\n return;\n } else if (cmd === PATH_L) {\n hit = nearestOnLine(px, py, x0, y0, coords[ci], coords[ci + 1]);\n } else if (cmd === PATH_Q) {\n hit = nearestOnQuadratic(px, py, x0, y0, coords[ci], coords[ci + 1], coords[ci + 2], coords[ci + 3]);\n } else if (cmd === PATH_C) {\n hit = nearestOnCubic(\n px, py, x0, y0,\n coords[ci], coords[ci + 1], coords[ci + 2], coords[ci + 3], coords[ci + 4], coords[ci + 5],\n );\n } else if (cmd === PATH_Z) {\n hit = nearestOnLine(px, py, x0, y0, startX, startY);\n } else {\n throw new Error(`nearestOnPath: unknown command code ${cmd}`);\n }\n if (best === null || hit.dist < best.dist) best = { ...hit, commandIndex, coordIndex: ci };\n });\n return best;\n}\n","/**\n * A polygon path's coords read in the path's own space: each pair plus\n * `PolygonPath.origin`, added in doubles. Every reader that answers in that\n * space (hit tests, anchors, booleans, SVG data) reads through here.\n */\nimport type { PolygonPath } from '../path';\nimport type { Point } from './cubicMath';\n\nconst ZERO: { readonly x: number; readonly y: number } = Object.freeze({ x: 0, y: 0 });\n\n/** The point `path`'s coords are measured from: `(0, 0)` when it has none. */\nexport function originOf(path: PolygonPath): { readonly x: number; readonly y: number } {\n return path.origin ?? ZERO;\n}\n\n/** Coordinate pair `i` of `path` (coords `2i`, `2i + 1`) in the path's own space. */\nexport function pathPoint(path: PolygonPath, i: number): Point {\n const o = originOf(path);\n return { x: o.x + path.coords[2 * i], y: o.y + path.coords[2 * i + 1] };\n}\n\n/**\n * `path.coords` in the path's own space, in doubles: the coords themselves\n * when the path has no origin, else a `Float64Array` of each pair plus it.\n */\nexport function worldCoords(path: PolygonPath): Float32Array | Float64Array {\n return path.origin ? addOrigin(path, Float64Array.from(path.coords)) : path.coords;\n}\n\n/** `xy`, interleaved pairs measured from `path`'s origin, moved into the\n * path's own space in place: for a reader that derived offsets from the coords. */\nexport function addOrigin<T extends { [i: number]: number; readonly length: number }>(path: PolygonPath, xy: T): T {\n const o = path.origin;\n if (o === undefined) return xy;\n for (let i = 0; i + 1 < xy.length; i += 2) {\n xy[i] += o.x;\n xy[i + 1] += o.y;\n }\n return xy;\n}\n\n/** `world`, interleaved pairs in a path's own space, as the float32 coords\n * of a path measured from `origin`: the inverse of {@link worldCoords}. */\nexport function coordsFrom(origin: { readonly x: number; readonly y: number } | undefined, world: ArrayLike<number>): Float32Array {\n const ox = origin?.x ?? 0, oy = origin?.y ?? 0;\n const out = new Float32Array(world.length);\n for (let i = 0; i + 1 < world.length; i += 2) {\n out[i] = world[i] - ox;\n out[i + 1] = world[i + 1] - oy;\n }\n return out;\n}\n\n/**\n * How far from 0 a coordinate may sit before a producer that picks its own\n * origin (`PathBuilder.autoOrigin`, `transformPath`'s `autoOrigin`) gives the\n * path one: 2^14. Past it a float32 coordinate's step is 1/512 world unit or\n * coarser, so its rounding reaches 1/16 px at 64x zoom; inside it, paths in a\n * document near 0 stay as they always were.\n */\nexport const ORIGIN_THRESHOLD = 16_384;\n\n/** The origin a path through the interleaved pairs `xy` is measured from: none\n * while every coordinate is within {@link ORIGIN_THRESHOLD} of 0, else the\n * center of their bounds, rounded to whole units. */\nexport function originFor(xy: ArrayLike<number>): { x: number; y: number } | undefined {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (let i = 0; i + 1 < xy.length; i += 2) {\n const x = xy[i], y = xy[i + 1];\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 }\n const reach = Math.max(Math.abs(minX), Math.abs(maxX), Math.abs(minY), Math.abs(maxY));\n if (!(reach >= ORIGIN_THRESHOLD) || !Number.isFinite(reach)) return undefined;\n return { x: Math.round((minX + maxX) / 2), y: Math.round((minY + maxY) / 2) };\n}\n\n/** `parts` as one `'nonzero'` compound path, measured from the first part's\n * origin: a part measured from another is re-measured from it in doubles. */\nexport function joinPaths(parts: readonly PolygonPath[]): PolygonPath {\n let nc = 0, nk = 0;\n for (const p of parts) { nc += p.commands.length; nk += p.coords.length; }\n const origin = parts[0]?.origin;\n const commands = new Uint8Array(nc);\n const coords = new Float32Array(nk);\n let ci = 0, ki = 0;\n for (const p of parts) {\n commands.set(p.commands, ci); ci += p.commands.length;\n coords.set(p.origin === origin ? p.coords : coordsFrom(origin, worldCoords(p)), ki); ki += p.coords.length;\n }\n return { kind: 'polygon', commands, coords, fillRule: 'nonzero', ...(origin ? { origin } : {}) };\n}\n","/**\n * Fluent builder for `PolygonPath`. Hides the `Uint8Array` / `Float32Array`\n * encoding behind move/line/curve/close calls and a final `build()`. Use\n * this to construct paths in tests and demos; production callers that need\n * to mutate large paths in place should reach for the raw arrays directly.\n *\n * Numeric capacity grows by doubling — typical for amortized O(1) push.\n *\n * Also exposes `rectPath` / `polygonFromPoints` shortcuts for the common\n * cases. `rectPath` returns the lighter `RectPath` subtype, not a polygon.\n */\n\nimport { rectToContour } from '../box';\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { Path, PathFillRule, PolygonPath, RectPath } from '../path';\nimport { originFor } from './pathOrigin';\n\n/** Fluent builder for `PolygonPath`; hides the `Uint8Array`/`Float32Array` encoding behind move/line/curve/close calls. */\nexport class PathBuilder {\n private cmds: number[] = [];\n private xs: number[] = [];\n private fillRule: PathFillRule = 'nonzero';\n private origin: { x: number; y: number } | undefined;\n private auto = false;\n\n /** Seed a builder with an existing `PolygonPath`. Useful for extending\n * an in-flight path with another segment (e.g. appending a cubic to\n * the end of a curve in response to a user action) without hand-\n * reaching into the `commands` / `coords` typed arrays.\n *\n * ```ts\n * const next = PathBuilder.fromPath(current).curveTo(...).build();\n * ```\n */\n static fromPath(path: PolygonPath): PathBuilder {\n const b = new PathBuilder();\n b.cmds = Array.from(path.commands);\n b.xs = Array.from(path.coords);\n b.fillRule = path.fillRule;\n if (path.origin) b.origin = { x: path.origin.x, y: path.origin.y };\n return b;\n }\n\n /**\n * Measure the coords from `(x, y)`, which the built path carries as its\n * `origin`: every point given before or after this call is still in the\n * path's own space, and is stored as its offset from the origin, taken in\n * doubles. Far from 0, an origin beside the shape is what keeps its\n * coordinates' fractions.\n */\n setOrigin(x: number, y: number): this {\n const ox = this.origin?.x ?? 0;\n const oy = this.origin?.y ?? 0;\n // Stored coords are float32 once built, but not before: shift them exactly.\n for (let i = 0; i < this.xs.length; i += 2) {\n this.xs[i] += ox - x;\n this.xs[i + 1] += oy - y;\n }\n this.origin = x === 0 && y === 0 ? undefined : { x, y };\n return this;\n }\n\n /**\n * At `build`, if no origin was set, measure the coords from the one\n * `originFor` picks for them: none while they stay within\n * `ORIGIN_THRESHOLD` of 0. For a producer whose points may land far out.\n */\n autoOrigin(): this {\n this.auto = true;\n return this;\n }\n\n private push(...pts: number[]): void {\n const ox = this.origin?.x ?? 0;\n const oy = this.origin?.y ?? 0;\n for (let i = 0; i < pts.length; i += 2) this.xs.push(pts[i] - ox, pts[i + 1] - oy);\n }\n\n setFillRule(rule: PathFillRule): this {\n this.fillRule = rule;\n return this;\n }\n\n moveTo(x: number, y: number): this {\n this.cmds.push(PATH_M);\n this.push(x, y);\n return this;\n }\n\n lineTo(x: number, y: number): this {\n this.cmds.push(PATH_L);\n this.push(x, y);\n return this;\n }\n\n /** Cubic bezier to (x, y) with control points (x1, y1) and (x2, y2). */\n curveTo(x1: number, y1: number, x2: number, y2: number, x: number, y: number): this {\n this.cmds.push(PATH_C);\n this.push(x1, y1, x2, y2, x, y);\n return this;\n }\n\n /** Quadratic bezier to (x, y) with control point (x1, y1). */\n quadTo(x1: number, y1: number, x: number, y: number): this {\n this.cmds.push(PATH_Q);\n this.push(x1, y1, x, y);\n return this;\n }\n\n close(): this {\n this.cmds.push(PATH_Z);\n return this;\n }\n\n build(): PolygonPath {\n if (this.auto && !this.origin) {\n const o = originFor(this.xs);\n if (o) this.setOrigin(o.x, o.y);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(this.cmds),\n coords: new Float32Array(this.xs),\n fillRule: this.fillRule,\n ...(this.origin ? { origin: { ...this.origin } } : {}),\n };\n }\n}\n\n/** Construct a `RectPath` (the fast-path subtype). */\nexport function rectPath(x: number, y: number, width: number, height: number): RectPath {\n return { kind: 'rect', x, y, width, height };\n}\n\n/** `path` as a command stream drawing the same outline. A rect becomes its four\n * corners clockwise from `(x, y)`, the order `countPathAnchors` numbers them in. */\nexport function asPolygonPath(path: Path): PolygonPath {\n if (path.kind === 'polygon') return path;\n return {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L, PATH_Z]),\n coords: Float32Array.from(rectToContour(path.x, path.y, path.width, path.height)),\n fillRule: 'nonzero',\n };\n}\n\n/** Build an open polyline from a flat list of points — the same geometry as\n * {@link polygonFromPoints} without the closing edge. A freehand stroke and a\n * measurement line want this; a region wants the closed one. */\nexport function polylineFromPoints(\n points: readonly { x: number; y: number }[],\n): PolygonPath | RectPath {\n const b = new PathBuilder();\n const first = points[0];\n if (!first) return rectPath(0, 0, 0, 0);\n b.moveTo(first.x, first.y);\n for (let i = 1; i < points.length; i++) {\n const p = points[i];\n if (p) b.lineTo(p.x, p.y);\n }\n return b.build();\n}\n\n/** Build a closed polygon from a flat list of points. */\nexport function polygonFromPoints(\n points: readonly { x: number; y: number }[],\n opts: { fillRule?: PathFillRule } = {},\n): PolygonPath {\n if (points.length === 0) {\n return {\n kind: 'polygon',\n commands: new Uint8Array(),\n coords: new Float32Array(),\n fillRule: opts.fillRule ?? 'nonzero',\n };\n }\n const b = new PathBuilder();\n if (opts.fillRule) b.setFillRule(opts.fillRule);\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n b.close();\n return b.build();\n}\n\n/** Cubic-Bezier kappa for circular-quadrant approximation (<1% max error). */\nconst ELLIPSE_KAPPA = 0.5522847498307936;\n\n/** Closed ellipse inscribed in `bounds`, as a 4-cubic-Bezier `PolygonPath`.\n * Matches the geometry `useEllipseTool`'s overlay paints. */\nexport function ellipsePath(\n bounds: { x: number; y: number; width: number; height: number },\n): PolygonPath {\n const cx = bounds.x + bounds.width / 2;\n const cy = bounds.y + bounds.height / 2;\n const rx = bounds.width / 2;\n const ry = bounds.height / 2;\n const ox = rx * ELLIPSE_KAPPA;\n const oy = ry * ELLIPSE_KAPPA;\n const b = new PathBuilder();\n b.moveTo(cx + rx, cy);\n b.curveTo(cx + rx, cy + oy, cx + ox, cy + ry, cx, cy + ry);\n b.curveTo(cx - ox, cy + ry, cx - rx, cy + oy, cx - rx, cy);\n b.curveTo(cx - rx, cy - oy, cx - ox, cy - ry, cx, cy - ry);\n b.curveTo(cx + ox, cy - ry, cx + rx, cy - oy, cx + rx, cy);\n b.close();\n return b.build();\n}\n\n/** Closed regular n-gon centered at `center`, circumscribed by `radius`.\n * `rotation` is in radians; default 0 puts the first vertex on the +x axis. */\nexport function regularPolygonPath(\n center: { x: number; y: number },\n radius: number,\n sides: number,\n rotation = 0,\n): PolygonPath {\n const b = new PathBuilder();\n for (let i = 0; i < sides; i++) {\n const a = rotation + (i / sides) * Math.PI * 2;\n const x = center.x + radius * Math.cos(a);\n const y = center.y + radius * Math.sin(a);\n if (i === 0) b.moveTo(x, y); else b.lineTo(x, y);\n }\n b.close();\n return b.build();\n}\n\n/** Closed n-pointed star centered at `center`, alternating `outerRadius` and\n * `innerRadius` (default `outerRadius / 2`). `rotation` is in radians. */\nexport function starPath(\n center: { x: number; y: number },\n outerRadius: number,\n points = 5,\n innerRadius: number = outerRadius / 2,\n rotation = 0,\n): PolygonPath {\n const b = new PathBuilder();\n const n = points * 2;\n for (let i = 0; i < n; i++) {\n const a = rotation + (i / n) * Math.PI * 2;\n const r = i % 2 === 0 ? outerRadius : innerRadius;\n const x = center.x + r * Math.cos(a);\n const y = center.y + r * Math.sin(a);\n if (i === 0) b.moveTo(x, y); else b.lineTo(x, y);\n }\n b.close();\n return b.build();\n}\n\n/** Open 2-vertex polyline from `a` to `b` — strokeable, not fillable. */\nexport function linePath(\n a: { x: number; y: number },\n b: { x: number; y: number },\n): PolygonPath {\n const pb = new PathBuilder();\n pb.moveTo(a.x, a.y);\n pb.lineTo(b.x, b.y);\n return pb.build();\n}\n","/**\n * Per-anchor corner specs: the stored half of corner shapes. A path carries\n * them in `PolygonPath.corners`, indexed by flat anchor index, and every\n * reader of its geometry sees them expanded (`resolveCorners`).\n */\nimport type { PolygonPath } from '../path';\nimport type { CornerShape } from './cornerShape';\n\n/** The corner at one anchor: its shape, and its setback, how far along each\n * edge from the anchor the cut starts. A `round` corner between edges at a\n * right angle is a circle of that radius. */\nexport interface CornerSpec {\n shape: CornerShape;\n radius: number;\n}\n\n/** The corner cut at flat anchor `index`, or null. A zero radius cuts nothing. */\nexport function cornerAt(path: PolygonPath, index: number): CornerSpec | null {\n const spec = path.corners?.[index];\n return spec && spec.radius > 0 ? spec : null;\n}\n\n/** The spec stored at flat anchor `index`, radius zero included: a shape\n * picked before any radius is dragged out. */\nexport function cornerSpecAt(path: PolygonPath, index: number): CornerSpec | null {\n return path.corners?.[index] ?? null;\n}\n\n/** Whether any anchor of `path` carries a corner with a radius. */\nexport function hasCorners(path: { kind: string; corners?: PolygonPath['corners'] }): boolean {\n const corners = path.corners;\n if (!corners) return false;\n for (const c of corners) if (c && c.radius > 0) return true;\n return false;\n}\n\n/** `corners` without trailing empty slots, or undefined when none is left. */\nexport function compactCorners(\n corners: readonly (CornerSpec | null | undefined)[],\n): (CornerSpec | null)[] | undefined {\n let end = corners.length;\n while (end > 0 && !corners[end - 1]) end--;\n if (end === 0) return undefined;\n const out: (CornerSpec | null)[] = new Array(end);\n for (let i = 0; i < end; i++) out[i] = corners[i] ?? null;\n return out;\n}\n\n/** `path` without its corner specs: the bare anchors the specs decorate. */\nexport function withoutCorners(path: PolygonPath): PolygonPath {\n if (path.corners === undefined) return path;\n const { corners: _dropped, ...rest } = path;\n return rest;\n}\n\n/** `path` with the corner at flat anchor `index` set to `spec`, or cleared\n * when `spec` is null. A zero radius keeps the shape and cuts nothing.\n * Never mutates `path`. */\nexport function withCorner(path: PolygonPath, index: number, spec: CornerSpec | null): PolygonPath {\n const next: (CornerSpec | null)[] = path.corners ? [...path.corners] : [];\n while (next.length <= index) next.push(null);\n next[index] = spec ? { shape: spec.shape, radius: Math.max(0, spec.radius) } : null;\n const corners = compactCorners(next);\n const bare = withoutCorners(path);\n return corners ? { ...bare, corners } : bare;\n}\n\n/** `path` with every corner radius multiplied by `factor`, as a uniform\n * scale of its geometry would carry them. */\nexport function scaleCorners(path: PolygonPath, factor: number): PolygonPath {\n if (!path.corners || factor === 1) return path;\n return {\n ...path,\n corners: path.corners.map((c) => (c ? { shape: c.shape, radius: c.radius * factor } : null)),\n };\n}\n\n/**\n * The corners of a path `t` of the way from `a` to `b`, which share their\n * anchors. A corner whose shape both ends agree on, or that one end leaves\n * sharp, grows its radius between them; one whose shape changes takes the\n * nearer end's.\n */\nexport function lerpCorners(\n a: PolygonPath['corners'],\n b: PolygonPath['corners'],\n t: number,\n): (CornerSpec | null)[] | undefined {\n if (!a && !b) return undefined;\n const n = Math.max(a?.length ?? 0, b?.length ?? 0);\n const out: (CornerSpec | null)[] = new Array(n);\n for (let i = 0; i < n; i++) {\n const ca = a?.[i] ?? null, cb = b?.[i] ?? null;\n const either = ca ?? cb;\n if (!either) out[i] = null;\n else if (ca && cb && ca.shape !== cb.shape) out[i] = t < 0.5 ? ca : cb;\n else out[i] = { shape: either.shape, radius: (ca?.radius ?? 0) + ((cb?.radius ?? 0) - (ca?.radius ?? 0)) * t };\n }\n return compactCorners(out);\n}\n","import { cubicEvalAt, splitCubicAt, type CubicCoords } from '../curve';\n\n/** A 2D point, the shape the point-taking path helpers read and return. */\nexport interface Point { x: number; y: number; }\n\n/** Point on the cubic Bezier (p0, p1, p2, p3) at parameter t. The point-shaped\n * face of geom's `cubicEvalAt`. */\nexport function cubicPointAt(p0: Point, p1: Point, p2: Point, p3: Point, t: number): Point {\n const [x, y] = cubicEvalAt(p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, t);\n return { x, y };\n}\n\n/** De Casteljau subdivision of a cubic at parameter t. The point-shaped face\n * of geom's `splitCubicAt`; `left[3]` and `right[0]` are the point at t. */\nexport function splitCubicAtT(\n p0: Point, p1: Point, p2: Point, p3: Point,\n t: number,\n): { left: [Point, Point, Point, Point]; right: [Point, Point, Point, Point] } {\n const [l, r] = splitCubicAt(p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, t);\n const quad = (c: CubicCoords): [Point, Point, Point, Point] =>\n [{ x: c[0], y: c[1] }, { x: c[2], y: c[3] }, { x: c[4], y: c[5] }, { x: c[6], y: c[7] }];\n return { left: quad(l), right: quad(r) };\n}\n"]}
@@ -1,5 +1,7 @@
1
- import { resolveCorners, DEFAULT_FLATTEN_TOLERANCE, flattenCubicWithArcLen, flattenQuadraticWithArcLen } from './chunk-EURWZUNY.js';
2
- import { rectToContour, forEachSegment, PATH_Z, PATH_C, PATH_Q, PATH_L, PATH_M } from './chunk-B3D6KWW3.js';
1
+ import { segmentCoords, bezierPoint } from './chunk-QSVZO7QZ.js';
2
+ import { resolveCorners, DEFAULT_FLATTEN_TOLERANCE, flattenCubicWithArcLen, flattenQuadraticWithArcLen } from './chunk-TBS4NHGQ.js';
3
+ import { segmentLength } from './chunk-IOD2NFHQ.js';
4
+ import { rectToContour, forEachSegment, PATH_Z, PATH_C, PATH_Q, PATH_L, PATH_M } from './chunk-346XYYMX.js';
3
5
 
4
6
  // src/tessellate/polyline.ts
5
7
  function extractPolylines(path, opts = {}) {
@@ -27,6 +29,7 @@ function extractPolygon(p, opts) {
27
29
  let aT = null;
28
30
  let current = null;
29
31
  let prevAnchor = -1;
32
+ let dropped;
30
33
  let startAnchor = 0;
31
34
  const beginContour = () => {
32
35
  pts = [];
@@ -37,21 +40,13 @@ function extractPolygon(p, opts) {
37
40
  out.push(next);
38
41
  return next;
39
42
  };
40
- const dropDuplicateClosingPoint = () => {
41
- if (!pts || !aA || !aB || !aT) return;
42
- const n = pts.length / 2;
43
- if (n < 2) return;
44
- if (pts[0] !== pts[(n - 1) * 2] || pts[1] !== pts[(n - 1) * 2 + 1]) return;
45
- pts.length -= 2;
46
- aA.length -= 1;
47
- aB.length -= 1;
48
- aT.length -= 1;
49
- };
50
43
  const commit = (target) => {
51
44
  if (!pts || !aA || !aB || !aT) return;
52
45
  target.anchorA = new Uint32Array(aA);
53
46
  target.anchorB = new Uint32Array(aB);
54
47
  target.anchorT = new Float32Array(aT);
48
+ if (dropped !== void 0) target.closeAnchor = dropped;
49
+ dropped = void 0;
55
50
  };
56
51
  const pushCurveAnchors = (segStart, arcAccum, total, target) => {
57
52
  for (let k = 0; k < arcAccum.length; k++) {
@@ -137,7 +132,7 @@ function extractPolygon(p, opts) {
137
132
  case PATH_Z: {
138
133
  if (current) {
139
134
  current.closed = true;
140
- dropDuplicateClosingPoint();
135
+ if (pts && aA && aB && aT) dropped = dropDuplicateClosingPoint(pts, aA, aB, aT) ?? dropped;
141
136
  }
142
137
  break;
143
138
  }
@@ -148,7 +143,78 @@ function extractPolygon(p, opts) {
148
143
  if (current) commit(current);
149
144
  return out;
150
145
  }
146
+ function dropDuplicateClosingPoint(pts, aA, aB, aT) {
147
+ const n = pts.length / 2;
148
+ if (n < 2) return void 0;
149
+ if (pts[0] !== pts[(n - 1) * 2] || pts[1] !== pts[(n - 1) * 2 + 1]) return void 0;
150
+ const anchor = aA[n - 1] === aB[n - 1] ? aA[n - 1] : void 0;
151
+ pts.length -= 2;
152
+ aA.length -= 1;
153
+ aB.length -= 1;
154
+ aT.length -= 1;
155
+ return anchor;
156
+ }
157
+
158
+ // src/tessellate/atCurve.ts
159
+ function polylineAtCurve(pl, segment, t, run) {
160
+ const p = pl.points;
161
+ const n = p.length / 2;
162
+ const ends = anchorIndices(pl, n);
163
+ if (ends.length < 2) return { length: 0, x: p[0] ?? 0, y: p[1] ?? 0 };
164
+ const k = Math.min(Math.max(Math.floor(segment), 0), ends.length - 2);
165
+ const f = Math.min(Math.max(t, 0), 1);
166
+ const i0 = ends[k];
167
+ const i1 = ends[k + 1];
168
+ const ctl = run?.controls?.[k];
169
+ const seg = ctl && ctl.length > 0 ? segmentCoords([p[i0 * 2], p[i0 * 2 + 1], p[i1 % n * 2], p[i1 % n * 2 + 1]], ctl, 2, 0) : null;
170
+ let x, y;
171
+ if (seg) [x, y] = bezierPoint(seg, 2, f);
172
+ else {
173
+ x = lerp(p[i0 * 2], p[i1 % n * 2], f);
174
+ y = lerp(p[i0 * 2 + 1], p[i1 % n * 2 + 1], f);
175
+ }
176
+ const { chord, u } = !seg && i1 - i0 === 1 ? { chord: i0, u: f } : chordOf(pl, n, i0, i1, x, y, seg ? arcShare(seg, f) : f);
177
+ let length = 0;
178
+ for (let i = 0; i < chord; i++) length += chordLength(p, n, i);
179
+ return { length: length + u * chordLength(p, n, chord), x, y };
180
+ }
181
+ function anchorIndices(pl, n) {
182
+ const { anchorA: A, anchorB: B } = pl;
183
+ const out = [];
184
+ for (let i = 0; i < n; i++) if (!A || !B || A[i] === B[i]) out.push(i);
185
+ if (pl.closed && n >= 2) out.push(n);
186
+ return out;
187
+ }
188
+ function chordOf(pl, n, i0, i1, x, y, share) {
189
+ const T = pl.anchorT;
190
+ const at = (i) => i >= i1 ? 1 : i <= i0 ? 0 : T ? T[i] : (i - i0) / (i1 - i0);
191
+ let j = i0;
192
+ while (j < i1 - 1 && at(j + 1) <= share) j++;
193
+ let u = project(pl.points, n, j, x, y);
194
+ const step = u < 0 ? -1 : u > 1 ? 1 : 0;
195
+ while (step !== 0 && j + step >= i0 && j + step < i1 && (step < 0 ? u < 0 : u > 1)) {
196
+ j += step;
197
+ u = project(pl.points, n, j, x, y);
198
+ }
199
+ return { chord: j, u: Math.min(Math.max(u, 0), 1) };
200
+ }
201
+ function project(p, n, i, x, y) {
202
+ const ax = p[i * 2], ay = p[i * 2 + 1];
203
+ const j = (i + 1) % n;
204
+ const dx = p[j * 2] - ax, dy = p[j * 2 + 1] - ay;
205
+ const l2 = dx * dx + dy * dy;
206
+ return l2 > 0 ? ((x - ax) * dx + (y - ay) * dy) / l2 : 0;
207
+ }
208
+ function chordLength(p, n, i) {
209
+ const j = (i + 1) % n;
210
+ return Math.hypot(p[j * 2] - p[i * 2], p[j * 2 + 1] - p[i * 2 + 1]);
211
+ }
212
+ function arcShare(seg, t) {
213
+ const whole = segmentLength(seg, 2);
214
+ return whole > 0 ? segmentLength(seg, 2, 0, t) / whole : t;
215
+ }
216
+ var lerp = (a, b, f) => a + (b - a) * f;
151
217
 
152
- export { extractPolylines };
153
- //# sourceMappingURL=chunk-FROQPADA.js.map
154
- //# sourceMappingURL=chunk-FROQPADA.js.map
218
+ export { extractPolylines, polylineAtCurve };
219
+ //# sourceMappingURL=chunk-5W425HJA.js.map
220
+ //# sourceMappingURL=chunk-5W425HJA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tessellate/polyline.ts","../src/tessellate/atCurve.ts"],"names":[],"mappings":"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","file":"chunk-5W425HJA.js","sourcesContent":["import { forEachSegment, PATH_M, PATH_L, PATH_Z, PATH_C, PATH_Q } from '../commands';\nimport { resolveCorners } from '../paths/corners';\nimport { rectToContour } from '../box';\nimport { DEFAULT_FLATTEN_TOLERANCE, flattenCubicWithArcLen, flattenQuadraticWithArcLen } from '../flatten';\nimport type { Path, PolygonPath, RectPath } from '../path';\n\n/** One contour of a path, flattened to straight segments. */\nexport interface Polyline {\n /** Interleaved x,y vertices (length = 2 × point count). */\n points: number[];\n /** Whether the contour was closed (ends with Z, or is a RectPath). */\n closed: boolean;\n /** For each point, the previous anchor index. Anchor-aligned points set A === B. */\n anchorA?: Uint32Array;\n /** For each point, the next anchor index. */\n anchorB?: Uint32Array;\n /** For each point, the arc-length fraction along (A, B). 0 at anchor A; for anchor-aligned, set to 0. */\n anchorT?: Float32Array;\n /** A closed contour's last anchor when it repeated the first point and was\n * dropped for that; the closing edge ends at it. */\n closeAnchor?: number;\n /** Per-point stroke width, populated by the tessellator when the Stroke\n * carries `vertexWidths`. Undefined means uniform `Stroke.width`. */\n widths?: Float32Array;\n /** Per-point distance the ribbon's middle sits off the path toward the\n * normal `(−dy, dx)` of the direction of travel: half the right edge's\n * distance less the left's. Set alongside `widths` only when the two sides\n * differ somewhere; undefined means centered. */\n offsets?: Float32Array;\n}\n\n/** Options for `extractPolylines`. */\nexport interface ExtractOptions {\n flattenTolerance?: number;\n /** How far out from the path its outermost edge sits, as a stroke's half\n * width does. Flattening keeps that edge within `flattenTolerance` of the\n * true one too. Unset, only the path itself is. */\n offset?: number;\n}\n\n/** Flatten each contour of a path to a straight-segment polyline, carrying the\n * anchor parameterization per point. A rect yields one closed contour. */\nexport function extractPolylines(path: Path, opts: ExtractOptions = {}): Polyline[] {\n if (path.kind === 'rect') return [extractRect(path)];\n return extractPolygon(resolveCorners(path), opts);\n}\n\nfunction extractRect(p: RectPath): Polyline {\n const { x, y, width: w, height: h } = p;\n return {\n points: Array.from(rectToContour(x, y, w, h)),\n closed: true,\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 };\n}\n\nfunction extractPolygon(p: PolygonPath, opts: ExtractOptions): Polyline[] {\n const tolerance = opts.flattenTolerance ?? DEFAULT_FLATTEN_TOLERANCE;\n const { commands, coords } = p;\n const out: Polyline[] = [];\n // Anchors are numbered globally (across all contours) in command-stream order.\n let anchorCounter = 0;\n\n // Builders for the current polyline.\n let pts: number[] | null = null;\n let aA: number[] | null = null;\n let aB: number[] | null = null;\n let aT: number[] | null = null;\n let current: Polyline | null = null;\n\n let prevAnchor = -1;\n let dropped: number | undefined;\n // The anchor a subpath opened by a bare drawing command starts from.\n let startAnchor = 0;\n\n const beginContour = (): Polyline => {\n pts = [];\n aA = [];\n aB = [];\n aT = [];\n const next: Polyline = { points: pts, closed: false };\n out.push(next);\n return next;\n };\n\n const commit = (target: Polyline): void => {\n if (!pts || !aA || !aB || !aT) return;\n target.anchorA = new Uint32Array(aA);\n target.anchorB = new Uint32Array(aB);\n target.anchorT = new Float32Array(aT);\n if (dropped !== undefined) target.closeAnchor = dropped;\n dropped = undefined;\n };\n\n // Fill anchorA/B/T for each point a curve just appended: interior points\n // interpolate (prevAnchor → target), and the final point is pinned to the\n // target so the draw-time lerp returns anchor B's color exactly.\n const pushCurveAnchors = (segStart: number, arcAccum: number[], total: number, target: number): void => {\n for (let k = 0; k < arcAccum.length; k++) {\n aA!.push(prevAnchor);\n aB!.push(target);\n aT!.push(total > 0 ? arcAccum[k] / total : 0);\n }\n const lastIdx = (segStart + arcAccum.length) - 1;\n aA![lastIdx] = target;\n aB![lastIdx] = target;\n aT![lastIdx] = 0;\n };\n\n forEachSegment(commands, coords, (cmd, coordIdx, prevX, prevY, _i, opensSubpath) => {\n if (opensSubpath) {\n if (current) commit(current);\n current = beginContour();\n pts!.push(prevX, prevY);\n aA!.push(startAnchor);\n aB!.push(startAnchor);\n aT!.push(0);\n prevAnchor = startAnchor;\n }\n switch (cmd) {\n case PATH_M:\n case PATH_L: {\n if (cmd === PATH_M) {\n if (current) commit(current);\n current = beginContour();\n startAnchor = anchorCounter;\n }\n pts!.push(coords[coordIdx], coords[coordIdx + 1]);\n aA!.push(anchorCounter);\n aB!.push(anchorCounter);\n aT!.push(0);\n prevAnchor = anchorCounter;\n anchorCounter++;\n break;\n }\n case PATH_Q: {\n const target = anchorCounter;\n const segStart = pts!.length / 2;\n const arcAccum: number[] = [];\n const total = flattenQuadraticWithArcLen(\n prevX, prevY,\n coords[coordIdx], coords[coordIdx + 1],\n coords[coordIdx + 2], coords[coordIdx + 3],\n tolerance, pts!, arcAccum, opts.offset,\n );\n pushCurveAnchors(segStart, arcAccum, total, target);\n prevAnchor = target;\n anchorCounter++;\n break;\n }\n case PATH_C: {\n const target = anchorCounter;\n const segStart = pts!.length / 2;\n const arcAccum: number[] = [];\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, pts!, arcAccum, opts.offset,\n );\n pushCurveAnchors(segStart, arcAccum, total, target);\n prevAnchor = target;\n anchorCounter++;\n break;\n }\n case PATH_Z: {\n if (current) {\n current.closed = true;\n if (pts && aA && aB && aT) dropped = dropDuplicateClosingPoint(pts, aA, aB, aT) ?? dropped;\n }\n break;\n }\n default:\n throw new Error(`extractPolylines: unknown command code ${cmd}`);\n }\n });\n\n if (current) commit(current);\n return out;\n}\n\n/**\n * A closed contour's last point repeating its first leaves a zero-length\n * closing segment, which the stroker discards along with the wrap-around\n * join it should have carried, notching the ribbon at the contour's start.\n * Every font outline serialized by opentype.js is written this way. Exact\n * equality is the right test: the duplicate is a re-emission of the same\n * number, and a near-miss is a genuine (if tiny) segment the author asked for.\n * Answers the dropped point's anchor, when it was one.\n */\nfunction dropDuplicateClosingPoint(pts: number[], aA: number[], aB: number[], aT: number[]): number | undefined {\n const n = pts.length / 2;\n if (n < 2) return undefined;\n if (pts[0] !== pts[(n - 1) * 2] || pts[1] !== pts[(n - 1) * 2 + 1]) return undefined;\n const anchor = aA[n - 1] === aB[n - 1] ? aA[n - 1] : undefined;\n pts.length -= 2;\n aA.length -= 1;\n aB.length -= 1;\n aT.length -= 1;\n return anchor;\n}\n","import { bezierPoint, segmentCoords } from '../along/bezier';\nimport type { LengthRun } from '../along/lengthTable';\nimport { segmentLength } from '../paths/segmentLength';\nimport type { Polyline } from './polyline';\n\n/** A curve position found on one flattening of its run. */\nexport interface PolylinePlace {\n /** How far from the polyline's first point it sits, along the polyline: the polyline's own measure. */\n length: number;\n /** The point itself, on the curve rather than on the chord beside it. */\n x: number;\n y: number;\n}\n\n/**\n * Where curve position (`segment`, `t`) falls on `pl`, a flattening of `run`.\n * Segment `k` runs from `pl`'s `k`-th anchor-aligned point to the next, a\n * closed `pl`'s closing edge last, as `pathLengthTable` counts them; `run`\n * gives each curve's control points, and without one every segment is\n * straight. The ends come from `pl`, so a run of the same shape carried\n * elsewhere (a rect shifted by alignment) places onto it too.\n */\nexport function polylineAtCurve(pl: Polyline, segment: number, t: number, run?: LengthRun): PolylinePlace {\n const p = pl.points;\n const n = p.length / 2;\n const ends = anchorIndices(pl, n);\n if (ends.length < 2) return { length: 0, x: p[0] ?? 0, y: p[1] ?? 0 };\n const k = Math.min(Math.max(Math.floor(segment), 0), ends.length - 2);\n const f = Math.min(Math.max(t, 0), 1);\n const i0 = ends[k];\n const i1 = ends[k + 1];\n const ctl = run?.controls?.[k];\n const seg = ctl && ctl.length > 0 ? segmentCoords([p[i0 * 2], p[i0 * 2 + 1], p[(i1 % n) * 2], p[(i1 % n) * 2 + 1]], ctl, 2, 0) : null;\n let x: number, y: number;\n if (seg) [x, y] = bezierPoint(seg, 2, f);\n else {\n x = lerp(p[i0 * 2], p[(i1 % n) * 2], f);\n y = lerp(p[i0 * 2 + 1], p[(i1 % n) * 2 + 1], f);\n }\n const { chord, u } = !seg && i1 - i0 === 1 ? { chord: i0, u: f } : chordOf(pl, n, i0, i1, x, y, seg ? arcShare(seg, f) : f);\n let length = 0;\n for (let i = 0; i < chord; i++) length += chordLength(p, n, i);\n return { length: length + u * chordLength(p, n, chord), x, y };\n}\n\n/** The indices of `pl`'s anchor-aligned points, then `n` for a closed one's return to its first. */\nfunction anchorIndices(pl: Polyline, n: number): number[] {\n const { anchorA: A, anchorB: B } = pl;\n const out: number[] = [];\n for (let i = 0; i < n; i++) if (!A || !B || A[i] === B[i]) out.push(i);\n if (pl.closed && n >= 2) out.push(n);\n return out;\n}\n\n/** Of the chords from `i0` to `i1`, the one point (x, y) lies beside and how far along it: first by\n * arc-length share `share`, then by projection, which a flattening keeps within its tolerance. */\nfunction chordOf(\n pl: Polyline, n: number, i0: number, i1: number, x: number, y: number, share: number,\n): { chord: number; u: number } {\n const T = pl.anchorT;\n const at = (i: number) => (i >= i1 ? 1 : i <= i0 ? 0 : T ? T[i] : (i - i0) / (i1 - i0));\n let j = i0;\n while (j < i1 - 1 && at(j + 1) <= share) j++;\n let u = project(pl.points, n, j, x, y);\n // Step toward the chord the point projects onto, never back the way it came.\n const step = u < 0 ? -1 : u > 1 ? 1 : 0;\n while (step !== 0 && j + step >= i0 && j + step < i1 && (step < 0 ? u < 0 : u > 1)) {\n j += step;\n u = project(pl.points, n, j, x, y);\n }\n return { chord: j, u: Math.min(Math.max(u, 0), 1) };\n}\n\nfunction project(p: readonly number[], n: number, i: number, x: number, y: number): number {\n const ax = p[i * 2], ay = p[i * 2 + 1];\n const j = (i + 1) % n;\n const dx = p[j * 2] - ax, dy = p[j * 2 + 1] - ay;\n const l2 = dx * dx + dy * dy;\n return l2 > 0 ? ((x - ax) * dx + (y - ay) * dy) / l2 : 0;\n}\n\nfunction chordLength(p: readonly number[], n: number, i: number): number {\n const j = (i + 1) % n;\n return Math.hypot(p[j * 2] - p[i * 2], p[j * 2 + 1] - p[i * 2 + 1]);\n}\n\n/** The share of `seg`'s arc length that lies before parameter `t`. */\nfunction arcShare(seg: readonly number[], t: number): number {\n const whole = segmentLength(seg, 2);\n return whole > 0 ? segmentLength(seg, 2, 0, t) / whole : t;\n}\n\nconst lerp = (a: number, b: number, f: number): number => a + (b - a) * f;\n"]}
@@ -0,0 +1,82 @@
1
+ // src/scalar.ts
2
+ var EPS = 1e-6;
3
+ var SINGULAR_RATIO = 1e-12;
4
+ function clamp(v, lo, hi) {
5
+ const c = v > hi ? hi : v;
6
+ return c < lo ? lo : c;
7
+ }
8
+ function clamp01(v) {
9
+ return v < 0 ? 0 : v > 1 ? 1 : v;
10
+ }
11
+ function lerp(a, b, t) {
12
+ return a + (b - a) * t;
13
+ }
14
+ function cross(ax, ay, bx, by) {
15
+ return ax * by - ay * bx;
16
+ }
17
+ function dot(ax, ay, bx, by) {
18
+ return ax * bx + ay * by;
19
+ }
20
+ function sub(ax, ay, bx, by) {
21
+ return [ax - bx, ay - by];
22
+ }
23
+ function len2(x, y) {
24
+ return x * x + y * y;
25
+ }
26
+ function sign(n) {
27
+ return n > 0 ? 1 : n < 0 ? -1 : 0;
28
+ }
29
+ function approxEq(a, b, eps = EPS) {
30
+ if (a === b) return true;
31
+ const diff = Math.abs(a - b);
32
+ if (!Number.isFinite(diff)) return false;
33
+ const scale = Math.max(1, Math.abs(a), Math.abs(b));
34
+ return diff <= eps * scale;
35
+ }
36
+
37
+ // src/points.ts
38
+ function distance2(a, b) {
39
+ let s = 0;
40
+ for (let i = 0; i < a.length; i++) {
41
+ const d = a[i] - b[i];
42
+ s += d * d;
43
+ }
44
+ return s;
45
+ }
46
+ function distance(a, b) {
47
+ return Math.sqrt(distance2(a, b));
48
+ }
49
+ function lerp2(a, b, t) {
50
+ const out = [];
51
+ for (let i = 0; i < a.length; i++) out.push(lerp(a[i], b[i], t));
52
+ return out;
53
+ }
54
+ function segmentTFrom(wv, vv) {
55
+ if (!(vv > 0)) return 0;
56
+ const t = wv / vv;
57
+ return t < 0 ? 0 : t > 1 ? 1 : t;
58
+ }
59
+ function segmentT(p, a, b) {
60
+ let wv = 0;
61
+ let vv = 0;
62
+ for (let i = 0; i < a.length; i++) {
63
+ const v = b[i] - a[i];
64
+ wv += (p[i] - a[i]) * v;
65
+ vv += v * v;
66
+ }
67
+ return segmentTFrom(wv, vv);
68
+ }
69
+ function closestPointOnSegment(p, a, b) {
70
+ const t = segmentT(p, a, b);
71
+ return t === 1 ? b.slice() : lerp2(a, b, t);
72
+ }
73
+ function pointSegmentDist2(p, a, b) {
74
+ return distance2(p, closestPointOnSegment(p, a, b));
75
+ }
76
+ function pointSegmentDist(p, a, b) {
77
+ return Math.sqrt(pointSegmentDist2(p, a, b));
78
+ }
79
+
80
+ export { EPS, SINGULAR_RATIO, approxEq, clamp, clamp01, closestPointOnSegment, cross, distance, distance2, dot, len2, lerp, lerp2, pointSegmentDist, pointSegmentDist2, segmentT, segmentTFrom, sign, sub };
81
+ //# sourceMappingURL=chunk-DNX24KBT.js.map
82
+ //# sourceMappingURL=chunk-DNX24KBT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/scalar.ts","../src/points.ts"],"names":["lerp"],"mappings":";AASO,IAAM,GAAA,GAAM;AAKZ,IAAM,cAAA,GAAiB;AAGvB,SAAS,KAAA,CAAM,CAAA,EAAW,EAAA,EAAY,EAAA,EAAoB;AAC/D,EAAA,MAAM,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,CAAA;AACxB,EAAA,OAAO,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AACvB;AAGO,SAAS,QAAQ,CAAA,EAAmB;AACzC,EAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AACjC;AAGO,SAAS,IAAA,CAAK,CAAA,EAAW,CAAA,EAAW,CAAA,EAAmB;AAC5D,EAAA,OAAO,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AACvB;AAGO,SAAS,KAAA,CAAM,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAoB;AAC5E,EAAA,OAAO,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACxB;AAGO,SAAS,GAAA,CAAI,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAoB;AAC1E,EAAA,OAAO,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AACxB;AAGO,SAAS,GAAA,CAAI,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAA8B;AACpF,EAAA,OAAO,CAAC,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA;AAC1B;AAGO,SAAS,IAAA,CAAK,GAAW,CAAA,EAAmB;AACjD,EAAA,OAAO,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AACrB;AAGO,SAAS,KAAK,CAAA,EAAuB;AAC1C,EAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA;AAClC;AAaO,SAAS,QAAA,CAAS,CAAA,EAAW,CAAA,EAAW,GAAA,GAAc,GAAA,EAAc;AACzE,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA;AAG3B,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,GAAG,OAAO,KAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAClD,EAAA,OAAO,QAAQ,GAAA,GAAM,KAAA;AACvB;;;AC9DO,SAAS,SAAA,CAAU,GAAsB,CAAA,EAA8B;AAC5E,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAK,EAAE,CAAC,CAAA;AACrB,IAAA,CAAA,IAAK,CAAA,GAAI,CAAA;AAAA,EACX;AACA,EAAA,OAAO,CAAA;AACT;AAGO,SAAS,QAAA,CAAS,GAAsB,CAAA,EAA8B;AAC3E,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA;AAClC;AAGO,SAASA,KAAAA,CAAK,CAAA,EAAsB,CAAA,EAAsB,CAAA,EAAqB;AACpF,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,KAAK,GAAA,CAAI,IAAA,CAAK,IAAA,CAAW,CAAA,CAAE,CAAC,CAAA,EAAI,CAAA,CAAE,CAAC,CAAA,EAAI,CAAC,CAAC,CAAA;AACvE,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,YAAA,CAAa,IAAY,EAAA,EAAoB;AAC3D,EAAA,IAAI,EAAE,EAAA,GAAK,CAAA,CAAA,EAAI,OAAO,CAAA;AACtB,EAAA,MAAM,IAAI,EAAA,GAAK,EAAA;AACf,EAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AACjC;AAIO,SAAS,QAAA,CAAS,CAAA,EAAsB,CAAA,EAAsB,CAAA,EAA8B;AACjG,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAK,EAAE,CAAC,CAAA;AACrB,IAAA,EAAA,IAAA,CAAO,CAAA,CAAE,CAAC,CAAA,GAAK,CAAA,CAAE,CAAC,CAAA,IAAM,CAAA;AACxB,IAAA,EAAA,IAAM,CAAA,GAAI,CAAA;AAAA,EACZ;AACA,EAAA,OAAO,YAAA,CAAa,IAAI,EAAE,CAAA;AAC5B;AAIO,SAAS,qBAAA,CACd,CAAA,EACA,CAAA,EACA,CAAA,EACU;AACV,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC1B,EAAA,OAAO,CAAA,KAAM,IAAI,CAAA,CAAE,KAAA,KAAUA,KAAAA,CAAK,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3C;AAGO,SAAS,iBAAA,CAAkB,CAAA,EAAsB,CAAA,EAAsB,CAAA,EAA8B;AAC1G,EAAA,OAAO,UAAU,CAAA,EAAG,qBAAA,CAAsB,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AACpD;AAGO,SAAS,gBAAA,CAAiB,CAAA,EAAsB,CAAA,EAAsB,CAAA,EAA8B;AACzG,EAAA,OAAO,KAAK,IAAA,CAAK,iBAAA,CAAkB,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAC7C","file":"chunk-DNX24KBT.js","sourcesContent":["/**\n * Scalar / 2-vector primitives and the kernel-wide epsilon policy.\n *\n * Points are scalar pairs (px, py); there is no point struct. All math is\n * f64 (JS-native). Epsilons are f32-SCALE and magnitude-relative, because\n * stored coords are quantized to Float32 (~7 significant digits).\n */\n\n/** Base relative epsilon, sized for Float32 storage (~1 part in 1e-6). */\nexport const EPS = 1e-6;\n\n/** A determinant at or below this fraction of its matrix's own scale counts as\n * singular. Dimensionless, so a uniformly tiny matrix still inverts while a\n * large one whose determinant is only rounding does not. */\nexport const SINGULAR_RATIO = 1e-12;\n\n/** `v` held to `lo`..`hi`. `lo` wins when the bounds cross; `NaN` passes through. */\nexport function clamp(v: number, lo: number, hi: number): number {\n const c = v > hi ? hi : v;\n return c < lo ? lo : c;\n}\n\n/** `v` held to `0`..`1`; `NaN` passes through. */\nexport function clamp01(v: number): number {\n return v < 0 ? 0 : v > 1 ? 1 : v;\n}\n\n/** The number `t` of the way from `a` to `b`; `t` outside [0, 1] extrapolates. */\nexport function lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/** 2D cross (wedge) product of vectors (ax,ay) and (bx,by). */\nexport function cross(ax: number, ay: number, bx: number, by: number): number {\n return ax * by - ay * bx;\n}\n\n/** 2D dot product. */\nexport function dot(ax: number, ay: number, bx: number, by: number): number {\n return ax * bx + ay * by;\n}\n\n/** Component difference (ax-bx, ay-by) as a tuple. Cold-path use only. */\nexport function sub(ax: number, ay: number, bx: number, by: number): [number, number] {\n return [ax - bx, ay - by];\n}\n\n/** Squared length of (x,y). Avoids the sqrt; compare against squared thresholds. */\nexport function len2(x: number, y: number): number {\n return x * x + y * y;\n}\n\n/** Three-valued sign. */\nexport function sign(n: number): -1 | 0 | 1 {\n return n > 0 ? 1 : n < 0 ? -1 : 0;\n}\n\n/**\n * Magnitude-scaled approximate equality. Two values are equal when their\n * absolute difference is within EPS scaled by the larger magnitude. Every\n * comparison of two *computed coordinates* goes through this — never `===`,\n * never an f64-tight literal.\n *\n * The exception is a guard against an exact algebraic value that a formula\n * produces bit-for-bit: a homogeneous `w === 1`, a ray's `d === 0`. Those are\n * testing a branch, not comparing coordinates. Widening one to `approxEq`\n * would change which branch runs, not how precisely it runs.\n */\nexport function approxEq(a: number, b: number, eps: number = EPS): boolean {\n if (a === b) return true; // also the only way two infinities compare equal\n const diff = Math.abs(a - b);\n // Infinity/Infinity is 1, so an unguarded relative test calls every finite\n // number equal to an infinity.\n if (!Number.isFinite(diff)) return false;\n const scale = Math.max(1, Math.abs(a), Math.abs(b));\n return diff <= eps * scale;\n}\n","/**\n * Points and segments over plain number arrays, in any dimension: how far\n * apart two points are, the point part of the way between them, and the\n * nearest point of a segment.\n *\n * Published as is from `./nd`. The 2D barrel states the same rules over loose\n * scalars in `./points2` (they run per pointermove and per vertex, so they\n * must not allocate), and `./3d` wraps these in `Vec3`. Both use the scalar\n * `lerp` and `segmentTFrom` below, so the tiers return the same numbers.\n */\n\nimport { lerp as lerpScalar } from './scalar';\n\n/** Squared distance between two points. Compare with this and skip the root. */\nexport function distance2(a: readonly number[], b: readonly number[]): number {\n let s = 0;\n for (let i = 0; i < a.length; i++) {\n const d = a[i]! - b[i]!;\n s += d * d;\n }\n return s;\n}\n\n/** Euclidean distance between two points. */\nexport function distance(a: readonly number[], b: readonly number[]): number {\n return Math.sqrt(distance2(a, b));\n}\n\n/** The point `t` of the way from `a` to `b`; `t` outside [0, 1] extrapolates. */\nexport function lerp(a: readonly number[], b: readonly number[], t: number): number[] {\n const out: number[] = [];\n for (let i = 0; i < a.length; i++) out.push(lerpScalar(a[i]!, b[i]!, t));\n return out;\n}\n\n/** The segment parameter from `w·v` and `v·v`, where `v` runs along the\n * segment and `w` from its start to the point: clamped to [0, 1], and 0 on a\n * zero-length segment. Shared with `./points2`; not public. */\nexport function segmentTFrom(wv: number, vv: number): number {\n if (!(vv > 0)) return 0;\n const t = wv / vv;\n return t < 0 ? 0 : t > 1 ? 1 : t;\n}\n\n/** The parameter, 0 to 1, of the point of segment `a`–`b` nearest `p`. A\n * zero-length segment answers 0. */\nexport function segmentT(p: readonly number[], a: readonly number[], b: readonly number[]): number {\n let wv = 0;\n let vv = 0;\n for (let i = 0; i < a.length; i++) {\n const v = b[i]! - a[i]!;\n wv += (p[i]! - a[i]!) * v;\n vv += v * v;\n }\n return segmentTFrom(wv, vv);\n}\n\n/** The point of segment `a`–`b` nearest `p`. At `t = 1` it is `b` exactly,\n * not `a + (b - a)`, which can miss it by rounding. */\nexport function closestPointOnSegment(\n p: readonly number[],\n a: readonly number[],\n b: readonly number[],\n): number[] {\n const t = segmentT(p, a, b);\n return t === 1 ? b.slice() : lerp(a, b, t);\n}\n\n/** Squared distance from `p` to segment `a`–`b`. */\nexport function pointSegmentDist2(p: readonly number[], a: readonly number[], b: readonly number[]): number {\n return distance2(p, closestPointOnSegment(p, a, b));\n}\n\n/** Distance from `p` to segment `a`–`b`. */\nexport function pointSegmentDist(p: readonly number[], a: readonly number[], b: readonly number[]): number {\n return Math.sqrt(pointSegmentDist2(p, a, b));\n}\n"]}