@weasel-js/geom 1.9.3 → 1.9.4

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.
@@ -1,5 +1,5 @@
1
- import { DEFAULT_FLATTEN_TOLERANCE, flattenCubicWithArcLen, flattenQuadraticWithArcLen } from './chunk-RQYCDPU5.js';
2
- import { forEachSegment, PATH_Z, PATH_C, PATH_Q, PATH_L, PATH_M } from './chunk-HEZTRG2M.js';
1
+ import { DEFAULT_FLATTEN_TOLERANCE, flattenCubicWithArcLen, flattenQuadraticWithArcLen } from './chunk-X6GJRIQD.js';
2
+ import { forEachSegment, PATH_Z, PATH_C, PATH_Q, PATH_L, PATH_M } from './chunk-E4TJRGJD.js';
3
3
 
4
4
  // src/box.ts
5
5
  function boundsOfCoords(coords) {
@@ -58,6 +58,7 @@ function extractPolygon(p, opts) {
58
58
  let aT = null;
59
59
  let current = null;
60
60
  let prevAnchor = -1;
61
+ let startAnchor = 0;
61
62
  const beginContour = () => {
62
63
  pts = [];
63
64
  aA = [];
@@ -94,13 +95,23 @@ function extractPolygon(p, opts) {
94
95
  aB[lastIdx] = target;
95
96
  aT[lastIdx] = 0;
96
97
  };
97
- forEachSegment(commands, coords, (cmd, coordIdx, prevX, prevY) => {
98
+ forEachSegment(commands, coords, (cmd, coordIdx, prevX, prevY, _i, opensSubpath) => {
99
+ if (opensSubpath) {
100
+ if (current) commit(current);
101
+ current = beginContour();
102
+ pts.push(prevX, prevY);
103
+ aA.push(startAnchor);
104
+ aB.push(startAnchor);
105
+ aT.push(0);
106
+ prevAnchor = startAnchor;
107
+ }
98
108
  switch (cmd) {
99
109
  case PATH_M:
100
110
  case PATH_L: {
101
111
  if (cmd === PATH_M) {
102
112
  if (current) commit(current);
103
113
  current = beginContour();
114
+ startAnchor = anchorCounter;
104
115
  }
105
116
  pts.push(coords[coordIdx], coords[coordIdx + 1]);
106
117
  aA.push(anchorCounter);
@@ -168,5 +179,5 @@ function extractPolygon(p, opts) {
168
179
  }
169
180
 
170
181
  export { boundsOfCoords, boxContainsBox, boxContainsPoint, extractPolylines, rectToContour, unionBox };
171
- //# sourceMappingURL=chunk-6T5I3PR5.js.map
172
- //# sourceMappingURL=chunk-6T5I3PR5.js.map
182
+ //# sourceMappingURL=chunk-NL423YYZ.js.map
183
+ //# sourceMappingURL=chunk-NL423YYZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/box.ts","../src/tessellate/polyline.ts"],"names":[],"mappings":"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","file":"chunk-NL423YYZ.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","import { forEachSegment, PATH_M, PATH_L, PATH_Z, PATH_C, PATH_Q } from '../commands';\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 /** Per-point stroke width, populated by the tessellator when the Stroke\n * carries `vertexWidths`. Undefined means uniform `Stroke.width`. */\n widths?: Float32Array;\n}\n\n/** Options for `extractPolylines`. */\nexport interface ExtractOptions {\n flattenTolerance?: 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(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 // 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 /**\n * A closed contour's last point repeating its first is redundant — Z already\n * says \"return to the start\" — and it is *harmful*: it 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 *\n * Every font outline serialized by opentype.js is written this way, as is a\n * great deal of hand-written and exported SVG, so this is the common case\n * rather than a defensive edge. Exact equality is the right test: the\n * duplicate is a re-emission of the same number, not an approach to it, and\n * a near-miss is a genuine (if tiny) segment the author asked for.\n */\n const dropDuplicateClosingPoint = (): void => {\n if (!pts || !aA || !aB || !aT) return;\n const n = pts.length / 2;\n if (n < 2) return;\n if (pts[0] !== pts[(n - 1) * 2] || pts[1] !== pts[(n - 1) * 2 + 1]) return;\n pts.length -= 2;\n aA.length -= 1;\n aB.length -= 1;\n aT.length -= 1;\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 };\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,\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,\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 dropDuplicateClosingPoint();\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"]}
@@ -1,4 +1,4 @@
1
- import { sign, len2, dot } from './chunk-7ROQRYOA.js';
1
+ import { sign, len2, dot } from './chunk-N5SYTHMR.js';
2
2
 
3
3
  // src/flatten.ts
4
4
  var DEFAULT_FLATTEN_TOLERANCE = 0.5;
@@ -13,17 +13,14 @@ function finite6(a, b, c, d, e, f) {
13
13
  function finite8(a, b, c, d, e, f, g, h) {
14
14
  return finite6(a, b, c, d, e, f) && Number.isFinite(g) && Number.isFinite(h);
15
15
  }
16
- function distPointToLine(px, py, ax, ay, bx, by) {
16
+ function distPointToSegment(px, py, ax, ay, bx, by) {
17
17
  const dx = bx - ax;
18
18
  const dy = by - ay;
19
19
  const len22 = dx * dx + dy * dy;
20
- if (len22 === 0) {
21
- const ex = px - ax;
22
- const ey = py - ay;
23
- return Math.sqrt(ex * ex + ey * ey);
24
- }
25
- const cross = (px - ax) * dy - (py - ay) * dx;
26
- return Math.abs(cross) / Math.sqrt(len22);
20
+ const along = len22 === 0 ? 0 : ((px - ax) * dx + (py - ay) * dy) / len22;
21
+ if (along <= 0) return Math.hypot(px - ax, py - ay);
22
+ if (along >= 1) return Math.hypot(px - bx, py - by);
23
+ return Math.abs((px - ax) * dy - (py - ay) * dx) / Math.sqrt(len22);
27
24
  }
28
25
  function flattenCubic(x0, y0, x1, y1, x2, y2, x3, y3, tolerance, out) {
29
26
  if (!finite8(x0, y0, x1, y1, x2, y2, x3, y3)) {
@@ -33,8 +30,8 @@ function flattenCubic(x0, y0, x1, y1, x2, y2, x3, y3, tolerance, out) {
33
30
  flattenCubicRec(x0, y0, x1, y1, x2, y2, x3, y3, usableTolerance(tolerance), out, 0);
34
31
  }
35
32
  function flattenCubicRec(x0, y0, x1, y1, x2, y2, x3, y3, tolerance, out, depth) {
36
- const d1 = distPointToLine(x1, y1, x0, y0, x3, y3);
37
- const d2 = distPointToLine(x2, y2, x0, y0, x3, y3);
33
+ const d1 = distPointToSegment(x1, y1, x0, y0, x3, y3);
34
+ const d2 = distPointToSegment(x2, y2, x0, y0, x3, y3);
38
35
  if (Math.max(d1, d2) <= tolerance || depth >= MAX_FLATTEN_DEPTH) {
39
36
  out.push(x3, y3);
40
37
  return;
@@ -56,7 +53,7 @@ function flattenQuadratic(x0, y0, x1, y1, x2, y2, tolerance, out) {
56
53
  flattenQuadraticRec(x0, y0, x1, y1, x2, y2, usableTolerance(tolerance), out, 0);
57
54
  }
58
55
  function flattenQuadraticRec(x0, y0, x1, y1, x2, y2, tolerance, out, depth) {
59
- const d = distPointToLine(x1, y1, x0, y0, x2, y2);
56
+ const d = distPointToSegment(x1, y1, x0, y0, x2, y2);
60
57
  if (d <= tolerance || depth >= MAX_FLATTEN_DEPTH) {
61
58
  out.push(x2, y2);
62
59
  return;
@@ -76,8 +73,8 @@ function flattenCubicWithArcLen(x0, y0, x1, y1, x2, y2, x3, y3, tolerance, out,
76
73
  return flattenCubicArcRec(x0, y0, x1, y1, x2, y2, x3, y3, usableTolerance(tolerance), out, arcOut, 0, 0);
77
74
  }
78
75
  function flattenCubicArcRec(x0, y0, x1, y1, x2, y2, x3, y3, tolerance, out, arcOut, accum, depth) {
79
- const d1 = distPointToLine(x1, y1, x0, y0, x3, y3);
80
- const d2 = distPointToLine(x2, y2, x0, y0, x3, y3);
76
+ const d1 = distPointToSegment(x1, y1, x0, y0, x3, y3);
77
+ const d2 = distPointToSegment(x2, y2, x0, y0, x3, y3);
81
78
  if (Math.max(d1, d2) <= tolerance || depth >= MAX_FLATTEN_DEPTH) {
82
79
  const lastX = out.length >= 2 ? out[out.length - 2] : x0;
83
80
  const lastY = out.length >= 2 ? out[out.length - 1] : y0;
@@ -106,7 +103,7 @@ function flattenQuadraticWithArcLen(x0, y0, x1, y1, x2, y2, tolerance, out, arcO
106
103
  return flattenQuadraticArcRec(x0, y0, x1, y1, x2, y2, usableTolerance(tolerance), out, arcOut, 0, 0);
107
104
  }
108
105
  function flattenQuadraticArcRec(x0, y0, x1, y1, x2, y2, tolerance, out, arcOut, accum, depth) {
109
- const d = distPointToLine(x1, y1, x0, y0, x2, y2);
106
+ const d = distPointToSegment(x1, y1, x0, y0, x2, y2);
110
107
  if (d <= tolerance || depth >= MAX_FLATTEN_DEPTH) {
111
108
  const lastX = out.length >= 2 ? out[out.length - 2] : x0;
112
109
  const lastY = out.length >= 2 ? out[out.length - 1] : y0;
@@ -154,5 +151,5 @@ function pointSegmentDist2(px, py, ax, ay, bx, by) {
154
151
  }
155
152
 
156
153
  export { DEFAULT_FLATTEN_TOLERANCE, flattenCubic, flattenCubicWithArcLen, flattenQuadratic, flattenQuadraticWithArcLen, pointInPolygon, pointSegmentDist2, segmentsCross };
157
- //# sourceMappingURL=chunk-RQYCDPU5.js.map
158
- //# sourceMappingURL=chunk-RQYCDPU5.js.map
154
+ //# sourceMappingURL=chunk-X6GJRIQD.js.map
155
+ //# sourceMappingURL=chunk-X6GJRIQD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/flatten.ts","../src/polyline.ts"],"names":["len2"],"mappings":"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","file":"chunk-X6GJRIQD.js","sourcesContent":["/**\n * Bezier flattening — subdivide cubic and quadratic segments into polyline\n * approximations within a flatness tolerance. Used by hit-testing and\n * (eventually) any kernel that doesn't want to special-case curves.\n *\n * The flatness metric is the maximum perpendicular distance from any\n * control point to the chord between endpoints. When that distance falls\n * below `tolerance`, the segment is \"flat enough\" and emitted as a single\n * line segment.\n *\n * Tolerance is in world units. 0.5 is a sensible default for screen-rate\n * rendering at 1× zoom; consumers that zoom in heavily should pass a\n * tighter tolerance.\n */\n\nexport const DEFAULT_FLATTEN_TOLERANCE = 0.5;\n\n/** Floor for a non-positive or NaN tolerance. Without it the flatness test can\n * never be satisfied and the subdivision recurses until the stack blows. */\nconst MIN_FLATTEN_TOLERANCE = 1e-6;\n\n/** Subdivision ceiling. The tolerance floor bounds the common runaway; this\n * bounds the other one, coordinates large enough that reaching 1e-6 takes\n * hundreds of levels. Error falls roughly 4x per level, so 16 is far beyond\n * any tolerance a caller can mean. */\nconst MAX_FLATTEN_DEPTH = 16;\n\nfunction usableTolerance(tolerance: number): number {\n return tolerance > 0 ? tolerance : MIN_FLATTEN_TOLERANCE;\n}\n\nfunction finite6(a: number, b: number, c: number, d: number, e: number, f: number): boolean {\n return Number.isFinite(a) && Number.isFinite(b) && Number.isFinite(c)\n && Number.isFinite(d) && Number.isFinite(e) && Number.isFinite(f);\n}\n\nfunction finite8(\n a: number, b: number, c: number, d: number,\n e: number, f: number, g: number, h: number,\n): boolean {\n return finite6(a, b, c, d, e, f) && Number.isFinite(g) && Number.isFinite(h);\n}\n\n/**\n * Distance from point P to segment AB. To the segment, not the line through\n * it: a control point on that line but past an end still pulls the curve out\n * beyond the chord, and measures zero against the line.\n */\nfunction distPointToSegment(px: number, py: number, ax: number, ay: number, bx: number, by: number): number {\n const dx = bx - ax;\n const dy = by - ay;\n const len2 = dx * dx + dy * dy;\n const along = len2 === 0 ? 0 : ((px - ax) * dx + (py - ay) * dy) / len2;\n if (along <= 0) return Math.hypot(px - ax, py - ay);\n if (along >= 1) return Math.hypot(px - bx, py - by);\n return Math.abs((px - ax) * dy - (py - ay) * dx) / Math.sqrt(len2);\n}\n\n/**\n * Recursively subdivide a cubic bezier (P0..P3) and append `lineTo`-style\n * vertices to `out` (interleaved x,y). The starting endpoint is *not*\n * appended — callers usually emitted it as the segment's previous vertex.\n */\nexport function flattenCubic(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n x3: number, y3: number,\n tolerance: number,\n out: number[],\n): void {\n if (!finite8(x0, y0, x1, y1, x2, y2, x3, y3)) {\n out.push(x3, y3);\n return;\n }\n flattenCubicRec(x0, y0, x1, y1, x2, y2, x3, y3, usableTolerance(tolerance), out, 0);\n}\n\nfunction flattenCubicRec(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n x3: number, y3: number,\n tolerance: number,\n out: number[],\n depth: number,\n): void {\n const d1 = distPointToSegment(x1, y1, x0, y0, x3, y3);\n const d2 = distPointToSegment(x2, y2, x0, y0, x3, y3);\n if (Math.max(d1, d2) <= tolerance || depth >= MAX_FLATTEN_DEPTH) {\n out.push(x3, y3);\n return;\n }\n // De Casteljau split at t=0.5\n const x01 = (x0 + x1) * 0.5, y01 = (y0 + y1) * 0.5;\n const x12 = (x1 + x2) * 0.5, y12 = (y1 + y2) * 0.5;\n const x23 = (x2 + x3) * 0.5, y23 = (y2 + y3) * 0.5;\n const x012 = (x01 + x12) * 0.5, y012 = (y01 + y12) * 0.5;\n const x123 = (x12 + x23) * 0.5, y123 = (y12 + y23) * 0.5;\n const x0123 = (x012 + x123) * 0.5, y0123 = (y012 + y123) * 0.5;\n flattenCubicRec(x0, y0, x01, y01, x012, y012, x0123, y0123, tolerance, out, depth + 1);\n flattenCubicRec(x0123, y0123, x123, y123, x23, y23, x3, y3, tolerance, out, depth + 1);\n}\n\n/** Recursively subdivide a quadratic bezier (P0, P1, P2). */\nexport function flattenQuadratic(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n tolerance: number,\n out: number[],\n): void {\n if (!finite6(x0, y0, x1, y1, x2, y2)) {\n out.push(x2, y2);\n return;\n }\n flattenQuadraticRec(x0, y0, x1, y1, x2, y2, usableTolerance(tolerance), out, 0);\n}\n\nfunction flattenQuadraticRec(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n tolerance: number,\n out: number[],\n depth: number,\n): void {\n const d = distPointToSegment(x1, y1, x0, y0, x2, y2);\n if (d <= tolerance || depth >= MAX_FLATTEN_DEPTH) {\n out.push(x2, y2);\n return;\n }\n const x01 = (x0 + x1) * 0.5, y01 = (y0 + y1) * 0.5;\n const x12 = (x1 + x2) * 0.5, y12 = (y1 + y2) * 0.5;\n const x012 = (x01 + x12) * 0.5, y012 = (y01 + y12) * 0.5;\n flattenQuadraticRec(x0, y0, x01, y01, x012, y012, tolerance, out, depth + 1);\n flattenQuadraticRec(x012, y012, x12, y12, x2, y2, tolerance, out, depth + 1);\n}\n\n/**\n * Like `flattenCubic` but also appends, for each new flattened point, its\n * arc-length fraction `t` (relative to the polyline distance accumulated so\n * far inside this curve) to `arcOut`. Caller then post-processes the segment's\n * `arcOut` range by dividing each by the segment's total flattened arc length\n * to yield t ∈ (0, 1].\n *\n * The returned values are *cumulative distance from the segment start*, not\n * normalized fractions. Two-pass design (accumulate, then divide) keeps the\n * recursive splitter simple — it doesn't need to know the total length up\n * front.\n */\nexport function flattenCubicWithArcLen(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n x3: number, y3: number,\n tolerance: number,\n out: number[],\n arcOut: number[],\n): number {\n if (!finite8(x0, y0, x1, y1, x2, y2, x3, y3)) {\n out.push(x3, y3);\n arcOut.push(0);\n return 0;\n }\n return flattenCubicArcRec(x0, y0, x1, y1, x2, y2, x3, y3, usableTolerance(tolerance), out, arcOut, 0, 0);\n}\n\nfunction flattenCubicArcRec(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n x3: number, y3: number,\n tolerance: number,\n out: number[],\n arcOut: number[],\n accum: number,\n depth: number,\n): number {\n const d1 = distPointToSegment(x1, y1, x0, y0, x3, y3);\n const d2 = distPointToSegment(x2, y2, x0, y0, x3, y3);\n if (Math.max(d1, d2) <= tolerance || depth >= MAX_FLATTEN_DEPTH) {\n const lastX = out.length >= 2 ? out[out.length - 2] : x0;\n const lastY = out.length >= 2 ? out[out.length - 1] : y0;\n const seg = Math.hypot(x3 - lastX, y3 - lastY);\n accum += seg;\n out.push(x3, y3);\n arcOut.push(accum);\n return accum;\n }\n const x01 = (x0 + x1) * 0.5, y01 = (y0 + y1) * 0.5;\n const x12 = (x1 + x2) * 0.5, y12 = (y1 + y2) * 0.5;\n const x23 = (x2 + x3) * 0.5, y23 = (y2 + y3) * 0.5;\n const x012 = (x01 + x12) * 0.5, y012 = (y01 + y12) * 0.5;\n const x123 = (x12 + x23) * 0.5, y123 = (y12 + y23) * 0.5;\n const x0123 = (x012 + x123) * 0.5, y0123 = (y012 + y123) * 0.5;\n accum = flattenCubicArcRec(x0, y0, x01, y01, x012, y012, x0123, y0123, tolerance, out, arcOut, accum, depth + 1);\n accum = flattenCubicArcRec(x0123, y0123, x123, y123, x23, y23, x3, y3, tolerance, out, arcOut, accum, depth + 1);\n return accum;\n}\n\n/** Flatten a quadratic bezier into line segments within `tolerance`, appending\n * points to `out` and their cumulative arc lengths to `arcOut`. The arc\n * lengths are what lets per-anchor color and dash phase be interpolated\n * evenly along the curve rather than per segment. */\nexport function flattenQuadraticWithArcLen(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n tolerance: number,\n out: number[],\n arcOut: number[],\n): number {\n if (!finite6(x0, y0, x1, y1, x2, y2)) {\n out.push(x2, y2);\n arcOut.push(0);\n return 0;\n }\n return flattenQuadraticArcRec(x0, y0, x1, y1, x2, y2, usableTolerance(tolerance), out, arcOut, 0, 0);\n}\n\nfunction flattenQuadraticArcRec(\n x0: number, y0: number,\n x1: number, y1: number,\n x2: number, y2: number,\n tolerance: number,\n out: number[],\n arcOut: number[],\n accum: number,\n depth: number,\n): number {\n const d = distPointToSegment(x1, y1, x0, y0, x2, y2);\n if (d <= tolerance || depth >= MAX_FLATTEN_DEPTH) {\n const lastX = out.length >= 2 ? out[out.length - 2] : x0;\n const lastY = out.length >= 2 ? out[out.length - 1] : y0;\n const seg = Math.hypot(x2 - lastX, y2 - lastY);\n accum += seg;\n out.push(x2, y2);\n arcOut.push(accum);\n return accum;\n }\n const x01 = (x0 + x1) * 0.5, y01 = (y0 + y1) * 0.5;\n const x12 = (x1 + x2) * 0.5, y12 = (y1 + y2) * 0.5;\n const x012 = (x01 + x12) * 0.5, y012 = (y01 + y12) * 0.5;\n accum = flattenQuadraticArcRec(x0, y0, x01, y01, x012, y012, tolerance, out, arcOut, accum, depth + 1);\n accum = flattenQuadraticArcRec(x012, y012, x12, y12, x2, y2, tolerance, out, arcOut, accum, depth + 1);\n return accum;\n}\n\n","import { sign, dot, len2 } from './scalar';\n\n/**\n * Even-odd ray-cast point-in-polygon over an interleaved, unclosed contour\n * [x0,y0,x1,y1,…]. The closing edge (last→first) is implicit.\n *\n * `start`/`end` are vertex indices, not float offsets, and bound one contour\n * inside a buffer holding several.\n */\nexport function pointInPolygon(\n coords: ArrayLike<number>,\n px: number,\n py: number,\n start = 0,\n end = coords.length >> 1,\n): boolean {\n if (end - start < 3) return false;\n let inside = false;\n for (let i = start, j = end - 1; i < end; j = i++) {\n const xi = coords[i * 2], yi = coords[i * 2 + 1];\n const xj = coords[j * 2], yj = coords[j * 2 + 1];\n const crosses =\n (yi > py) !== (yj > py) &&\n px < ((xj - xi) * (py - yi)) / (yj - yi) + xi;\n if (crosses) inside = !inside;\n }\n return inside;\n}\n\n/**\n * True if segments (ax,ay)-(bx,by) and (cx,cy)-(dx,dy) intersect at a single\n * point. An endpoint landing on the other segment counts (a T-junction and a\n * shared endpoint both answer true) — hit-testing wants a grazing edge to\n * register. Collinear overlap answers false: there is no single crossing\n * point, so the sign test both segments rely on is zero on all four sides.\n */\nexport function segmentsCross(\n ax: number, ay: number, bx: number, by: number,\n cx: number, cy: number, dx: number, dy: number,\n): boolean {\n const d1 = sign((dx - cx) * (ay - cy) - (dy - cy) * (ax - cx));\n const d2 = sign((dx - cx) * (by - cy) - (dy - cy) * (bx - cx));\n const d3 = sign((bx - ax) * (cy - ay) - (by - ay) * (cx - ax));\n const d4 = sign((bx - ax) * (dy - ay) - (by - ay) * (dx - ax));\n return d1 !== d2 && d3 !== d4;\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 vx = bx - ax, vy = by - ay;\n const wx = px - ax, wy = py - ay;\n const vv = len2(vx, vy);\n let t = vv === 0 ? 0 : dot(wx, wy, vx, vy) / vv;\n t = t < 0 ? 0 : t > 1 ? 1 : t;\n const dx = px - (ax + t * vx), dy = py - (ay + t * vy);\n return len2(dx, dy);\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  import { cubicPointAt } from '../chunk-HPVINMOM.js';
2
2
  import '../chunk-URQMDR6Q.js';
3
- import { PATH_M, PATH_C, PATH_L, PATH_Q } from '../chunk-HEZTRG2M.js';
3
+ import { PATH_M, PATH_C, PATH_L, PATH_Q } from '../chunk-E4TJRGJD.js';
4
4
 
5
- // src/curves/bezierCubic.ts
5
+ // src/curves/anchorHandles.ts
6
6
  var DEFAULT_HANDLE_FRACTION = 1 / 3;
7
7
  function smoothTangent(anchors, i) {
8
8
  const prev = i > 0 ? anchors[i - 1] : null;
@@ -51,6 +51,8 @@ function segmentAt(anchors, t) {
51
51
  const localT = scaled - segIdx;
52
52
  return { segIdx, localT };
53
53
  }
54
+
55
+ // src/curves/bezierCubic.ts
54
56
  function cubicDeriv1(p0, p1, p2, p3, t) {
55
57
  const u = 1 - t;
56
58
  return {
@@ -127,59 +129,11 @@ var bezierCubic = {
127
129
  };
128
130
 
129
131
  // src/curves/bezierQuadratic.ts
130
- var DEFAULT_HANDLE_FRACTION2 = 1 / 3;
131
- function smoothTangent2(anchors, i) {
132
- const prev = i > 0 ? anchors[i - 1] : null;
133
- const next = i + 1 < anchors.length ? anchors[i + 1] : null;
134
- if (!prev && next) return { x: next.x - anchors[i].x, y: next.y - anchors[i].y };
135
- if (prev && !next) return { x: anchors[i].x - prev.x, y: anchors[i].y - prev.y };
136
- if (prev && next) {
137
- const inLen = Math.hypot(anchors[i].x - prev.x, anchors[i].y - prev.y) || 1;
138
- const outLen = Math.hypot(next.x - anchors[i].x, next.y - anchors[i].y) || 1;
139
- return {
140
- x: (anchors[i].x - prev.x) / inLen + (next.x - anchors[i].x) / outLen,
141
- y: (anchors[i].y - prev.y) / inLen + (next.y - anchors[i].y) / outLen
142
- };
143
- }
144
- return { x: 0, y: 0 };
145
- }
146
- function defaultOutHandle2(anchors, i) {
147
- const a = anchors[i];
148
- if (a.outHandle) return a.outHandle;
149
- const next = anchors[i + 1];
150
- const edgeLen = Math.hypot(next.x - a.x, next.y - a.y);
151
- const t = smoothTangent2(anchors, i);
152
- const tLen = Math.hypot(t.x, t.y) || 1;
153
- return {
154
- x: a.x + t.x / tLen * edgeLen * DEFAULT_HANDLE_FRACTION2,
155
- y: a.y + t.y / tLen * edgeLen * DEFAULT_HANDLE_FRACTION2
156
- };
157
- }
158
- function defaultInHandle2(anchors, i) {
159
- const b = anchors[i + 1];
160
- if (b.inHandle) return b.inHandle;
161
- const a = anchors[i];
162
- const edgeLen = Math.hypot(b.x - a.x, b.y - a.y);
163
- const t = smoothTangent2(anchors, i + 1);
164
- const tLen = Math.hypot(t.x, t.y) || 1;
165
- return {
166
- x: b.x - t.x / tLen * edgeLen * DEFAULT_HANDLE_FRACTION2,
167
- y: b.y - t.y / tLen * edgeLen * DEFAULT_HANDLE_FRACTION2
168
- };
169
- }
170
132
  function quadControl(anchors, i) {
171
- const c1 = defaultOutHandle2(anchors, i);
172
- const c2 = defaultInHandle2(anchors, i);
133
+ const c1 = defaultOutHandle(anchors, i);
134
+ const c2 = defaultInHandle(anchors, i);
173
135
  return { x: (c1.x + c2.x) / 2, y: (c1.y + c2.y) / 2 };
174
136
  }
175
- function segmentAt2(anchors, t) {
176
- if (anchors.length < 2) return { segIdx: 0, localT: 0 };
177
- const segments = anchors.length - 1;
178
- const scaled = Math.min(Math.max(t, 0), 1) * segments;
179
- const segIdx = Math.min(Math.floor(scaled), segments - 1);
180
- const localT = scaled - segIdx;
181
- return { segIdx, localT };
182
- }
183
137
  function quadEval(p0, p1, p2, t) {
184
138
  const u = 1 - t;
185
139
  return {
@@ -205,7 +159,7 @@ var bezierQuadratic = {
205
159
  label: "Quadratic Bezier",
206
160
  evaluate(anchors, t) {
207
161
  if (anchors.length < 2) return { x: anchors[0]?.x ?? 0, y: anchors[0]?.y ?? 0 };
208
- const { segIdx, localT } = segmentAt2(anchors, t);
162
+ const { segIdx, localT } = segmentAt(anchors, t);
209
163
  const a = anchors[segIdx];
210
164
  const b = anchors[segIdx + 1];
211
165
  return quadEval(a, quadControl(anchors, segIdx), b, localT);
@@ -231,7 +185,7 @@ var bezierQuadratic = {
231
185
  },
232
186
  curvatureAt(anchors, t) {
233
187
  if (anchors.length < 2) return 0;
234
- const { segIdx, localT } = segmentAt2(anchors, t);
188
+ const { segIdx, localT } = segmentAt(anchors, t);
235
189
  const a = anchors[segIdx];
236
190
  const b = anchors[segIdx + 1];
237
191
  const p1 = quadControl(anchors, segIdx);
@@ -348,11 +302,12 @@ var nurbs = {
348
302
  curvatureAt(anchors, t) {
349
303
  if (anchors.length < 2) return 0;
350
304
  const eps = 1e-3;
351
- const t0 = Math.max(0, t - eps);
352
- const t1 = Math.min(1, t + eps);
305
+ const tm = Math.min(1 - eps, Math.max(eps, t));
306
+ const t0 = tm - eps;
307
+ const t1 = tm + eps;
353
308
  const p0 = evalNurbs(anchors, t0);
354
309
  const p2 = evalNurbs(anchors, t1);
355
- const pm = evalNurbs(anchors, t);
310
+ const pm = evalNurbs(anchors, tm);
356
311
  const d1x = (p2.x - p0.x) / (t1 - t0);
357
312
  const d1y = (p2.y - p0.y) / (t1 - t0);
358
313
  const d2x = (p2.x - 2 * pm.x + p0.x) / (eps * eps);
@@ -385,7 +340,7 @@ var TANGENT_SCALE = 1 / 3;
385
340
  function isCorner(a) {
386
341
  return a.spiroType === "corner";
387
342
  }
388
- function smoothTangent3(anchors, i) {
343
+ function smoothTangent2(anchors, i) {
389
344
  if (isCorner(anchors[i])) return null;
390
345
  const prev = i > 0 ? anchors[i - 1] : null;
391
346
  const next = i + 1 < anchors.length ? anchors[i + 1] : null;
@@ -412,8 +367,8 @@ function controlsFor(anchors, i) {
412
367
  const b = anchors[i + 1];
413
368
  const edge = { x: b.x - a.x, y: b.y - a.y };
414
369
  const edgeLen = Math.hypot(edge.x, edge.y) || 1;
415
- const tA = smoothTangent3(anchors, i);
416
- const tB = smoothTangent3(anchors, i + 1);
370
+ const tA = smoothTangent2(anchors, i);
371
+ const tB = smoothTangent2(anchors, i + 1);
417
372
  const outA = tA ?? edge;
418
373
  const outB = tB ?? edge;
419
374
  const outALen = Math.hypot(outA.x, outA.y) || 1;
@@ -430,20 +385,12 @@ function controlsFor(anchors, i) {
430
385
  }
431
386
  };
432
387
  }
433
- function segmentAt3(anchors, t) {
434
- if (anchors.length < 2) return { segIdx: 0, localT: 0 };
435
- const segments = anchors.length - 1;
436
- const scaled = Math.min(Math.max(t, 0), 1) * segments;
437
- const segIdx = Math.min(Math.floor(scaled), segments - 1);
438
- const localT = scaled - segIdx;
439
- return { segIdx, localT };
440
- }
441
388
  var spiro = {
442
389
  kind: "spiro",
443
390
  label: "Spiro (\u03BA-curves v1)",
444
391
  evaluate(anchors, t) {
445
392
  if (anchors.length < 2) return { x: anchors[0]?.x ?? 0, y: anchors[0]?.y ?? 0 };
446
- const { segIdx, localT } = segmentAt3(anchors, t);
393
+ const { segIdx, localT } = segmentAt(anchors, t);
447
394
  const a = anchors[segIdx];
448
395
  const b = anchors[segIdx + 1];
449
396
  const { c1, c2 } = controlsFor(anchors, segIdx);
@@ -470,7 +417,7 @@ var spiro = {
470
417
  },
471
418
  curvatureAt(anchors, t) {
472
419
  if (anchors.length < 2) return 0;
473
- const { segIdx, localT } = segmentAt3(anchors, t);
420
+ const { segIdx, localT } = segmentAt(anchors, t);
474
421
  const a = anchors[segIdx];
475
422
  const b = anchors[segIdx + 1];
476
423
  const { c1, c2 } = controlsFor(anchors, segIdx);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/curves/bezierCubic.ts","../../src/curves/bezierQuadratic.ts","../../src/curves/nurbs.ts","../../src/curves/spiro.ts","../../src/curves/index.ts"],"names":["DEFAULT_HANDLE_FRACTION","smoothTangent","defaultOutHandle","defaultInHandle","segmentAt"],"mappings":"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","file":"index.js","sourcesContent":["import type { CurveRepresentation, Discriminator, SharedAnchor } from './types';\nimport { PATH_C, PATH_M } from '../commands';\nimport { cubicPointAt } from '../paths/cubicMath';\n\nconst DEFAULT_HANDLE_FRACTION = 1 / 3;\n\n/** Smooth tangent at anchor i derived from neighbor edges. Average the\n * incoming and outgoing edge directions weighted by inverse edge length\n * (centripetal-style) so short edges don't dominate. At endpoints the\n * single available edge wins. Without this, a handle colinear with one\n * segment produces a degenerate (visually straight) cubic. */\nfunction smoothTangent(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const prev = i > 0 ? anchors[i - 1] : null;\n const next = i + 1 < anchors.length ? anchors[i + 1] : null;\n if (!prev && next) return { x: next.x - anchors[i].x, y: next.y - anchors[i].y };\n if (prev && !next) return { x: anchors[i].x - prev.x, y: anchors[i].y - prev.y };\n if (prev && next) {\n const inLen = Math.hypot(anchors[i].x - prev.x, anchors[i].y - prev.y) || 1;\n const outLen = Math.hypot(next.x - anchors[i].x, next.y - anchors[i].y) || 1;\n return {\n x: (anchors[i].x - prev.x) / inLen + (next.x - anchors[i].x) / outLen,\n y: (anchors[i].y - prev.y) / inLen + (next.y - anchors[i].y) / outLen,\n };\n }\n return { x: 0, y: 0 };\n}\n\nfunction defaultOutHandle(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const a = anchors[i];\n if (a.outHandle) return a.outHandle;\n const next = anchors[i + 1];\n const edgeLen = Math.hypot(next.x - a.x, next.y - a.y);\n const t = smoothTangent(anchors, i);\n const tLen = Math.hypot(t.x, t.y) || 1;\n return {\n x: a.x + (t.x / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n y: a.y + (t.y / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n };\n}\n\nfunction defaultInHandle(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const b = anchors[i + 1];\n if (b.inHandle) return b.inHandle;\n const a = anchors[i];\n const edgeLen = Math.hypot(b.x - a.x, b.y - a.y);\n const t = smoothTangent(anchors, i + 1);\n const tLen = Math.hypot(t.x, t.y) || 1;\n return {\n x: b.x - (t.x / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n y: b.y - (t.y / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n };\n}\n\nfunction segmentAt(anchors: SharedAnchor[], t: number): { segIdx: number; localT: number } {\n if (anchors.length < 2) return { segIdx: 0, localT: 0 };\n const segments = anchors.length - 1;\n const scaled = Math.min(Math.max(t, 0), 1) * segments;\n const segIdx = Math.min(Math.floor(scaled), segments - 1);\n const localT = scaled - segIdx;\n return { segIdx, localT };\n}\n\nfunction cubicDeriv1(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n p3: { x: number; y: number },\n t: number,\n): { x: number; y: number } {\n const u = 1 - t;\n return {\n x: 3 * u * u * (p1.x - p0.x) + 6 * u * t * (p2.x - p1.x) + 3 * t * t * (p3.x - p2.x),\n y: 3 * u * u * (p1.y - p0.y) + 6 * u * t * (p2.y - p1.y) + 3 * t * t * (p3.y - p2.y),\n };\n}\n\nfunction cubicDeriv2(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n p3: { x: number; y: number },\n t: number,\n): { x: number; y: number } {\n const u = 1 - t;\n return {\n x: 6 * u * (p2.x - 2 * p1.x + p0.x) + 6 * t * (p3.x - 2 * p2.x + p1.x),\n y: 6 * u * (p2.y - 2 * p1.y + p0.y) + 6 * t * (p3.y - 2 * p2.y + p1.y),\n };\n}\n\n/** Cubic bezier: each segment takes two control handles. The familiar pen-tool curve, and what SVG path data stores natively. */\nexport const bezierCubic: CurveRepresentation = {\n kind: 'bezierCubic',\n label: 'Cubic Bezier',\n evaluate(anchors, t) {\n if (anchors.length < 2) return { x: anchors[0]?.x ?? 0, y: anchors[0]?.y ?? 0 };\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n return cubicPointAt(a, defaultOutHandle(anchors, segIdx), defaultInHandle(anchors, segIdx), b, localT);\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const cmds: number[] = [PATH_M];\n const xs: number[] = [anchors[0].x, anchors[0].y];\n for (let i = 0; i + 1 < anchors.length; i++) {\n const b = anchors[i + 1];\n const c1 = defaultOutHandle(anchors, i);\n const c2 = defaultInHandle(anchors, i);\n cmds.push(PATH_C);\n xs.push(c1.x, c1.y, c2.x, c2.y, b.x, b.y);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(xs),\n fillRule: 'nonzero',\n };\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n const p0 = a;\n const p1 = defaultOutHandle(anchors, segIdx);\n const p2 = defaultInHandle(anchors, segIdx);\n const p3 = b;\n const d1 = cubicDeriv1(p0, p1, p2, p3, localT);\n const d2 = cubicDeriv2(p0, p1, p2, p3, localT);\n const num = d1.x * d2.y - d1.y * d2.x;\n const den = Math.pow(d1.x * d1.x + d1.y * d1.y, 1.5);\n if (den < 1e-12) return 0;\n return num / den;\n },\n discriminators(anchors) {\n const out: Discriminator[] = [];\n for (let i = 0; i < anchors.length; i++) {\n const a = anchors[i];\n if (a.outHandle || i + 1 < anchors.length) {\n out.push({ kind: 'handle', anchorIndex: i, which: 'out' });\n }\n if (a.inHandle || i > 0) {\n out.push({ kind: 'handle', anchorIndex: i, which: 'in' });\n }\n }\n return out;\n },\n};\n","import type { CurveRepresentation, Discriminator, SharedAnchor } from './types';\nimport { PATH_M, PATH_Q } from '../commands';\n\nconst DEFAULT_HANDLE_FRACTION = 1 / 3;\n\nfunction smoothTangent(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const prev = i > 0 ? anchors[i - 1] : null;\n const next = i + 1 < anchors.length ? anchors[i + 1] : null;\n if (!prev && next) return { x: next.x - anchors[i].x, y: next.y - anchors[i].y };\n if (prev && !next) return { x: anchors[i].x - prev.x, y: anchors[i].y - prev.y };\n if (prev && next) {\n const inLen = Math.hypot(anchors[i].x - prev.x, anchors[i].y - prev.y) || 1;\n const outLen = Math.hypot(next.x - anchors[i].x, next.y - anchors[i].y) || 1;\n return {\n x: (anchors[i].x - prev.x) / inLen + (next.x - anchors[i].x) / outLen,\n y: (anchors[i].y - prev.y) / inLen + (next.y - anchors[i].y) / outLen,\n };\n }\n return { x: 0, y: 0 };\n}\n\nfunction defaultOutHandle(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const a = anchors[i];\n if (a.outHandle) return a.outHandle;\n const next = anchors[i + 1];\n const edgeLen = Math.hypot(next.x - a.x, next.y - a.y);\n const t = smoothTangent(anchors, i);\n const tLen = Math.hypot(t.x, t.y) || 1;\n return {\n x: a.x + (t.x / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n y: a.y + (t.y / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n };\n}\n\nfunction defaultInHandle(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const b = anchors[i + 1];\n if (b.inHandle) return b.inHandle;\n const a = anchors[i];\n const edgeLen = Math.hypot(b.x - a.x, b.y - a.y);\n const t = smoothTangent(anchors, i + 1);\n const tLen = Math.hypot(t.x, t.y) || 1;\n return {\n x: b.x - (t.x / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n y: b.y - (t.y / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n };\n}\n\nfunction quadControl(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const c1 = defaultOutHandle(anchors, i);\n const c2 = defaultInHandle(anchors, i);\n return { x: (c1.x + c2.x) / 2, y: (c1.y + c2.y) / 2 };\n}\n\nfunction segmentAt(anchors: SharedAnchor[], t: number): { segIdx: number; localT: number } {\n if (anchors.length < 2) return { segIdx: 0, localT: 0 };\n const segments = anchors.length - 1;\n const scaled = Math.min(Math.max(t, 0), 1) * segments;\n const segIdx = Math.min(Math.floor(scaled), segments - 1);\n const localT = scaled - segIdx;\n return { segIdx, localT };\n}\n\nfunction quadEval(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n t: number,\n): { x: number; y: number } {\n const u = 1 - t;\n return {\n x: u * u * p0.x + 2 * u * t * p1.x + t * t * p2.x,\n y: u * u * p0.y + 2 * u * t * p1.y + t * t * p2.y,\n };\n}\n\nfunction quadDeriv1(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n t: number,\n): { x: number; y: number } {\n const u = 1 - t;\n return {\n x: 2 * u * (p1.x - p0.x) + 2 * t * (p2.x - p1.x),\n y: 2 * u * (p1.y - p0.y) + 2 * t * (p2.y - p1.y),\n };\n}\n\nfunction quadDeriv2(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n): { x: number; y: number } {\n return {\n x: 2 * (p2.x - 2 * p1.x + p0.x),\n y: 2 * (p2.y - 2 * p1.y + p0.y),\n };\n}\n\n/** Quadratic bezier: one control point per segment. Cheaper than cubic and what TrueType glyph outlines use, at the cost of expressiveness. */\nexport const bezierQuadratic: CurveRepresentation = {\n kind: 'bezierQuadratic',\n label: 'Quadratic Bezier',\n evaluate(anchors, t) {\n if (anchors.length < 2) return { x: anchors[0]?.x ?? 0, y: anchors[0]?.y ?? 0 };\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n return quadEval(a, quadControl(anchors, segIdx), b, localT);\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const cmds: number[] = [PATH_M];\n const xs: number[] = [anchors[0].x, anchors[0].y];\n for (let i = 0; i + 1 < anchors.length; i++) {\n const b = anchors[i + 1];\n const q = quadControl(anchors, i);\n cmds.push(PATH_Q);\n xs.push(q.x, q.y, b.x, b.y);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(xs),\n fillRule: 'nonzero',\n };\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n const p1 = quadControl(anchors, segIdx);\n const d1 = quadDeriv1(a, p1, b, localT);\n const d2 = quadDeriv2(a, p1, b);\n const num = d1.x * d2.y - d1.y * d2.x;\n const den = Math.pow(d1.x * d1.x + d1.y * d1.y, 1.5);\n if (den < 1e-12) return 0;\n return num / den;\n },\n discriminators(_anchors): Discriminator[] {\n // Quadratic has no user-facing controls — each segment's quadratic\n // control is fully determined by the cubic handles via midpoint.\n return [];\n },\n};\n","import type { CurveRepresentation, Discriminator, SharedAnchor } from './types';\nimport { PATH_L, PATH_M } from '../commands';\n\nconst DEGREE = 3;\nconst WEIGHT_MIN = 1e-3;\nconst WEIGHT_MAX = 8;\nconst FLATTEN_SAMPLES = 64;\n\n/** Build a uniform open knot vector. For n control points and degree p,\n * knot vector length is n + p + 1: the first p+1 knots are 0, the last\n * p+1 knots are 1, intermediate knots are evenly spaced. Standard\n * \"clamped\" form so the curve passes through first and last anchors. */\nfunction openUniformKnots(n: number, p = DEGREE): number[] {\n const m = n + p + 1;\n const knots: number[] = [];\n for (let i = 0; i < m; i++) {\n if (i <= p) knots.push(0);\n else if (i >= n) knots.push(1);\n else knots.push((i - p) / (n - p));\n }\n return knots;\n}\n\nfunction findSpan(n: number, p: number, u: number, knots: number[]): number {\n if (u >= knots[n]) return n - 1;\n if (u <= knots[p]) return p;\n let lo = p;\n let hi = n;\n let mid = (lo + hi) >> 1;\n while (u < knots[mid] || u >= knots[mid + 1]) {\n if (u < knots[mid]) hi = mid;\n else lo = mid;\n mid = (lo + hi) >> 1;\n }\n return mid;\n}\n\nfunction basisFunctions(i: number, u: number, p: number, knots: number[]): number[] {\n const N = new Array<number>(p + 1).fill(0);\n N[0] = 1;\n const left = new Array<number>(p + 1).fill(0);\n const right = new Array<number>(p + 1).fill(0);\n for (let j = 1; j <= p; j++) {\n left[j] = u - knots[i + 1 - j];\n right[j] = knots[i + j] - u;\n let saved = 0;\n for (let r = 0; r < j; r++) {\n const temp = N[r] / (right[r + 1] + left[j - r]);\n N[r] = saved + right[r + 1] * temp;\n saved = left[j - r] * temp;\n }\n N[j] = saved;\n }\n return N;\n}\n\nfunction weightOf(a: SharedAnchor): number {\n const w = a.weight ?? 1;\n return Math.max(WEIGHT_MIN, Math.min(WEIGHT_MAX, w));\n}\n\nfunction evalNurbs(anchors: SharedAnchor[], u: number): { x: number; y: number } {\n const n = anchors.length;\n if (n === 0) return { x: 0, y: 0 };\n if (n === 1) return { x: anchors[0].x, y: anchors[0].y };\n const p = Math.min(DEGREE, n - 1);\n const knots = openUniformKnots(n, p);\n const clamped = Math.min(Math.max(u, 0), 1);\n const span = findSpan(n, p, clamped, knots);\n const N = basisFunctions(span, clamped, p, knots);\n let wx = 0;\n let wy = 0;\n let wTotal = 0;\n for (let j = 0; j <= p; j++) {\n const idx = span - p + j;\n const a = anchors[idx];\n const w = weightOf(a);\n wx += N[j] * w * a.x;\n wy += N[j] * w * a.y;\n wTotal += N[j] * w;\n }\n if (wTotal < 1e-12) return { x: anchors[0].x, y: anchors[0].y };\n return { x: wx / wTotal, y: wy / wTotal };\n}\n\n/** NURBS: anchors act as weighted control points the curve is pulled toward rather than passing through. Flattened to line segments when converted to a path. */\nexport const nurbs: CurveRepresentation = {\n kind: 'nurbs',\n label: 'NURBS',\n evaluate(anchors, t) {\n return evalNurbs(anchors, t);\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const cmds: number[] = [PATH_M];\n const xs: number[] = [];\n for (let s = 0; s <= FLATTEN_SAMPLES; s++) {\n const t = s / FLATTEN_SAMPLES;\n const p = evalNurbs(anchors, t);\n xs.push(p.x, p.y);\n if (s > 0) cmds.push(PATH_L);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(xs),\n fillRule: 'nonzero',\n };\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const eps = 1e-3;\n const t0 = Math.max(0, t - eps);\n const t1 = Math.min(1, t + eps);\n const p0 = evalNurbs(anchors, t0);\n const p2 = evalNurbs(anchors, t1);\n const pm = evalNurbs(anchors, t);\n const d1x = (p2.x - p0.x) / (t1 - t0);\n const d1y = (p2.y - p0.y) / (t1 - t0);\n const d2x = (p2.x - 2 * pm.x + p0.x) / (eps * eps);\n const d2y = (p2.y - 2 * pm.y + p0.y) / (eps * eps);\n const num = d1x * d2y - d1y * d2x;\n const den = Math.pow(d1x * d1x + d1y * d1y, 1.5);\n if (den < 1e-12) return 0;\n return num / den;\n },\n discriminators(anchors) {\n const out: Discriminator[] = [];\n for (let i = 0; i < anchors.length; i++) {\n out.push({\n kind: 'slider',\n label: `w${i}`,\n anchorIndex: i,\n field: 'weight',\n min: WEIGHT_MIN,\n max: WEIGHT_MAX,\n step: 0.1,\n value: weightOf(anchors[i]),\n });\n }\n return out;\n },\n};\n","// v1 Spiro: interpolating cubic spline with tangents computed from\n// neighbor positions for smooth anchors and pinned to incoming/outgoing\n// edges for corner anchors. This is NOT the full Raph Levien κ-curve\n// solver — that's a global numerical iteration. v1.1 swaps the real\n// Spiro in behind this same module surface.\nimport type { CurveRepresentation, Discriminator, SharedAnchor } from './types';\nimport { PATH_C, PATH_M } from '../commands';\nimport { cubicPointAt } from '../paths/cubicMath';\n\nconst TANGENT_SCALE = 1 / 3;\n\nfunction isCorner(a: SharedAnchor): boolean {\n return a.spiroType === 'corner';\n}\n\nfunction smoothTangent(anchors: SharedAnchor[], i: number): { x: number; y: number } | null {\n if (isCorner(anchors[i])) return null;\n const prev = i > 0 ? anchors[i - 1] : null;\n const next = i + 1 < anchors.length ? anchors[i + 1] : null;\n if (!prev && !next) return null;\n if (!prev) {\n return { x: next!.x - anchors[i].x, y: next!.y - anchors[i].y };\n }\n if (!next) {\n return { x: anchors[i].x - prev.x, y: anchors[i].y - prev.y };\n }\n const inDX = anchors[i].x - prev.x;\n const inDY = anchors[i].y - prev.y;\n const outDX = next.x - anchors[i].x;\n const outDY = next.y - anchors[i].y;\n const inLen = Math.hypot(inDX, inDY) || 1;\n const outLen = Math.hypot(outDX, outDY) || 1;\n return {\n x: inDX / inLen + outDX / outLen,\n y: inDY / inLen + outDY / outLen,\n };\n}\n\nfunction controlsFor(\n anchors: SharedAnchor[],\n i: number,\n): { c1: { x: number; y: number }; c2: { x: number; y: number } } {\n const a = anchors[i];\n const b = anchors[i + 1];\n const edge = { x: b.x - a.x, y: b.y - a.y };\n const edgeLen = Math.hypot(edge.x, edge.y) || 1;\n\n const tA = smoothTangent(anchors, i);\n const tB = smoothTangent(anchors, i + 1);\n\n const outA = tA ?? edge;\n const outB = tB ?? edge;\n\n const outALen = Math.hypot(outA.x, outA.y) || 1;\n const outBLen = Math.hypot(outB.x, outB.y) || 1;\n const handleLen = edgeLen * TANGENT_SCALE;\n return {\n c1: {\n x: a.x + (outA.x / outALen) * handleLen,\n y: a.y + (outA.y / outALen) * handleLen,\n },\n c2: {\n x: b.x - (outB.x / outBLen) * handleLen,\n y: b.y - (outB.y / outBLen) * handleLen,\n },\n };\n}\n\nfunction segmentAt(anchors: SharedAnchor[], t: number): { segIdx: number; localT: number } {\n if (anchors.length < 2) return { segIdx: 0, localT: 0 };\n const segments = anchors.length - 1;\n const scaled = Math.min(Math.max(t, 0), 1) * segments;\n const segIdx = Math.min(Math.floor(scaled), segments - 1);\n const localT = scaled - segIdx;\n return { segIdx, localT };\n}\n\n/** Spiro (κ-curves): curvature-continuous through each anchor, so joins stay visually smooth without hand-tuned handles. Approximated as cubics when converted to a path. */\nexport const spiro: CurveRepresentation = {\n kind: 'spiro',\n label: 'Spiro (κ-curves v1)',\n evaluate(anchors, t) {\n if (anchors.length < 2) return { x: anchors[0]?.x ?? 0, y: anchors[0]?.y ?? 0 };\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n const { c1, c2 } = controlsFor(anchors, segIdx);\n return cubicPointAt(a, c1, c2, b, localT);\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const cmds: number[] = [PATH_M];\n const xs: number[] = [anchors[0].x, anchors[0].y];\n for (let i = 0; i + 1 < anchors.length; i++) {\n const b = anchors[i + 1];\n const { c1, c2 } = controlsFor(anchors, i);\n cmds.push(PATH_C);\n xs.push(c1.x, c1.y, c2.x, c2.y, b.x, b.y);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(xs),\n fillRule: 'nonzero',\n };\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n const { c1, c2 } = controlsFor(anchors, segIdx);\n const u = 1 - localT;\n const d1x = 3 * u * u * (c1.x - a.x) + 6 * u * localT * (c2.x - c1.x) + 3 * localT * localT * (b.x - c2.x);\n const d1y = 3 * u * u * (c1.y - a.y) + 6 * u * localT * (c2.y - c1.y) + 3 * localT * localT * (b.y - c2.y);\n const d2x = 6 * u * (c2.x - 2 * c1.x + a.x) + 6 * localT * (b.x - 2 * c2.x + c1.x);\n const d2y = 6 * u * (c2.y - 2 * c1.y + a.y) + 6 * localT * (b.y - 2 * c2.y + c1.y);\n const num = d1x * d2y - d1y * d2x;\n const den = Math.pow(d1x * d1x + d1y * d1y, 1.5);\n if (den < 1e-12) return 0;\n return num / den;\n },\n discriminators(anchors) {\n const out: Discriminator[] = [];\n for (let i = 0; i < anchors.length; i++) {\n out.push({\n kind: 'enum',\n label: `t${i}`,\n anchorIndex: i,\n field: 'spiroType',\n options: ['g2-smooth', 'g4-smooth', 'corner'] as const,\n value: anchors[i].spiroType ?? 'g2-smooth',\n });\n }\n return out;\n },\n};\n","export type { SharedAnchor, CurveRepKind, CurveRepresentation, Discriminator } from './types';\nexport { bezierCubic } from './bezierCubic';\nexport { bezierQuadratic } from './bezierQuadratic';\nexport { nurbs } from './nurbs';\nexport { spiro } from './spiro';\n\nimport { bezierCubic } from './bezierCubic';\nimport { bezierQuadratic } from './bezierQuadratic';\nimport { nurbs } from './nurbs';\nimport { spiro } from './spiro';\nimport type { CurveRepresentation, CurveRepKind } from './types';\n\n/** Every curve representation the kit ships, keyed by kind. */\nexport const CURVE_REPS: Readonly<Record<CurveRepKind, CurveRepresentation>> = {\n bezierCubic,\n bezierQuadratic,\n nurbs,\n spiro,\n};\n"]}
1
+ {"version":3,"sources":["../../src/curves/anchorHandles.ts","../../src/curves/bezierCubic.ts","../../src/curves/bezierQuadratic.ts","../../src/curves/nurbs.ts","../../src/curves/spiro.ts","../../src/curves/index.ts"],"names":["smoothTangent"],"mappings":"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","file":"index.js","sourcesContent":["import type { SharedAnchor } from './types';\n\nconst DEFAULT_HANDLE_FRACTION = 1 / 3;\n\n/** Smooth tangent at anchor i derived from neighbor edges. Average the\n * incoming and outgoing edge directions weighted by inverse edge length\n * (centripetal-style) so short edges don't dominate. At endpoints the\n * single available edge wins. Without this, a handle colinear with one\n * segment produces a degenerate (visually straight) cubic. */\nfunction smoothTangent(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const prev = i > 0 ? anchors[i - 1] : null;\n const next = i + 1 < anchors.length ? anchors[i + 1] : null;\n if (!prev && next) return { x: next.x - anchors[i].x, y: next.y - anchors[i].y };\n if (prev && !next) return { x: anchors[i].x - prev.x, y: anchors[i].y - prev.y };\n if (prev && next) {\n const inLen = Math.hypot(anchors[i].x - prev.x, anchors[i].y - prev.y) || 1;\n const outLen = Math.hypot(next.x - anchors[i].x, next.y - anchors[i].y) || 1;\n return {\n x: (anchors[i].x - prev.x) / inLen + (next.x - anchors[i].x) / outLen,\n y: (anchors[i].y - prev.y) / inLen + (next.y - anchors[i].y) / outLen,\n };\n }\n return { x: 0, y: 0 };\n}\n\nexport function defaultOutHandle(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const a = anchors[i];\n if (a.outHandle) return a.outHandle;\n const next = anchors[i + 1];\n const edgeLen = Math.hypot(next.x - a.x, next.y - a.y);\n const t = smoothTangent(anchors, i);\n const tLen = Math.hypot(t.x, t.y) || 1;\n return {\n x: a.x + (t.x / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n y: a.y + (t.y / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n };\n}\n\nexport function defaultInHandle(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const b = anchors[i + 1];\n if (b.inHandle) return b.inHandle;\n const a = anchors[i];\n const edgeLen = Math.hypot(b.x - a.x, b.y - a.y);\n const t = smoothTangent(anchors, i + 1);\n const tLen = Math.hypot(t.x, t.y) || 1;\n return {\n x: b.x - (t.x / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n y: b.y - (t.y / tLen) * edgeLen * DEFAULT_HANDLE_FRACTION,\n };\n}\n\nexport function segmentAt(anchors: SharedAnchor[], t: number): { segIdx: number; localT: number } {\n if (anchors.length < 2) return { segIdx: 0, localT: 0 };\n const segments = anchors.length - 1;\n const scaled = Math.min(Math.max(t, 0), 1) * segments;\n const segIdx = Math.min(Math.floor(scaled), segments - 1);\n const localT = scaled - segIdx;\n return { segIdx, localT };\n}\n","import type { CurveRepresentation, Discriminator } from './types';\nimport { defaultInHandle, defaultOutHandle, segmentAt } from './anchorHandles';\nimport { PATH_C, PATH_M } from '../commands';\nimport { cubicPointAt } from '../paths/cubicMath';\n\nfunction cubicDeriv1(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n p3: { x: number; y: number },\n t: number,\n): { x: number; y: number } {\n const u = 1 - t;\n return {\n x: 3 * u * u * (p1.x - p0.x) + 6 * u * t * (p2.x - p1.x) + 3 * t * t * (p3.x - p2.x),\n y: 3 * u * u * (p1.y - p0.y) + 6 * u * t * (p2.y - p1.y) + 3 * t * t * (p3.y - p2.y),\n };\n}\n\nfunction cubicDeriv2(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n p3: { x: number; y: number },\n t: number,\n): { x: number; y: number } {\n const u = 1 - t;\n return {\n x: 6 * u * (p2.x - 2 * p1.x + p0.x) + 6 * t * (p3.x - 2 * p2.x + p1.x),\n y: 6 * u * (p2.y - 2 * p1.y + p0.y) + 6 * t * (p3.y - 2 * p2.y + p1.y),\n };\n}\n\n/** Cubic bezier: each segment takes two control handles. The familiar pen-tool curve, and what SVG path data stores natively. */\nexport const bezierCubic: CurveRepresentation = {\n kind: 'bezierCubic',\n label: 'Cubic Bezier',\n evaluate(anchors, t) {\n if (anchors.length < 2) return { x: anchors[0]?.x ?? 0, y: anchors[0]?.y ?? 0 };\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n return cubicPointAt(a, defaultOutHandle(anchors, segIdx), defaultInHandle(anchors, segIdx), b, localT);\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const cmds: number[] = [PATH_M];\n const xs: number[] = [anchors[0].x, anchors[0].y];\n for (let i = 0; i + 1 < anchors.length; i++) {\n const b = anchors[i + 1];\n const c1 = defaultOutHandle(anchors, i);\n const c2 = defaultInHandle(anchors, i);\n cmds.push(PATH_C);\n xs.push(c1.x, c1.y, c2.x, c2.y, b.x, b.y);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(xs),\n fillRule: 'nonzero',\n };\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n const p0 = a;\n const p1 = defaultOutHandle(anchors, segIdx);\n const p2 = defaultInHandle(anchors, segIdx);\n const p3 = b;\n const d1 = cubicDeriv1(p0, p1, p2, p3, localT);\n const d2 = cubicDeriv2(p0, p1, p2, p3, localT);\n const num = d1.x * d2.y - d1.y * d2.x;\n const den = Math.pow(d1.x * d1.x + d1.y * d1.y, 1.5);\n if (den < 1e-12) return 0;\n return num / den;\n },\n discriminators(anchors) {\n const out: Discriminator[] = [];\n for (let i = 0; i < anchors.length; i++) {\n const a = anchors[i];\n if (a.outHandle || i + 1 < anchors.length) {\n out.push({ kind: 'handle', anchorIndex: i, which: 'out' });\n }\n if (a.inHandle || i > 0) {\n out.push({ kind: 'handle', anchorIndex: i, which: 'in' });\n }\n }\n return out;\n },\n};\n","import type { CurveRepresentation, Discriminator, SharedAnchor } from './types';\nimport { PATH_M, PATH_Q } from '../commands';\nimport { defaultInHandle, defaultOutHandle, segmentAt } from './anchorHandles';\n\nfunction quadControl(anchors: SharedAnchor[], i: number): { x: number; y: number } {\n const c1 = defaultOutHandle(anchors, i);\n const c2 = defaultInHandle(anchors, i);\n return { x: (c1.x + c2.x) / 2, y: (c1.y + c2.y) / 2 };\n}\n\nfunction quadEval(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n t: number,\n): { x: number; y: number } {\n const u = 1 - t;\n return {\n x: u * u * p0.x + 2 * u * t * p1.x + t * t * p2.x,\n y: u * u * p0.y + 2 * u * t * p1.y + t * t * p2.y,\n };\n}\n\nfunction quadDeriv1(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n t: number,\n): { x: number; y: number } {\n const u = 1 - t;\n return {\n x: 2 * u * (p1.x - p0.x) + 2 * t * (p2.x - p1.x),\n y: 2 * u * (p1.y - p0.y) + 2 * t * (p2.y - p1.y),\n };\n}\n\nfunction quadDeriv2(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n): { x: number; y: number } {\n return {\n x: 2 * (p2.x - 2 * p1.x + p0.x),\n y: 2 * (p2.y - 2 * p1.y + p0.y),\n };\n}\n\n/** Quadratic bezier: one control point per segment. Cheaper than cubic and what TrueType glyph outlines use, at the cost of expressiveness. */\nexport const bezierQuadratic: CurveRepresentation = {\n kind: 'bezierQuadratic',\n label: 'Quadratic Bezier',\n evaluate(anchors, t) {\n if (anchors.length < 2) return { x: anchors[0]?.x ?? 0, y: anchors[0]?.y ?? 0 };\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n return quadEval(a, quadControl(anchors, segIdx), b, localT);\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const cmds: number[] = [PATH_M];\n const xs: number[] = [anchors[0].x, anchors[0].y];\n for (let i = 0; i + 1 < anchors.length; i++) {\n const b = anchors[i + 1];\n const q = quadControl(anchors, i);\n cmds.push(PATH_Q);\n xs.push(q.x, q.y, b.x, b.y);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(xs),\n fillRule: 'nonzero',\n };\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n const p1 = quadControl(anchors, segIdx);\n const d1 = quadDeriv1(a, p1, b, localT);\n const d2 = quadDeriv2(a, p1, b);\n const num = d1.x * d2.y - d1.y * d2.x;\n const den = Math.pow(d1.x * d1.x + d1.y * d1.y, 1.5);\n if (den < 1e-12) return 0;\n return num / den;\n },\n discriminators(_anchors): Discriminator[] {\n // Quadratic has no user-facing controls — each segment's quadratic\n // control is fully determined by the cubic handles via midpoint.\n return [];\n },\n};\n","import type { CurveRepresentation, Discriminator, SharedAnchor } from './types';\nimport { PATH_L, PATH_M } from '../commands';\n\nconst DEGREE = 3;\nconst WEIGHT_MIN = 1e-3;\nconst WEIGHT_MAX = 8;\nconst FLATTEN_SAMPLES = 64;\n\n/** Build a uniform open knot vector. For n control points and degree p,\n * knot vector length is n + p + 1: the first p+1 knots are 0, the last\n * p+1 knots are 1, intermediate knots are evenly spaced. Standard\n * \"clamped\" form so the curve passes through first and last anchors. */\nfunction openUniformKnots(n: number, p = DEGREE): number[] {\n const m = n + p + 1;\n const knots: number[] = [];\n for (let i = 0; i < m; i++) {\n if (i <= p) knots.push(0);\n else if (i >= n) knots.push(1);\n else knots.push((i - p) / (n - p));\n }\n return knots;\n}\n\nfunction findSpan(n: number, p: number, u: number, knots: number[]): number {\n if (u >= knots[n]) return n - 1;\n if (u <= knots[p]) return p;\n let lo = p;\n let hi = n;\n let mid = (lo + hi) >> 1;\n while (u < knots[mid] || u >= knots[mid + 1]) {\n if (u < knots[mid]) hi = mid;\n else lo = mid;\n mid = (lo + hi) >> 1;\n }\n return mid;\n}\n\nfunction basisFunctions(i: number, u: number, p: number, knots: number[]): number[] {\n const N = new Array<number>(p + 1).fill(0);\n N[0] = 1;\n const left = new Array<number>(p + 1).fill(0);\n const right = new Array<number>(p + 1).fill(0);\n for (let j = 1; j <= p; j++) {\n left[j] = u - knots[i + 1 - j];\n right[j] = knots[i + j] - u;\n let saved = 0;\n for (let r = 0; r < j; r++) {\n const temp = N[r] / (right[r + 1] + left[j - r]);\n N[r] = saved + right[r + 1] * temp;\n saved = left[j - r] * temp;\n }\n N[j] = saved;\n }\n return N;\n}\n\nfunction weightOf(a: SharedAnchor): number {\n const w = a.weight ?? 1;\n return Math.max(WEIGHT_MIN, Math.min(WEIGHT_MAX, w));\n}\n\nfunction evalNurbs(anchors: SharedAnchor[], u: number): { x: number; y: number } {\n const n = anchors.length;\n if (n === 0) return { x: 0, y: 0 };\n if (n === 1) return { x: anchors[0].x, y: anchors[0].y };\n const p = Math.min(DEGREE, n - 1);\n const knots = openUniformKnots(n, p);\n const clamped = Math.min(Math.max(u, 0), 1);\n const span = findSpan(n, p, clamped, knots);\n const N = basisFunctions(span, clamped, p, knots);\n let wx = 0;\n let wy = 0;\n let wTotal = 0;\n for (let j = 0; j <= p; j++) {\n const idx = span - p + j;\n const a = anchors[idx];\n const w = weightOf(a);\n wx += N[j] * w * a.x;\n wy += N[j] * w * a.y;\n wTotal += N[j] * w;\n }\n if (wTotal < 1e-12) return { x: anchors[0].x, y: anchors[0].y };\n return { x: wx / wTotal, y: wy / wTotal };\n}\n\n/** NURBS: anchors act as weighted control points the curve is pulled toward rather than passing through. Flattened to line segments when converted to a path. */\nexport const nurbs: CurveRepresentation = {\n kind: 'nurbs',\n label: 'NURBS',\n evaluate(anchors, t) {\n return evalNurbs(anchors, t);\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const cmds: number[] = [PATH_M];\n const xs: number[] = [];\n for (let s = 0; s <= FLATTEN_SAMPLES; s++) {\n const t = s / FLATTEN_SAMPLES;\n const p = evalNurbs(anchors, t);\n xs.push(p.x, p.y);\n if (s > 0) cmds.push(PATH_L);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(xs),\n fillRule: 'nonzero',\n };\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const eps = 1e-3;\n // The stencil needs a sample each side, so at an end it sits one step in.\n const tm = Math.min(1 - eps, Math.max(eps, t));\n const t0 = tm - eps;\n const t1 = tm + eps;\n const p0 = evalNurbs(anchors, t0);\n const p2 = evalNurbs(anchors, t1);\n const pm = evalNurbs(anchors, tm);\n const d1x = (p2.x - p0.x) / (t1 - t0);\n const d1y = (p2.y - p0.y) / (t1 - t0);\n const d2x = (p2.x - 2 * pm.x + p0.x) / (eps * eps);\n const d2y = (p2.y - 2 * pm.y + p0.y) / (eps * eps);\n const num = d1x * d2y - d1y * d2x;\n const den = Math.pow(d1x * d1x + d1y * d1y, 1.5);\n if (den < 1e-12) return 0;\n return num / den;\n },\n discriminators(anchors) {\n const out: Discriminator[] = [];\n for (let i = 0; i < anchors.length; i++) {\n out.push({\n kind: 'slider',\n label: `w${i}`,\n anchorIndex: i,\n field: 'weight',\n min: WEIGHT_MIN,\n max: WEIGHT_MAX,\n step: 0.1,\n value: weightOf(anchors[i]),\n });\n }\n return out;\n },\n};\n","// v1 Spiro: interpolating cubic spline with tangents computed from\n// neighbor positions for smooth anchors and pinned to incoming/outgoing\n// edges for corner anchors. This is NOT the full Raph Levien κ-curve\n// solver — that's a global numerical iteration. v1.1 swaps the real\n// Spiro in behind this same module surface.\nimport type { CurveRepresentation, Discriminator, SharedAnchor } from './types';\nimport { PATH_C, PATH_M } from '../commands';\nimport { segmentAt } from './anchorHandles';\nimport { cubicPointAt } from '../paths/cubicMath';\n\nconst TANGENT_SCALE = 1 / 3;\n\nfunction isCorner(a: SharedAnchor): boolean {\n return a.spiroType === 'corner';\n}\n\nfunction smoothTangent(anchors: SharedAnchor[], i: number): { x: number; y: number } | null {\n if (isCorner(anchors[i])) return null;\n const prev = i > 0 ? anchors[i - 1] : null;\n const next = i + 1 < anchors.length ? anchors[i + 1] : null;\n if (!prev && !next) return null;\n if (!prev) {\n return { x: next!.x - anchors[i].x, y: next!.y - anchors[i].y };\n }\n if (!next) {\n return { x: anchors[i].x - prev.x, y: anchors[i].y - prev.y };\n }\n const inDX = anchors[i].x - prev.x;\n const inDY = anchors[i].y - prev.y;\n const outDX = next.x - anchors[i].x;\n const outDY = next.y - anchors[i].y;\n const inLen = Math.hypot(inDX, inDY) || 1;\n const outLen = Math.hypot(outDX, outDY) || 1;\n return {\n x: inDX / inLen + outDX / outLen,\n y: inDY / inLen + outDY / outLen,\n };\n}\n\nfunction controlsFor(\n anchors: SharedAnchor[],\n i: number,\n): { c1: { x: number; y: number }; c2: { x: number; y: number } } {\n const a = anchors[i];\n const b = anchors[i + 1];\n const edge = { x: b.x - a.x, y: b.y - a.y };\n const edgeLen = Math.hypot(edge.x, edge.y) || 1;\n\n const tA = smoothTangent(anchors, i);\n const tB = smoothTangent(anchors, i + 1);\n\n const outA = tA ?? edge;\n const outB = tB ?? edge;\n\n const outALen = Math.hypot(outA.x, outA.y) || 1;\n const outBLen = Math.hypot(outB.x, outB.y) || 1;\n const handleLen = edgeLen * TANGENT_SCALE;\n return {\n c1: {\n x: a.x + (outA.x / outALen) * handleLen,\n y: a.y + (outA.y / outALen) * handleLen,\n },\n c2: {\n x: b.x - (outB.x / outBLen) * handleLen,\n y: b.y - (outB.y / outBLen) * handleLen,\n },\n };\n}\n\n/** Spiro (κ-curves): curvature-continuous through each anchor, so joins stay visually smooth without hand-tuned handles. Approximated as cubics when converted to a path. */\nexport const spiro: CurveRepresentation = {\n kind: 'spiro',\n label: 'Spiro (κ-curves v1)',\n evaluate(anchors, t) {\n if (anchors.length < 2) return { x: anchors[0]?.x ?? 0, y: anchors[0]?.y ?? 0 };\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n const { c1, c2 } = controlsFor(anchors, segIdx);\n return cubicPointAt(a, c1, c2, b, localT);\n },\n toPath(anchors) {\n if (anchors.length < 2) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const cmds: number[] = [PATH_M];\n const xs: number[] = [anchors[0].x, anchors[0].y];\n for (let i = 0; i + 1 < anchors.length; i++) {\n const b = anchors[i + 1];\n const { c1, c2 } = controlsFor(anchors, i);\n cmds.push(PATH_C);\n xs.push(c1.x, c1.y, c2.x, c2.y, b.x, b.y);\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(xs),\n fillRule: 'nonzero',\n };\n },\n curvatureAt(anchors, t) {\n if (anchors.length < 2) return 0;\n const { segIdx, localT } = segmentAt(anchors, t);\n const a = anchors[segIdx];\n const b = anchors[segIdx + 1];\n const { c1, c2 } = controlsFor(anchors, segIdx);\n const u = 1 - localT;\n const d1x = 3 * u * u * (c1.x - a.x) + 6 * u * localT * (c2.x - c1.x) + 3 * localT * localT * (b.x - c2.x);\n const d1y = 3 * u * u * (c1.y - a.y) + 6 * u * localT * (c2.y - c1.y) + 3 * localT * localT * (b.y - c2.y);\n const d2x = 6 * u * (c2.x - 2 * c1.x + a.x) + 6 * localT * (b.x - 2 * c2.x + c1.x);\n const d2y = 6 * u * (c2.y - 2 * c1.y + a.y) + 6 * localT * (b.y - 2 * c2.y + c1.y);\n const num = d1x * d2y - d1y * d2x;\n const den = Math.pow(d1x * d1x + d1y * d1y, 1.5);\n if (den < 1e-12) return 0;\n return num / den;\n },\n discriminators(anchors) {\n const out: Discriminator[] = [];\n for (let i = 0; i < anchors.length; i++) {\n out.push({\n kind: 'enum',\n label: `t${i}`,\n anchorIndex: i,\n field: 'spiroType',\n options: ['g2-smooth', 'g4-smooth', 'corner'] as const,\n value: anchors[i].spiroType ?? 'g2-smooth',\n });\n }\n return out;\n },\n};\n","export type { SharedAnchor, CurveRepKind, CurveRepresentation, Discriminator } from './types';\nexport { bezierCubic } from './bezierCubic';\nexport { bezierQuadratic } from './bezierQuadratic';\nexport { nurbs } from './nurbs';\nexport { spiro } from './spiro';\n\nimport { bezierCubic } from './bezierCubic';\nimport { bezierQuadratic } from './bezierQuadratic';\nimport { nurbs } from './nurbs';\nimport { spiro } from './spiro';\nimport type { CurveRepresentation, CurveRepKind } from './types';\n\n/** Every curve representation the kit ships, keyed by kind. */\nexport const CURVE_REPS: Readonly<Record<CurveRepKind, CurveRepresentation>> = {\n bezierCubic,\n bezierQuadratic,\n nurbs,\n spiro,\n};\n"]}