@weasel-js/geom 1.11.1 → 1.13.0-rc.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/snap/flat.ts","../../src/snap/resolve.ts","../../src/snap/stepLine.ts"],"names":["isFiniteVec"],"mappings":"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","file":"index.js","sourcesContent":["/** Affine subspaces (\"flats\") over plain number arrays, in any dimension:\n * the points, lines and planes a snap resolves against. */\n\nexport type Vec = readonly number[];\n\n/** The affine subspace `at + span(dirs)`. `dirs` need not be orthonormal or\n * independent; a zero or repeated direction adds nothing. */\nexport interface Flat {\n at: Vec;\n dirs: readonly Vec[];\n}\n\n/** A direction left with less than this fraction of its length after the\n * ones before it are taken out counts as dependent on them. The solve's\n * pivots are those leftover lengths squared, so it shares this one value.\n * Squaring loses angles below about 1e-8 rad to rounding; at 1e-8 the two\n * verdicts part, so this sits two decades clear. */\nconst RANK_TOL = 1e-6;\n\nfunction dotv(a: Vec, b: Vec): number {\n let s = 0;\n for (let i = 0; i < a.length; i++) s += a[i] * b[i];\n return s;\n}\n\nfunction normv(a: Vec): number {\n return Math.sqrt(dotv(a, a));\n}\n\nfunction isFiniteVec(a: Vec): boolean {\n return a.every(Number.isFinite);\n}\n\n/** An orthonormal basis of `span(vecs)`, built by Gram-Schmidt with a second\n * pass for stability. Non-finite and dependent vectors are dropped. */\nexport function orthonormalize(vecs: readonly Vec[], start: readonly Vec[] = []): number[][] {\n const basis: number[][] = start.map((q) => q.slice());\n const out: number[][] = [];\n for (const d of vecs) {\n const n0 = normv(d);\n if (!(n0 > 0) || !isFiniteVec(d)) continue;\n const v = d.slice();\n for (let pass = 0; pass < 2; pass++) {\n for (const q of basis) {\n const k = dotv(v, q);\n for (let i = 0; i < v.length; i++) v[i] -= k * q[i];\n }\n }\n const n = normv(v);\n if (n <= RANK_TOL * n0) continue;\n for (let i = 0; i < v.length; i++) v[i] /= n;\n basis.push(v);\n out.push(v);\n }\n return out;\n}\n\n/** An orthonormal basis of the orthogonal complement of the orthonormal `basis` in R^n. */\nfunction complement(basis: readonly Vec[], n: number): number[][] {\n const axes: number[][] = [];\n for (let i = 0; i < n; i++) axes.push(Array.from({ length: n }, (_, j) => (i === j ? 1 : 0)));\n return orthonormalize(axes, basis);\n}\n\n/** The flat's dimension: the rank of its directions. */\nexport function flatDim(f: Flat): number {\n return orthonormalize(f.dirs).length;\n}\n\n/** The point of `f` nearest `p`. */\nexport function closestOnFlat(f: Flat, p: Vec): Vec {\n const out = f.at.slice();\n for (const q of orthonormalize(f.dirs)) {\n let k = 0;\n for (let i = 0; i < q.length; i++) k += q[i] * (p[i] - f.at[i]);\n for (let i = 0; i < out.length; i++) out[i] += k * q[i];\n }\n return out;\n}\n\n/**\n * The `x` minimizing `|Σ x_j cols_j − rhs|`, through the normal equations.\n * A column within `RANK_TOL` of the span of the kept ones before it is\n * dropped, the same verdict `orthonormalize` reaches, and its unknown is zero.\n */\nexport function solveLeastSquares(cols: readonly Vec[], rhs: Vec): number[] {\n const k = cols.length;\n const m = cols.map((a) => [...cols.map((b) => dotv(a, b)), dotv(a, rhs)]);\n const len2 = m.map((r, i) => r[i]);\n const kept: number[] = [];\n for (let col = 0; col < k; col++) {\n if (!(m[col][col] > RANK_TOL * RANK_TOL * len2[col])) continue;\n for (let r = col + 1; r < k; r++) {\n const f = m[r][col] / m[col][col];\n for (let c = col; c <= k; c++) m[r][c] -= f * m[col][c];\n }\n kept.push(col);\n }\n const x = new Array<number>(k).fill(0);\n for (let p = kept.length - 1; p >= 0; p--) {\n const col = kept[p];\n let s = m[col][k];\n for (let c = col + 1; c < k; c++) s -= m[col][c] * x[c];\n x[col] = s / m[col][col];\n }\n return x;\n}\n\n/** The nearest pair of points, one on each flat. Parallel flats have many\n * such pairs; this returns one of them. */\nexport function closestBetweenFlats(a: Flat, b: Flat): { onA: Vec; onB: Vec } {\n const qa = orthonormalize(a.dirs);\n const qb = orthonormalize(b.dirs);\n const d = b.at.map((v, i) => v - a.at[i]);\n const x = solveLeastSquares([...qa, ...qb.map((q) => q.map((v) => -v))], d);\n const onA = a.at.slice();\n const onB = b.at.slice();\n qa.forEach((q, j) => q.forEach((v, i) => { onA[i] += x[j] * v; }));\n qb.forEach((q, j) => q.forEach((v, i) => { onB[i] += x[qa.length + j] * v; }));\n return { onA, onB };\n}\n\n/** `a ∩ b`, or null when they miss each other by more than `eps`. */\nexport function intersectFlats(a: Flat, b: Flat, eps = 1e-6): Flat | null {\n const { onA, onB } = closestBetweenFlats(a, b);\n let gap2 = 0;\n for (let i = 0; i < onA.length; i++) gap2 += (onA[i] - onB[i]) ** 2;\n if (!(Math.sqrt(gap2) <= eps) || !isFiniteVec(onA)) return null;\n const n = a.at.length;\n const normals = orthonormalize([\n ...complement(orthonormalize(a.dirs), n),\n ...complement(orthonormalize(b.dirs), n),\n ]);\n return { at: onA, dirs: complement(normals, n) };\n}\n","/** The snap resolver: every gesture's snap, in any dimension, as one search\n * over affine constraints on the move `δ`. */\n\nimport { closestOnFlat, flatDim, intersectFlats, solveLeastSquares, type Flat, type Vec } from './flat';\n\n/** A `fallback` candidate holds only the axes no `target` claims. */\nexport type SnapTier = 'target' | 'fallback';\n/** What a probe stands for on the subject; sources match probes by role. */\nexport type ProbeRole = 'origin' | 'box' | 'geometry' | 'pointer';\n\n/** A point on the subject that should land on a locus. `role` says which\n * sources may match it. */\nexport interface SnapProbe {\n id: string;\n at: Vec;\n role: ProbeRole;\n}\n\n/** One probe paired with one locus. `M` is the mark payload, opaque here. */\nexport interface SnapCandidate<M> {\n /** `SnapProbe.id`. */\n probe: string;\n locus: Flat;\n /** One interval per locus dir, in multiples of that dir. A solution\n * outside it fails the candidate. */\n span?: readonly (readonly [number, number])[];\n source: string;\n /** Stable tiebreak: lower wins when everything else is equal. */\n order: number;\n tier: SnapTier;\n reachPx: number;\n /** When any required candidate exists, the result includes one of them,\n * whatever its reach. */\n required?: boolean;\n mark?: M;\n}\n\n/** One frame's snap: the probes, the input subspace, the raw move, and the candidates. */\nexport interface SnapProblem<M> {\n probes: readonly SnapProbe[];\n /** `H`, the subspace of δ-space the result stays inside. */\n input: Flat;\n /** The unsnapped move. */\n delta0: Vec;\n candidates: readonly SnapCandidate<M>[];\n /** World to screen pixels. A non-finite result puts that position out of reach. */\n toScreen(world: Vec): Vec;\n /** Candidates kept per probe, nearest first, besides the required ones,\n * which are all kept. Default 24. */\n poolSize?: number;\n /** World-space tolerance for \"on the locus\". Default 1e-6. */\n eps?: number;\n}\n\n/** The move `resolveSnap` chose and the candidates it meets. */\nexport interface SnapResolution<M> {\n /** `closestOnFlat(input, delta0)` when nothing snaps. */\n delta: Vec;\n members: readonly SnapCandidate<M>[];\n /** Every in-reach candidate the result meets: the ones whose marks show. */\n satisfied: readonly SnapCandidate<M>[];\n /** How many dimensions of `H` the result pins. */\n codim: number;\n}\n\n/** A candidate that can be met on its own: its probe, and `H ∩ C` in δ-space. */\ninterface Live<M> {\n c: SnapCandidate<M>;\n probe: Vec;\n within: Flat;\n px: number;\n}\n\ninterface Combo<M> {\n members: Live<M>[];\n flat: Flat;\n dim: number;\n targetFlat: Flat;\n delta: Vec;\n codim: number;\n targetCodim: number;\n px: number;\n}\n\nconst DEFAULT_POOL = 24;\nconst DEFAULT_EPS = 1e-6;\n/** Screen displacements closer than this rank as equal, so order decides. */\nconst SAME_PX = 1e-9;\n\nconst plus = (a: Vec, b: Vec): Vec => a.map((v, i) => v + b[i]);\nconst minus = (a: Vec, b: Vec): Vec => a.map((v, i) => v - b[i]);\nconst isFiniteVec = (a: Vec): boolean => a.every(Number.isFinite);\n\nfunction distance(a: Vec, b: Vec): number {\n let s = 0;\n for (let i = 0; i < a.length; i++) s += (a[i] - b[i]) ** 2;\n return Math.sqrt(s);\n}\n\n/** What the resolver needs to measure a candidate against a trial δ. */\ninterface Measure {\n /** Screen pixels the probe moves going from δ0 (projected into `H`) to\n * `delta`; NaN when either end has no finite screen position. */\n move(probeId: string, probe: Vec, delta: Vec): number;\n eps: number;\n}\n\nfunction makeMeasure<M>(problem: SnapProblem<M>, base: Vec, eps: number): Measure {\n const home = new Map<string, Vec>();\n return {\n eps,\n move(probeId, probe, delta) {\n let h = home.get(probeId);\n if (!h) home.set(probeId, (h = problem.toScreen(plus(probe, base))));\n const d = distance(problem.toScreen(plus(probe, delta)), h);\n return Number.isFinite(d) ? d : NaN;\n },\n };\n}\n\nfunction spanHolds<M>(c: SnapCandidate<M>, world: Vec, eps: number): boolean {\n if (!c.span) return true;\n const u = solveLeastSquares(c.locus.dirs, minus(world, c.locus.at));\n return c.span.every(([lo, hi], i) => u[i] >= lo - eps && u[i] <= hi + eps);\n}\n\n/** The probe's screen move under `delta`, or null when it is out of reach or off the span. */\nfunction meets<M>(m: Measure, c: SnapCandidate<M>, probe: Vec, delta: Vec): number | null {\n const measured = m.move(c.probe, probe, delta);\n if (!c.required && (Number.isNaN(measured) || !(measured <= c.reachPx))) return null;\n const px = Number.isNaN(measured) ? Infinity : measured;\n return spanHolds(c, plus(probe, delta), m.eps) ? px : null;\n}\n\nfunction liveCandidates<M>(problem: SnapProblem<M>, m: Measure): Live<M>[] {\n const probes = new Map(problem.probes.map((p) => [p.id, p.at]));\n const live: Live<M>[] = [];\n for (const c of problem.candidates) {\n const probe = probes.get(c.probe);\n if (!probe || !isFiniteVec(probe) || !isFiniteVec(c.locus.at) || !c.locus.dirs.every(isFiniteVec)) continue;\n const within = intersectFlats(problem.input, { at: minus(c.locus.at, probe), dirs: c.locus.dirs }, m.eps);\n if (!within) continue;\n const px = meets(m, c, probe, closestOnFlat(within, problem.delta0));\n if (px !== null) live.push({ c, probe, within, px });\n }\n return live;\n}\n\nfunction pool<M>(live: Live<M>[], size: number): Live<M>[] {\n const byProbe = new Map<string, Live<M>[]>();\n for (const l of live) {\n const list = byProbe.get(l.c.probe) ?? [];\n list.push(l);\n byProbe.set(l.c.probe, list);\n }\n const out: Live<M>[] = [];\n for (const list of byProbe.values()) {\n list.sort((a, b) => (Math.abs(a.px - b.px) > SAME_PX ? a.px - b.px : a.c.order - b.c.order));\n out.push(...list.filter((l, i) => i < size || l.c.required));\n }\n return out;\n}\n\nfunction compareOrders<M>(a: Live<M>[], b: Live<M>[]): number {\n const oa = a.map((l) => l.c.order).sort((x, y) => x - y);\n const ob = b.map((l) => l.c.order).sort((x, y) => x - y);\n for (let i = 0; i < Math.min(oa.length, ob.length); i++) if (oa[i] !== ob[i]) return oa[i] - ob[i];\n return oa.length - ob.length;\n}\n\n/** Negative when `a` ranks ahead of `b`. */\nfunction compareCombos<M>(a: Combo<M>, b: Combo<M>): number {\n if (a.codim !== b.codim) return b.codim - a.codim;\n if (a.targetCodim !== b.targetCodim) return b.targetCodim - a.targetCodim;\n if (Math.abs(a.px - b.px) > SAME_PX) return a.px - b.px;\n return compareOrders(a.members, b.members);\n}\n\n/** `parent` plus `l`, or null when `l` adds no constraint or breaks a member's reach or span. */\nfunction extend<M>(parent: Combo<M>, l: Live<M>, input: Flat, delta0: Vec, m: Measure): Combo<M> | null {\n const hDim = flatDim(input);\n const flat = intersectFlats(parent.flat, l.within, m.eps);\n if (!flat) return null;\n const dim = flatDim(flat);\n if (dim >= parent.dim) return null;\n const delta = closestOnFlat(flat, delta0);\n if (!isFiniteVec(delta)) return null;\n const members = [...parent.members, l];\n for (const mem of members) if (meets(m, mem.c, mem.probe, delta) === null) return null;\n const targetFlat = l.c.tier === 'target'\n ? intersectFlats(parent.targetFlat, l.within, m.eps) ?? flat\n : parent.targetFlat;\n const kept = prune(members, input, dim, flatDim(targetFlat), m.eps);\n let px = 0;\n for (const mem of kept) {\n const p = meets(m, mem.c, mem.probe, delta);\n if (p === null) return null;\n px = Math.max(px, p);\n }\n return {\n members: kept, flat, dim, targetFlat, delta, px,\n codim: hDim - dim,\n targetCodim: hDim - flatDim(targetFlat),\n };\n}\n\n/** The flat `members` pin inside `input`, and the one their target-tier members pin. */\nfunction flatsOf<M>(members: readonly Live<M>[], input: Flat, eps: number): { dim: number; targetDim: number } | null {\n let flat: Flat | null = input;\n let target: Flat = input;\n for (const mem of members) {\n flat = intersectFlats(flat, mem.within, eps);\n if (!flat) return null;\n if (mem.c.tier === 'target') target = intersectFlats(target, mem.within, eps) ?? flat;\n }\n return { dim: flatDim(flat), targetDim: flatDim(target) };\n}\n\n/** `members` less every one the rest already imply, oldest first, so a\n * redundant member neither shows in `members` nor decides a tie on order. */\nfunction prune<M>(members: Live<M>[], input: Flat, dim: number, targetDim: number, eps: number): Live<M>[] {\n let kept = members;\n for (let i = 0; i < kept.length && kept.length > 1;) {\n const rest = kept.filter((_, j) => j !== i);\n const f = flatsOf(rest, input, eps);\n if (f && f.dim === dim && f.targetDim === targetDim) kept = rest;\n else i++;\n }\n return kept;\n}\n\n/** The best combination; when any can include a required candidate, the best of those. */\nfunction search<M>(candidates: Live<M>[], root: Combo<M>, delta0: Vec, m: Measure): Combo<M> {\n const best: { any: Combo<M>; required: Combo<M> | null } = { any: root, required: null };\n const consider = (c: Combo<M>) => {\n if (compareCombos(c, best.any) < 0) best.any = c;\n if (c.members.some((l) => l.c.required) && (!best.required || compareCombos(c, best.required) < 0)) {\n best.required = c;\n }\n };\n const visit = (start: number, parent: Combo<M>) => {\n for (let i = start; i < candidates.length; i++) {\n const next = extend(parent, candidates[i], root.flat, delta0, m);\n if (!next) continue;\n consider(next);\n if (next.dim > 0) visit(i + 1, next);\n }\n };\n visit(0, root);\n return best.required ?? best.any;\n}\n\nfunction satisfiedBy<M>(problem: SnapProblem<M>, delta: Vec, m: Measure): SnapCandidate<M>[] {\n const probes = new Map(problem.probes.map((p) => [p.id, p.at]));\n return problem.candidates.filter((c) => {\n const probe = probes.get(c.probe);\n if (!probe) return false;\n const world = plus(probe, delta);\n if (!(distance(closestOnFlat(c.locus, world), world) <= m.eps)) return false;\n return meets(m, c, probe, delta) !== null;\n });\n}\n\n/** The move nearest `delta0` within `H` that meets the best-ranked set of\n * candidates in reach, or `delta0` projected into `H` when none is. */\nexport function resolveSnap<M>(problem: SnapProblem<M>): SnapResolution<M> {\n const { input, delta0 } = problem;\n let base = closestOnFlat(input, delta0);\n if (!isFiniteVec(base)) base = isFiniteVec(input.at) ? input.at : input.at.map(() => 0);\n const m = makeMeasure(problem, base, problem.eps ?? DEFAULT_EPS);\n const hDim = flatDim(input);\n const root: Combo<M> = {\n members: [], flat: input, dim: hDim, targetFlat: input, delta: base, codim: 0, targetCodim: 0, px: 0,\n };\n const live = pool(liveCandidates(problem, m), problem.poolSize ?? DEFAULT_POOL);\n const win = search(live, root, delta0, m);\n return {\n delta: win.delta,\n members: win.members.map((l) => l.c),\n satisfied: satisfiedBy(problem, win.delta, m),\n codim: win.codim,\n };\n}\n","import type { Flat, Vec } from './flat';\n\n/**\n * The line through `about` whose direction, measured in the plane `basis`\n * spans (as an angle from `basis[0]` toward `basis[1]`), is the multiple of\n * `step` nearest the direction from `about` to `toward`: a constrained\n * gesture's input subspace, in any dimension. `basis` is orthonormal.\n */\nexport function stepLine(about: Vec, toward: Vec, basis: readonly [Vec, Vec], step: number): Flat {\n const [u, v] = basis;\n let a = 0;\n let b = 0;\n for (let i = 0; i < about.length; i++) {\n const d = toward[i] - about[i];\n a += d * u[i];\n b += d * v[i];\n }\n const theta = a === 0 && b === 0 ? 0 : Math.round(Math.atan2(b, a) / step) * step;\n const c = Math.cos(theta);\n const s = Math.sin(theta);\n return { at: about, dirs: [u.map((x, i) => x * c + v[i] * s)] };\n}\n"]}
1
+ {"version":3,"sources":["../../src/snap/flat.ts","../../src/snap/resolve.ts","../../src/snap/stepLine.ts","../../src/bvh/bvhTree.ts","../../src/bvh/bvhQuery.ts","../../src/bvh/bvh.ts"],"names":["isFiniteVec","meets","pool","grow"],"mappings":"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","file":"index.js","sourcesContent":["/** Affine subspaces (\"flats\") over plain number arrays, in any dimension:\n * the points, lines and planes a snap resolves against. */\n\nexport type Vec = readonly number[];\n\n/** The affine subspace `at + span(dirs)`. `dirs` need not be orthonormal or\n * independent; a zero or repeated direction adds nothing. */\nexport interface Flat {\n at: Vec;\n dirs: readonly Vec[];\n}\n\n/** A direction left with less than this fraction of its length after the\n * ones before it are taken out counts as dependent on them. The solve's\n * pivots are those leftover lengths squared, so it shares this one value.\n * Squaring loses angles below about 1e-8 rad to rounding; at 1e-8 the two\n * verdicts part, so this sits two decades clear. */\nconst RANK_TOL = 1e-6;\n\nfunction dotv(a: Vec, b: Vec): number {\n let s = 0;\n for (let i = 0; i < a.length; i++) s += a[i] * b[i];\n return s;\n}\n\nfunction normv(a: Vec): number {\n return Math.sqrt(dotv(a, a));\n}\n\nfunction isFiniteVec(a: Vec): boolean {\n return a.every(Number.isFinite);\n}\n\n/** An orthonormal basis of `span(vecs)`, built by Gram-Schmidt with a second\n * pass for stability. Non-finite and dependent vectors are dropped. */\nexport function orthonormalize(vecs: readonly Vec[], start: readonly Vec[] = []): number[][] {\n const basis: number[][] = start.map((q) => q.slice());\n const out: number[][] = [];\n for (const d of vecs) {\n const n0 = normv(d);\n if (!(n0 > 0) || !isFiniteVec(d)) continue;\n const v = d.slice();\n for (let pass = 0; pass < 2; pass++) {\n for (const q of basis) {\n const k = dotv(v, q);\n for (let i = 0; i < v.length; i++) v[i] -= k * q[i];\n }\n }\n const n = normv(v);\n if (n <= RANK_TOL * n0) continue;\n for (let i = 0; i < v.length; i++) v[i] /= n;\n basis.push(v);\n out.push(v);\n }\n return out;\n}\n\n/** An orthonormal basis of the orthogonal complement of the orthonormal `basis` in R^n. */\nfunction complement(basis: readonly Vec[], n: number): number[][] {\n const axes: number[][] = [];\n for (let i = 0; i < n; i++) axes.push(Array.from({ length: n }, (_, j) => (i === j ? 1 : 0)));\n return orthonormalize(axes, basis);\n}\n\n/** The flat's dimension: the rank of its directions. */\nexport function flatDim(f: Flat): number {\n return orthonormalize(f.dirs).length;\n}\n\n/** The point of `f` nearest `p`. */\nexport function closestOnFlat(f: Flat, p: Vec): Vec {\n const out = f.at.slice();\n for (const q of orthonormalize(f.dirs)) {\n let k = 0;\n for (let i = 0; i < q.length; i++) k += q[i] * (p[i] - f.at[i]);\n for (let i = 0; i < out.length; i++) out[i] += k * q[i];\n }\n return out;\n}\n\n/**\n * The `x` minimizing `|Σ x_j cols_j − rhs|`, through the normal equations.\n * A column within `RANK_TOL` of the span of the kept ones before it is\n * dropped, the same verdict `orthonormalize` reaches, and its unknown is zero.\n */\nexport function solveLeastSquares(cols: readonly Vec[], rhs: Vec): number[] {\n const k = cols.length;\n const m = cols.map((a) => [...cols.map((b) => dotv(a, b)), dotv(a, rhs)]);\n const len2 = m.map((r, i) => r[i]);\n const kept: number[] = [];\n for (let col = 0; col < k; col++) {\n if (!(m[col][col] > RANK_TOL * RANK_TOL * len2[col])) continue;\n for (let r = col + 1; r < k; r++) {\n const f = m[r][col] / m[col][col];\n for (let c = col; c <= k; c++) m[r][c] -= f * m[col][c];\n }\n kept.push(col);\n }\n const x = new Array<number>(k).fill(0);\n for (let p = kept.length - 1; p >= 0; p--) {\n const col = kept[p];\n let s = m[col][k];\n for (let c = col + 1; c < k; c++) s -= m[col][c] * x[c];\n x[col] = s / m[col][col];\n }\n return x;\n}\n\n/** The nearest pair of points, one on each flat. Parallel flats have many\n * such pairs; this returns one of them. */\nexport function closestBetweenFlats(a: Flat, b: Flat): { onA: Vec; onB: Vec } {\n const qa = orthonormalize(a.dirs);\n const qb = orthonormalize(b.dirs);\n const d = b.at.map((v, i) => v - a.at[i]);\n const x = solveLeastSquares([...qa, ...qb.map((q) => q.map((v) => -v))], d);\n const onA = a.at.slice();\n const onB = b.at.slice();\n qa.forEach((q, j) => q.forEach((v, i) => { onA[i] += x[j] * v; }));\n qb.forEach((q, j) => q.forEach((v, i) => { onB[i] += x[qa.length + j] * v; }));\n return { onA, onB };\n}\n\n/** `a ∩ b`, or null when they miss each other by more than `eps`. */\nexport function intersectFlats(a: Flat, b: Flat, eps = 1e-6): Flat | null {\n const { onA, onB } = closestBetweenFlats(a, b);\n let gap2 = 0;\n for (let i = 0; i < onA.length; i++) gap2 += (onA[i] - onB[i]) ** 2;\n if (!(Math.sqrt(gap2) <= eps) || !isFiniteVec(onA)) return null;\n const n = a.at.length;\n const normals = orthonormalize([\n ...complement(orthonormalize(a.dirs), n),\n ...complement(orthonormalize(b.dirs), n),\n ]);\n return { at: onA, dirs: complement(normals, n) };\n}\n","/** The snap resolver: every gesture's snap, in any dimension, as one search\n * over affine constraints on the move `δ`. */\n\nimport { closestOnFlat, flatDim, intersectFlats, solveLeastSquares, type Flat, type Vec } from './flat';\n\n/** A `fallback` candidate holds only the axes no `target` claims. */\nexport type SnapTier = 'target' | 'fallback';\n/** What a probe stands for on the subject; sources match probes by role. */\nexport type ProbeRole = 'origin' | 'box' | 'geometry' | 'pointer';\n\n/** A point on the subject that should land on a locus. `role` says which\n * sources may match it. */\nexport interface SnapProbe {\n id: string;\n at: Vec;\n role: ProbeRole;\n}\n\n/** One probe paired with one locus. `M` is the mark payload, opaque here. */\nexport interface SnapCandidate<M> {\n /** `SnapProbe.id`. */\n probe: string;\n locus: Flat;\n /** One interval per locus dir, in multiples of that dir. A solution\n * outside it fails the candidate. */\n span?: readonly (readonly [number, number])[];\n source: string;\n /** Stable tiebreak: lower wins when everything else is equal. */\n order: number;\n tier: SnapTier;\n reachPx: number;\n /** When any required candidate exists, the result includes one of them,\n * whatever its reach. */\n required?: boolean;\n mark?: M;\n}\n\n/** One frame's snap: the probes, the input subspace, the raw move, and the candidates. */\nexport interface SnapProblem<M> {\n probes: readonly SnapProbe[];\n /** `H`, the subspace of δ-space the result stays inside. */\n input: Flat;\n /** The unsnapped move. */\n delta0: Vec;\n candidates: readonly SnapCandidate<M>[];\n /** World to screen pixels. A non-finite result puts that position out of reach. */\n toScreen(world: Vec): Vec;\n /** Candidates kept per probe, nearest first, besides the required ones,\n * which are all kept. Default 24. */\n poolSize?: number;\n /** World-space tolerance for \"on the locus\". Default 1e-6. */\n eps?: number;\n}\n\n/** The move `resolveSnap` chose and the candidates it meets. */\nexport interface SnapResolution<M> {\n /** `closestOnFlat(input, delta0)` when nothing snaps. */\n delta: Vec;\n members: readonly SnapCandidate<M>[];\n /** Every in-reach candidate the result meets: the ones whose marks show. */\n satisfied: readonly SnapCandidate<M>[];\n /** How many dimensions of `H` the result pins. */\n codim: number;\n}\n\n/** A candidate that can be met on its own: its probe, and `H ∩ C` in δ-space. */\ninterface Live<M> {\n c: SnapCandidate<M>;\n probe: Vec;\n within: Flat;\n px: number;\n}\n\ninterface Combo<M> {\n members: Live<M>[];\n flat: Flat;\n dim: number;\n targetFlat: Flat;\n delta: Vec;\n codim: number;\n targetCodim: number;\n px: number;\n}\n\nconst DEFAULT_POOL = 24;\nconst DEFAULT_EPS = 1e-6;\n/** Screen displacements closer than this rank as equal, so order decides. */\nconst SAME_PX = 1e-9;\n\nconst plus = (a: Vec, b: Vec): Vec => a.map((v, i) => v + b[i]);\nconst minus = (a: Vec, b: Vec): Vec => a.map((v, i) => v - b[i]);\nconst isFiniteVec = (a: Vec): boolean => a.every(Number.isFinite);\n\nfunction distance(a: Vec, b: Vec): number {\n let s = 0;\n for (let i = 0; i < a.length; i++) s += (a[i] - b[i]) ** 2;\n return Math.sqrt(s);\n}\n\n/** What the resolver needs to measure a candidate against a trial δ. */\ninterface Measure {\n /** Screen pixels the probe moves going from δ0 (projected into `H`) to\n * `delta`; NaN when either end has no finite screen position. */\n move(probeId: string, probe: Vec, delta: Vec): number;\n eps: number;\n}\n\nfunction makeMeasure<M>(problem: SnapProblem<M>, base: Vec, eps: number): Measure {\n const home = new Map<string, Vec>();\n return {\n eps,\n move(probeId, probe, delta) {\n let h = home.get(probeId);\n if (!h) home.set(probeId, (h = problem.toScreen(plus(probe, base))));\n const d = distance(problem.toScreen(plus(probe, delta)), h);\n return Number.isFinite(d) ? d : NaN;\n },\n };\n}\n\nfunction spanHolds<M>(c: SnapCandidate<M>, world: Vec, eps: number): boolean {\n if (!c.span) return true;\n const u = solveLeastSquares(c.locus.dirs, minus(world, c.locus.at));\n return c.span.every(([lo, hi], i) => u[i] >= lo - eps && u[i] <= hi + eps);\n}\n\n/** The probe's screen move under `delta`, or null when it is out of reach or off the span. */\nfunction meets<M>(m: Measure, c: SnapCandidate<M>, probe: Vec, delta: Vec): number | null {\n const measured = m.move(c.probe, probe, delta);\n if (!c.required && (Number.isNaN(measured) || !(measured <= c.reachPx))) return null;\n const px = Number.isNaN(measured) ? Infinity : measured;\n return spanHolds(c, plus(probe, delta), m.eps) ? px : null;\n}\n\nfunction liveCandidates<M>(problem: SnapProblem<M>, m: Measure): Live<M>[] {\n const probes = new Map(problem.probes.map((p) => [p.id, p.at]));\n const live: Live<M>[] = [];\n for (const c of problem.candidates) {\n const probe = probes.get(c.probe);\n if (!probe || !isFiniteVec(probe) || !isFiniteVec(c.locus.at) || !c.locus.dirs.every(isFiniteVec)) continue;\n const within = intersectFlats(problem.input, { at: minus(c.locus.at, probe), dirs: c.locus.dirs }, m.eps);\n if (!within) continue;\n const px = meets(m, c, probe, closestOnFlat(within, problem.delta0));\n if (px !== null) live.push({ c, probe, within, px });\n }\n return live;\n}\n\nfunction pool<M>(live: Live<M>[], size: number): Live<M>[] {\n const byProbe = new Map<string, Live<M>[]>();\n for (const l of live) {\n const list = byProbe.get(l.c.probe) ?? [];\n list.push(l);\n byProbe.set(l.c.probe, list);\n }\n const out: Live<M>[] = [];\n for (const list of byProbe.values()) {\n list.sort((a, b) => (Math.abs(a.px - b.px) > SAME_PX ? a.px - b.px : a.c.order - b.c.order));\n out.push(...list.filter((l, i) => i < size || l.c.required));\n }\n return out;\n}\n\nfunction compareOrders<M>(a: Live<M>[], b: Live<M>[]): number {\n const oa = a.map((l) => l.c.order).sort((x, y) => x - y);\n const ob = b.map((l) => l.c.order).sort((x, y) => x - y);\n for (let i = 0; i < Math.min(oa.length, ob.length); i++) if (oa[i] !== ob[i]) return oa[i] - ob[i];\n return oa.length - ob.length;\n}\n\n/** Negative when `a` ranks ahead of `b`. */\nfunction compareCombos<M>(a: Combo<M>, b: Combo<M>): number {\n if (a.codim !== b.codim) return b.codim - a.codim;\n if (a.targetCodim !== b.targetCodim) return b.targetCodim - a.targetCodim;\n if (Math.abs(a.px - b.px) > SAME_PX) return a.px - b.px;\n return compareOrders(a.members, b.members);\n}\n\n/** `parent` plus `l`, or null when `l` adds no constraint or breaks a member's reach or span. */\nfunction extend<M>(parent: Combo<M>, l: Live<M>, input: Flat, delta0: Vec, m: Measure): Combo<M> | null {\n const hDim = flatDim(input);\n const flat = intersectFlats(parent.flat, l.within, m.eps);\n if (!flat) return null;\n const dim = flatDim(flat);\n if (dim >= parent.dim) return null;\n const delta = closestOnFlat(flat, delta0);\n if (!isFiniteVec(delta)) return null;\n const members = [...parent.members, l];\n for (const mem of members) if (meets(m, mem.c, mem.probe, delta) === null) return null;\n const targetFlat = l.c.tier === 'target'\n ? intersectFlats(parent.targetFlat, l.within, m.eps) ?? flat\n : parent.targetFlat;\n const kept = prune(members, input, dim, flatDim(targetFlat), m.eps);\n let px = 0;\n for (const mem of kept) {\n const p = meets(m, mem.c, mem.probe, delta);\n if (p === null) return null;\n px = Math.max(px, p);\n }\n return {\n members: kept, flat, dim, targetFlat, delta, px,\n codim: hDim - dim,\n targetCodim: hDim - flatDim(targetFlat),\n };\n}\n\n/** The flat `members` pin inside `input`, and the one their target-tier members pin. */\nfunction flatsOf<M>(members: readonly Live<M>[], input: Flat, eps: number): { dim: number; targetDim: number } | null {\n let flat: Flat | null = input;\n let target: Flat = input;\n for (const mem of members) {\n flat = intersectFlats(flat, mem.within, eps);\n if (!flat) return null;\n if (mem.c.tier === 'target') target = intersectFlats(target, mem.within, eps) ?? flat;\n }\n return { dim: flatDim(flat), targetDim: flatDim(target) };\n}\n\n/** `members` less every one the rest already imply, oldest first, so a\n * redundant member neither shows in `members` nor decides a tie on order. */\nfunction prune<M>(members: Live<M>[], input: Flat, dim: number, targetDim: number, eps: number): Live<M>[] {\n let kept = members;\n for (let i = 0; i < kept.length && kept.length > 1;) {\n const rest = kept.filter((_, j) => j !== i);\n const f = flatsOf(rest, input, eps);\n if (f && f.dim === dim && f.targetDim === targetDim) kept = rest;\n else i++;\n }\n return kept;\n}\n\n/** The best combination; when any can include a required candidate, the best of those. */\nfunction search<M>(candidates: Live<M>[], root: Combo<M>, delta0: Vec, m: Measure): Combo<M> {\n const best: { any: Combo<M>; required: Combo<M> | null } = { any: root, required: null };\n const consider = (c: Combo<M>) => {\n if (compareCombos(c, best.any) < 0) best.any = c;\n if (c.members.some((l) => l.c.required) && (!best.required || compareCombos(c, best.required) < 0)) {\n best.required = c;\n }\n };\n const visit = (start: number, parent: Combo<M>) => {\n for (let i = start; i < candidates.length; i++) {\n const next = extend(parent, candidates[i], root.flat, delta0, m);\n if (!next) continue;\n consider(next);\n if (next.dim > 0) visit(i + 1, next);\n }\n };\n visit(0, root);\n return best.required ?? best.any;\n}\n\nfunction satisfiedBy<M>(problem: SnapProblem<M>, delta: Vec, m: Measure): SnapCandidate<M>[] {\n const probes = new Map(problem.probes.map((p) => [p.id, p.at]));\n return problem.candidates.filter((c) => {\n const probe = probes.get(c.probe);\n if (!probe) return false;\n const world = plus(probe, delta);\n if (!(distance(closestOnFlat(c.locus, world), world) <= m.eps)) return false;\n return meets(m, c, probe, delta) !== null;\n });\n}\n\n/** The move nearest `delta0` within `H` that meets the best-ranked set of\n * candidates in reach, or `delta0` projected into `H` when none is. */\nexport function resolveSnap<M>(problem: SnapProblem<M>): SnapResolution<M> {\n const { input, delta0 } = problem;\n let base = closestOnFlat(input, delta0);\n if (!isFiniteVec(base)) base = isFiniteVec(input.at) ? input.at : input.at.map(() => 0);\n const m = makeMeasure(problem, base, problem.eps ?? DEFAULT_EPS);\n const hDim = flatDim(input);\n const root: Combo<M> = {\n members: [], flat: input, dim: hDim, targetFlat: input, delta: base, codim: 0, targetCodim: 0, px: 0,\n };\n const live = pool(liveCandidates(problem, m), problem.poolSize ?? DEFAULT_POOL);\n const win = search(live, root, delta0, m);\n return {\n delta: win.delta,\n members: win.members.map((l) => l.c),\n satisfied: satisfiedBy(problem, win.delta, m),\n codim: win.codim,\n };\n}\n","import type { Flat, Vec } from './flat';\n\n/**\n * The line through `about` whose direction, measured in the plane `basis`\n * spans (as an angle from `basis[0]` toward `basis[1]`), is the multiple of\n * `step` nearest the direction from `about` to `toward`: a constrained\n * gesture's input subspace, in any dimension. `basis` is orthonormal.\n */\nexport function stepLine(about: Vec, toward: Vec, basis: readonly [Vec, Vec], step: number): Flat {\n const [u, v] = basis;\n let a = 0;\n let b = 0;\n for (let i = 0; i < about.length; i++) {\n const d = toward[i] - about[i];\n a += d * u[i];\n b += d * v[i];\n }\n const theta = a === 0 && b === 0 ? 0 : Math.round(Math.atan2(b, a) / step) * step;\n const c = Math.cos(theta);\n const s = Math.sin(theta);\n return { at: about, dirs: [u.map((x, i) => x * c + v[i] * s)] };\n}\n","/** Storage and topology for `createBvh`: flat typed arrays for nodes and\n * items, the top-down build, and the leaf split an insert triggers. */\n\nexport const LEAF_SIZE = 4;\n\n/** Node and item storage. A node with `left[n] === -1` is a leaf holding\n * `leafCount[n]` item indices at `leafItems[n * LEAF_SIZE]`; `count[n]` is\n * the number of items under `n`. */\nexport class BvhTree<K> {\n readonly dim: number;\n root = -1;\n nodeBox: Float64Array;\n left: Int32Array;\n right: Int32Array;\n parent: Int32Array;\n leafCount: Int32Array;\n leafItems: Int32Array;\n count: Int32Array;\n private nodeCap = 0;\n private nodeTop = 0;\n private freeNodes: number[] = [];\n\n itemBox: Float64Array;\n /** Twice each item's box center, `[item * dim + axis]`: what a build splits on. */\n itemCentroid2: Float64Array;\n itemLeaf: Int32Array;\n keys: (K | undefined)[] = [];\n private itemCap = 0;\n private itemTop = 0;\n private freeItems: number[] = [];\n\n constructor(dim: number) {\n this.dim = dim;\n this.nodeBox = new Float64Array(0);\n this.left = this.right = this.parent = this.leafCount = this.leafItems = this.count = new Int32Array(0);\n this.itemBox = new Float64Array(0);\n this.itemCentroid2 = new Float64Array(0);\n this.itemLeaf = new Int32Array(0);\n this.growNodes(16);\n this.growItems(16);\n }\n\n private growNodes(cap: number): void {\n const s = 2 * this.dim;\n this.nodeBox = grow(this.nodeBox, cap * s);\n this.left = grow(this.left, cap);\n this.right = grow(this.right, cap);\n this.parent = grow(this.parent, cap);\n this.leafCount = grow(this.leafCount, cap);\n this.leafItems = grow(this.leafItems, cap * LEAF_SIZE);\n this.count = grow(this.count, cap);\n this.nodeCap = cap;\n }\n\n private growItems(cap: number): void {\n this.itemBox = grow(this.itemBox, cap * 2 * this.dim);\n this.itemCentroid2 = grow(this.itemCentroid2, cap * this.dim);\n this.itemLeaf = grow(this.itemLeaf, cap);\n this.itemCap = cap;\n }\n\n allocNode(parent: number): number {\n let n = this.freeNodes.pop();\n if (n === undefined) {\n if (this.nodeTop === this.nodeCap) this.growNodes(this.nodeCap * 2);\n n = this.nodeTop++;\n }\n this.left[n] = -1;\n this.right[n] = -1;\n this.parent[n] = parent;\n this.leafCount[n] = 0;\n return n;\n }\n\n freeNode(n: number): void {\n this.freeNodes.push(n);\n }\n\n allocItem(key: K, box: ArrayLike<number>): number {\n let i = this.freeItems.pop();\n if (i === undefined) {\n if (this.itemTop === this.itemCap) this.growItems(this.itemCap * 2);\n i = this.itemTop++;\n }\n this.keys[i] = key;\n this.writeItemBox(i, box);\n return i;\n }\n\n freeItem(i: number): void {\n this.keys[i] = undefined;\n this.itemLeaf[i] = -1;\n this.freeItems.push(i);\n }\n\n writeItemBox(i: number, box: ArrayLike<number>): void {\n const d = this.dim;\n const s = 2 * d;\n for (let j = 0; j < s; j++) this.itemBox[i * s + j] = box[j];\n for (let a = 0; a < d; a++) this.itemCentroid2[i * d + a] = box[a] + box[d + a];\n }\n\n /** Recompute `n`'s box and count from its children or items. */\n computeBox(n: number): void {\n const d = this.dim;\n const s = 2 * d;\n const nb = this.nodeBox;\n const o = n * s;\n for (let j = 0; j < d; j++) { nb[o + j] = Infinity; nb[o + d + j] = -Infinity; }\n if (this.left[n] !== -1) {\n unionInto(nb, o, nb, this.left[n] * s, d);\n unionInto(nb, o, nb, this.right[n] * s, d);\n this.count[n] = this.count[this.left[n]] + this.count[this.right[n]];\n return;\n }\n this.count[n] = this.leafCount[n];\n const base = n * LEAF_SIZE;\n for (let k = 0; k < this.leafCount[n]; k++) unionInto(nb, o, this.itemBox, this.leafItems[base + k] * s, d);\n }\n\n refitUp(n: number): void {\n for (; n !== -1; n = this.parent[n]) this.computeBox(n);\n }\n\n /** Discard the topology and rebuild it top-down over every live item. */\n build(): void {\n this.freeNodes = [];\n this.nodeTop = 0;\n this.root = -1;\n const live: number[] = [];\n for (let i = 0; i < this.itemTop; i++) if (this.itemLeaf[i] !== -1) live.push(i);\n if (live.length === 0) return;\n if (this.nodeCap < 2 * live.length) this.growNodes(2 * live.length);\n const idx = Int32Array.from(live);\n this.root = this.buildRange(idx, 0, idx.length, -1);\n }\n\n /** Rebuild the subtree under `n` balanced, in its place. */\n rebuildSubtree(n: number): void {\n const p = this.parent[n];\n const wasLeft = p !== -1 && this.left[p] === n;\n const items = new Int32Array(this.count[n]);\n const nodes = [n];\n let m = 0;\n while (nodes.length > 0) {\n const c = nodes.pop()!;\n if (this.left[c] !== -1) nodes.push(this.left[c], this.right[c]);\n else for (let k = 0; k < this.leafCount[c]; k++) items[m++] = this.leafItems[c * LEAF_SIZE + k];\n this.freeNode(c);\n }\n const r = this.buildRange(items, 0, m, p);\n if (p === -1) this.root = r;\n else if (wasLeft) this.left[p] = r;\n else this.right[p] = r;\n }\n\n /** `key` is scratch the length of `idx`, for `select`. */\n private buildRange(idx: Int32Array, lo: number, hi: number, parent: number, key = new Float64Array(idx.length)): number {\n const n = this.allocNode(parent);\n if (hi - lo <= LEAF_SIZE) {\n for (let k = lo; k < hi; k++) this.placeInLeaf(n, idx[k]);\n } else {\n const mid = (lo + hi) >> 1;\n this.select(idx, key, lo, hi, mid, this.longestCentroidAxis(idx, lo, hi));\n const l = this.buildRange(idx, lo, mid, n, key);\n const r = this.buildRange(idx, mid, hi, n, key);\n this.left[n] = l;\n this.right[n] = r;\n }\n this.computeBox(n);\n return n;\n }\n\n placeInLeaf(n: number, item: number): void {\n this.leafItems[n * LEAF_SIZE + this.leafCount[n]++] = item;\n this.itemLeaf[item] = n;\n }\n\n /** Turn a full leaf into an internal node over two leaves, the full set\n * plus `extra` split at the median of their longest centroid axis. */\n splitLeaf(n: number, extra: number): void {\n const base = n * LEAF_SIZE;\n const idx = new Int32Array(LEAF_SIZE + 1);\n for (let k = 0; k < LEAF_SIZE; k++) idx[k] = this.leafItems[base + k];\n idx[LEAF_SIZE] = extra;\n const mid = idx.length >> 1;\n this.select(idx, new Float64Array(idx.length), 0, idx.length, mid, this.longestCentroidAxis(idx, 0, idx.length));\n this.leafCount[n] = 0;\n const l = this.allocNode(n);\n const r = this.allocNode(n);\n for (let k = 0; k < mid; k++) this.placeInLeaf(l, idx[k]);\n for (let k = mid; k < idx.length; k++) this.placeInLeaf(r, idx[k]);\n this.left[n] = l;\n this.right[n] = r;\n this.computeBox(l);\n this.computeBox(r);\n }\n\n private longestCentroidAxis(idx: Int32Array, lo: number, hi: number): number {\n const d = this.dim;\n const cent = this.itemCentroid2;\n let best = 0;\n let bestExt = -1;\n for (let a = 0; a < this.dim; a++) {\n let mn = Infinity;\n let mx = -Infinity;\n for (let k = lo; k < hi; k++) {\n const c = cent[idx[k] * d + a];\n if (c < mn) mn = c;\n if (c > mx) mx = c;\n }\n if (mx - mn > bestExt) { bestExt = mx - mn; best = a; }\n }\n return best;\n }\n\n /** Quickselect: reorder `idx[lo, hi)` so `idx[k]` holds the item whose\n * centroid on `axis` ranks k, with smaller ones before it. The centroids\n * are copied into `key` beside `idx` and swapped with it, so the scans read\n * memory in order. */\n private select(idx: Int32Array, key: Float64Array, lo: number, hi: number, k: number, axis: number): void {\n const d = this.dim;\n const cent = this.itemCentroid2;\n for (let m = lo; m < hi; m++) key[m] = cent[idx[m] * d + axis];\n let a = lo;\n let b = hi - 1;\n while (a < b) {\n const pivot = key[(a + b) >> 1];\n let i = a;\n let j = b;\n while (i <= j) {\n while (key[i] < pivot) i++;\n while (key[j] > pivot) j--;\n if (i <= j) {\n const t = idx[i]; idx[i] = idx[j]; idx[j] = t;\n const u = key[i]; key[i] = key[j]; key[j] = u;\n i++;\n j--;\n }\n }\n if (k <= j) b = j;\n else if (k >= i) a = i;\n else return;\n }\n }\n}\n\nfunction grow<T extends Float64Array | Int32Array>(arr: T, len: number): T {\n const next = new (arr.constructor as new (n: number) => T)(len);\n next.set(arr);\n return next;\n}\n\n/** Grow the box at `dst[o]` to cover the box at `src[so]`. */\nexport function unionInto(dst: Float64Array, o: number, src: ArrayLike<number>, so: number, d: number): void {\n for (let j = 0; j < d; j++) {\n if (src[so + j] < dst[o + j]) dst[o + j] = src[so + j];\n if (src[so + d + j] > dst[o + d + j]) dst[o + d + j] = src[so + d + j];\n }\n}\n","/** Traversals over a `BvhTree`. Each takes its buffers from a `Scratch`,\n * so a query allocates nothing unless a visit re-enters the tree. */\nimport { LEAF_SIZE, type BvhTree } from './bvhTree';\n\n/** A half-space bounded by a plane: a point `x` is inside when\n * `dot(normal, x) + offset >= 0`. */\nexport interface HalfSpace { normal: ArrayLike<number>; offset: number }\n\ntype Visit<K> = (key: K) => boolean | void;\n\n/** Reusable traversal buffers; a re-entrant query gets fresh ones. */\nexport class Scratch {\n stack = new Int32Array(64);\n heapT = new Float64Array(64);\n heapId = new Int32Array(64);\n private busy = false;\n\n take(): Scratch {\n if (this.busy) return new Scratch();\n this.busy = true;\n return this;\n }\n\n release(): void { this.busy = false; }\n\n stackAt(len: number): Int32Array {\n if (len >= this.stack.length) {\n const next = new Int32Array(this.stack.length * 2);\n next.set(this.stack);\n this.stack = next;\n }\n return this.stack;\n }\n\n ensureHeap(len: number): void {\n if (len < this.heapT.length) return;\n const t = new Float64Array(this.heapT.length * 2);\n const id = new Int32Array(this.heapId.length * 2);\n t.set(this.heapT);\n id.set(this.heapId);\n this.heapT = t;\n this.heapId = id;\n }\n}\n\n/** Push onto the min-heap of `size` entries in `sc`; returns the new size. */\nfunction heapPush(sc: Scratch, size: number, t: number, id: number): number {\n sc.ensureHeap(size + 1);\n const ht = sc.heapT;\n const hid = sc.heapId;\n let i = size;\n while (i > 0) {\n const p = (i - 1) >> 1;\n if (ht[p] <= t) break;\n ht[i] = ht[p]; hid[i] = hid[p];\n i = p;\n }\n ht[i] = t; hid[i] = id;\n return size + 1;\n}\n\n/** Drop the minimum of a heap of `size` entries. */\nfunction heapPop(sc: Scratch, size: number): void {\n const ht = sc.heapT;\n const hid = sc.heapId;\n const n = size - 1;\n const lastT = ht[n];\n const lastId = hid[n];\n let i = 0;\n for (;;) {\n let c = 2 * i + 1;\n if (c >= n) break;\n if (c + 1 < n && ht[c + 1] < ht[c]) c++;\n if (ht[c] >= lastT) break;\n ht[i] = ht[c]; hid[i] = hid[c];\n i = c;\n }\n ht[i] = lastT; hid[i] = lastId;\n}\n\n/** Closed-interval overlap of the box at `arr[o]` with the query box whose\n * mins sit at `q[qmin]` and maxes at `q[qmax]`. */\nfunction meets(arr: Float64Array, o: number, d: number, q: ArrayLike<number>, qmin: number, qmax: number): boolean {\n for (let j = 0; j < d; j++) if (arr[o + j] > q[qmax + j] || q[qmin + j] > arr[o + d + j]) return false;\n return true;\n}\n\n/** Visit every item whose box meets the query box `q[qmin..]`/`q[qmax..]`. */\nexport function queryOverlap<K>(tree: BvhTree<K>, pool: Scratch, q: ArrayLike<number>, qmin: number, qmax: number, visit: Visit<K>): void {\n if (tree.root === -1) return;\n const sc = pool.take();\n const d = tree.dim;\n const s = 2 * d;\n try {\n let stack = sc.stackAt(0);\n let sp = 0;\n stack[sp++] = tree.root;\n while (sp > 0) {\n const n = stack[--sp];\n if (!meets(tree.nodeBox, n * s, d, q, qmin, qmax)) continue;\n if (tree.left[n] === -1) {\n const base = n * LEAF_SIZE;\n for (let k = 0; k < tree.leafCount[n]; k++) {\n const it = tree.leafItems[base + k];\n if (meets(tree.itemBox, it * s, d, q, qmin, qmax) && visit(tree.keys[it] as K) === false) return;\n }\n continue;\n }\n stack = sc.stackAt(sp + 1);\n stack[sp++] = tree.left[n];\n stack[sp++] = tree.right[n];\n }\n } finally {\n sc.release();\n }\n}\n\n/** False when the box at `arr[o]` lies wholly outside some plane. */\nfunction notOutside(arr: Float64Array, o: number, d: number, planes: readonly HalfSpace[]): boolean {\n for (let p = 0; p < planes.length; p++) {\n const { normal, offset } = planes[p];\n let v = offset;\n for (let j = 0; j < d; j++) v += normal[j] * (normal[j] >= 0 ? arr[o + d + j] : arr[o + j]);\n if (v < 0) return false;\n }\n return true;\n}\n\nexport function queryHalfSpaces<K>(tree: BvhTree<K>, pool: Scratch, planes: readonly HalfSpace[], visit: Visit<K>): void {\n if (tree.root === -1) return;\n const sc = pool.take();\n const d = tree.dim;\n const s = 2 * d;\n try {\n let stack = sc.stackAt(0);\n let sp = 0;\n stack[sp++] = tree.root;\n while (sp > 0) {\n const n = stack[--sp];\n if (!notOutside(tree.nodeBox, n * s, d, planes)) continue;\n if (tree.left[n] === -1) {\n const base = n * LEAF_SIZE;\n for (let k = 0; k < tree.leafCount[n]; k++) {\n const it = tree.leafItems[base + k];\n if (notOutside(tree.itemBox, it * s, d, planes) && visit(tree.keys[it] as K) === false) return;\n }\n continue;\n }\n stack = sc.stackAt(sp + 1);\n stack[sp++] = tree.left[n];\n stack[sp++] = tree.right[n];\n }\n } finally {\n sc.release();\n }\n}\n\n/** Slab test: the ray's entry t into the box at `arr[o]`, clamped to\n * [0, tMax], or -1 when it misses. */\nfunction entry(arr: Float64Array, o: number, d: number, org: ArrayLike<number>, dir: ArrayLike<number>, tMax: number): number {\n let near = 0;\n let far = tMax;\n for (let j = 0; j < d; j++) {\n const lo = arr[o + j];\n const hi = arr[o + d + j];\n // Divides, as `intersectRayAabb` does: a reciprocal rounds differently\n // and can reject a ray grazing an edge that the exact test accepts.\n if (dir[j] === 0) {\n if (org[j] < lo || org[j] > hi) return -1;\n continue;\n }\n const t1 = (lo - org[j]) / dir[j];\n const t2 = (hi - org[j]) / dir[j];\n if (t1 < t2) { if (t1 > near) near = t1; if (t2 < far) far = t2; }\n else { if (t2 > near) near = t2; if (t1 < far) far = t1; }\n if (near > far) return -1;\n }\n return near;\n}\n\n/** Best-first over entry t: nodes and items share one min-heap, an item\n * stored as `-(index + 1)`, so items pop in nondecreasing t. */\nexport function raycast<K>(\n tree: BvhTree<K>, pool: Scratch, org: ArrayLike<number>, dir: ArrayLike<number>,\n visit: (key: K, t: number) => boolean | void, tMax: number,\n): void {\n if (tree.root === -1) return;\n const d = tree.dim;\n const s = 2 * d;\n const t0 = entry(tree.nodeBox, tree.root * s, d, org, dir, tMax);\n if (t0 < 0) return;\n const sc = pool.take();\n try {\n let size = heapPush(sc, 0, t0, tree.root);\n while (size > 0) {\n const t = sc.heapT[0];\n const id = sc.heapId[0];\n heapPop(sc, size--);\n if (id < 0) {\n if (visit(tree.keys[-id - 1] as K, t) === false) return;\n continue;\n }\n if (tree.left[id] === -1) {\n const base = id * LEAF_SIZE;\n for (let k = 0; k < tree.leafCount[id]; k++) {\n const it = tree.leafItems[base + k];\n const ti = entry(tree.itemBox, it * s, d, org, dir, tMax);\n if (ti >= 0) size = heapPush(sc, size, ti, -it - 1);\n }\n continue;\n }\n const l = tree.left[id];\n const r = tree.right[id];\n const tl = entry(tree.nodeBox, l * s, d, org, dir, tMax);\n if (tl >= 0) size = heapPush(sc, size, tl, l);\n const tr = entry(tree.nodeBox, r * s, d, org, dir, tMax);\n if (tr >= 0) size = heapPush(sc, size, tr, r);\n }\n } finally {\n sc.release();\n }\n}\n","/** A bounding volume hierarchy over axis-aligned boxes in any dimension: the\n * broad phase for point, box, ray and half-space picks. Boxes are closed,\n * so two that touch at an edge meet; callers apply their own exact test. */\nimport { LEAF_SIZE, BvhTree } from './bvhTree';\nimport { Scratch, queryHalfSpaces, queryOverlap, raycast, type HalfSpace } from './bvhQuery';\n\nexport type { HalfSpace };\n\n/** Box layout: [min_0..min_{d-1}, max_0..max_{d-1}]. */\nexport type BoxN = ArrayLike<number>;\n\n/** A bounding volume hierarchy keyed by `K`, made by {@link createBvh}. */\nexport interface Bvh<K> {\n readonly dim: number;\n readonly size: number;\n /** False (and not stored) when any coordinate is non-finite or min > max.\n * Inserting a key already present updates it. */\n insert(key: K, box: BoxN): boolean;\n /** False, keeping the old box, when the key is absent or the box invalid. */\n update(key: K, box: BoxN): boolean;\n remove(key: K): boolean;\n /** Tighten every node box after updates that only moved items in place. */\n refit(): void;\n /** Rebuild the hierarchy top-down from the current boxes. */\n rebuild(): void;\n /** visit returns false to stop. In every query, changing the tree from inside\n * a visit (insert, update, remove, refit, rebuild) is undefined. */\n queryBox(box: BoxN, visit: (key: K) => boolean | void): void;\n queryPoint(p: ArrayLike<number>, visit: (key: K) => boolean | void): void;\n /** Leaves in nondecreasing order of box entry distance t (t >= 0, t <= tMax). */\n raycast(origin: ArrayLike<number>, dir: ArrayLike<number>, visit: (key: K, t: number) => boolean | void, tMax?: number): void;\n /** Leaves whose box is not wholly outside any half-space (conservative). */\n queryHalfSpaces(planes: readonly HalfSpace[], visit: (key: K) => boolean | void): void;\n}\n\n/** Weight balance past which a subtree counts as lopsided. Below\n * `1/sqrt(2)`, so an unbalanced ancestor exists on any path deeper than\n * `depthLimit`: an item at depth h sits under at most `ALPHA^h * n` items. */\nconst ALPHA = 0.7;\n\n/** Deepest a leaf may sit after an insert. */\nfunction depthLimit(n: number): number {\n return 2 * Math.ceil(Math.log2(Math.max(n, 2)));\n}\n\n/** Leaf depth of a median-split build over `m` items. */\nfunction balancedHeight(m: number): number {\n let h = 0;\n for (; m > LEAF_SIZE; m = Math.ceil(m / 2)) h++;\n return h;\n}\n\nfunction validBox(box: BoxN, dim: number): boolean {\n if (box.length < 2 * dim) return false;\n for (let j = 0; j < dim; j++) {\n const lo = box[j];\n const hi = box[dim + j];\n if (!Number.isFinite(lo) || !Number.isFinite(hi) || lo > hi) return false;\n }\n return true;\n}\n\nclass BvhImpl<K> implements Bvh<K> {\n readonly dim: number;\n private readonly tree: BvhTree<K>;\n private readonly items = new Map<K, number>();\n private readonly scratch = new Scratch();\n /** Largest size since the last whole rebuild; shrinking to half of it rebuilds again. */\n private peakSize = 0;\n\n constructor(dim: number) {\n this.dim = dim;\n this.tree = new BvhTree<K>(dim);\n }\n\n get size(): number { return this.items.size; }\n\n /** Store without touching the topology; `rebuild` places them. */\n load(entries: Iterable<readonly [K, BoxN]>): void {\n for (const [key, box] of entries) {\n if (!validBox(box, this.dim)) continue;\n const old = this.items.get(key);\n if (old !== undefined) { this.tree.writeItemBox(old, box); continue; }\n const it = this.tree.allocItem(key, box);\n this.tree.itemLeaf[it] = 0; // marks it live for build()\n this.items.set(key, it);\n }\n }\n\n insert(key: K, box: BoxN): boolean {\n if (!validBox(box, this.dim)) return false;\n if (this.items.has(key)) return this.update(key, box);\n const it = this.tree.allocItem(key, box);\n this.items.set(key, it);\n if (this.items.size > this.peakSize) this.peakSize = this.items.size;\n this.place(it);\n return true;\n }\n\n update(key: K, box: BoxN): boolean {\n const it = this.items.get(key);\n if (it === undefined || !validBox(box, this.dim)) return false;\n const t = this.tree;\n const leaf = t.itemLeaf[it];\n if (this.leafHolds(leaf, box)) {\n t.writeItemBox(it, box);\n return true;\n }\n this.detach(it);\n t.writeItemBox(it, box);\n this.place(it);\n return true;\n }\n\n remove(key: K): boolean {\n const it = this.items.get(key);\n if (it === undefined) return false;\n this.detach(it);\n this.items.delete(key);\n this.tree.freeItem(it);\n if (this.items.size < this.peakSize >> 1) this.rebuild();\n return true;\n }\n\n refit(): void {\n const t = this.tree;\n if (t.root === -1) return;\n const sc = this.scratch.take();\n try {\n // Children land after their parent, so the reversed order is bottom-up.\n let order = sc.stackAt(0);\n order[0] = t.root;\n let len = 1;\n for (let i = 0; i < len; i++) {\n const n = order[i];\n if (t.left[n] === -1) continue;\n order = sc.stackAt(len + 1);\n order[len++] = t.left[n];\n order[len++] = t.right[n];\n }\n for (let i = len - 1; i >= 0; i--) t.computeBox(order[i]);\n } finally {\n sc.release();\n }\n }\n\n rebuild(): void {\n this.tree.build();\n this.peakSize = this.items.size;\n }\n\n /** Deepest leaf, counting the root as depth 0. */\n maxDepth(): number {\n const t = this.tree;\n if (t.root === -1) return 0;\n let deepest = 0;\n const stack: [number, number][] = [[t.root, 0]];\n while (stack.length > 0) {\n const [n, d] = stack.pop()!;\n if (t.left[n] === -1) deepest = Math.max(deepest, d);\n else stack.push([t.left[n], d + 1], [t.right[n], d + 1]);\n }\n return deepest;\n }\n\n queryBox(box: BoxN, visit: (key: K) => boolean | void): void {\n queryOverlap(this.tree, this.scratch, box, 0, this.dim, visit);\n }\n\n queryPoint(p: ArrayLike<number>, visit: (key: K) => boolean | void): void {\n queryOverlap(this.tree, this.scratch, p, 0, 0, visit);\n }\n\n raycast(origin: ArrayLike<number>, dir: ArrayLike<number>, visit: (key: K, t: number) => boolean | void, tMax = Infinity): void {\n raycast(this.tree, this.scratch, origin, dir, visit, tMax);\n }\n\n queryHalfSpaces(planes: readonly HalfSpace[], visit: (key: K) => boolean | void): void {\n queryHalfSpaces(this.tree, this.scratch, planes, visit);\n }\n\n private leafHolds(leaf: number, box: BoxN): boolean {\n const d = this.dim;\n const o = leaf * 2 * d;\n const nb = this.tree.nodeBox;\n for (let j = 0; j < d; j++) if (box[j] < nb[o + j] || box[d + j] > nb[o + d + j]) return false;\n return true;\n }\n\n /** Descend by least enlargement and add `it` to a leaf, splitting it when full. */\n private place(it: number): void {\n const t = this.tree;\n if (t.root === -1) {\n t.root = t.allocNode(-1);\n t.placeInLeaf(t.root, it);\n t.computeBox(t.root);\n return;\n }\n let n = t.root;\n let depth = 0;\n while (t.left[n] !== -1) {\n const l = t.left[n];\n const r = t.right[n];\n const el = this.enlargement(l, it);\n const er = this.enlargement(r, it);\n n = el < er || (el === er && t.count[l] <= t.count[r]) ? l : r;\n depth++;\n }\n if (t.leafCount[n] < LEAF_SIZE) t.placeInLeaf(n, it);\n else { t.splitLeaf(n, it); depth++; }\n t.refitUp(n);\n if (depth > depthLimit(this.items.size)) this.rebalance(t.itemLeaf[it], depth);\n }\n\n /** Least enlargement alone lets sorted or coincident inserts grow one\n * spine. Rebuild the lowest ancestor whose balanced rebuild brings this\n * leaf back within the limit, preferring a weight-unbalanced one. */\n private rebalance(leaf: number, depth: number): void {\n const t = this.tree;\n const limit = depthLimit(this.items.size);\n let fit = -1;\n for (let c = leaf, a = t.parent[leaf], d = depth - 1; a !== -1; c = a, a = t.parent[a], d--) {\n if (d + balancedHeight(t.count[a]) > limit) continue;\n if (t.count[c] > ALPHA * t.count[a]) { t.rebuildSubtree(a); return; }\n if (fit === -1) fit = a;\n }\n if (fit !== -1) t.rebuildSubtree(fit);\n else this.rebuild();\n }\n\n /** Margin (sum of extents) a node would gain by covering item `it`. Margin\n * rather than volume, so zero-extent boxes still rank. */\n private enlargement(n: number, it: number): number {\n const d = this.dim;\n const nb = this.tree.nodeBox;\n const ib = this.tree.itemBox;\n const o = n * 2 * d;\n const io = it * 2 * d;\n let grow = 0;\n for (let j = 0; j < d; j++) {\n const lo = Math.min(nb[o + j], ib[io + j]);\n const hi = Math.max(nb[o + d + j], ib[io + d + j]);\n grow += hi - lo - (nb[o + d + j] - nb[o + j]);\n }\n return grow;\n }\n\n /** Take `it` out of its leaf, collapsing the leaf into its sibling when it empties. */\n private detach(it: number): void {\n const t = this.tree;\n const leaf = t.itemLeaf[it];\n const base = leaf * LEAF_SIZE;\n const count = t.leafCount[leaf];\n for (let k = 0; k < count; k++) {\n if (t.leafItems[base + k] !== it) continue;\n t.leafItems[base + k] = t.leafItems[base + count - 1];\n break;\n }\n t.leafCount[leaf] = count - 1;\n t.itemLeaf[it] = -1;\n if (count > 1) { t.refitUp(leaf); return; }\n const p = t.parent[leaf];\n t.freeNode(leaf);\n if (p === -1) { t.root = -1; return; }\n const sib = t.left[p] === leaf ? t.right[p] : t.left[p];\n const g = t.parent[p];\n t.parent[sib] = g;\n if (g === -1) t.root = sib;\n else if (t.left[g] === p) t.left[g] = sib;\n else t.right[g] = sib;\n t.freeNode(p);\n t.refitUp(g);\n }\n}\n\n/** Deepest leaf of a tree `createBvh` made, root at depth 0. Tests use it;\n * the `./nd` barrel does not export it. */\nexport function bvhMaxDepth(bvh: Bvh<unknown>): number {\n return (bvh as BvhImpl<unknown>).maxDepth();\n}\n\n/** A BVH over `dim`-dimensional boxes, built top-down from `entries` when\n * given. Entries with an invalid box are skipped. */\nexport function createBvh<K>(dim: number, entries?: Iterable<readonly [K, BoxN]>): Bvh<K> {\n if (!Number.isInteger(dim) || dim < 1) throw new RangeError(`createBvh: dim must be a positive integer, got ${dim}`);\n const bvh = new BvhImpl<K>(dim);\n if (entries) {\n bvh.load(entries);\n bvh.rebuild();\n }\n return bvh;\n}\n"]}
@@ -1,6 +1,6 @@
1
- export { extractPolylines } from '../chunk-7F66PQCJ.js';
2
- export { tessellate } from '../chunk-LRVPK7HI.js';
3
- import '../chunk-EAKE3N7W.js';
1
+ export { extractPolylines } from '../chunk-VHXOCDZ2.js';
2
+ export { tessellate } from '../chunk-UGE57OTX.js';
3
+ import '../chunk-2PKPKU4P.js';
4
4
  import '../chunk-755Y4YZS.js';
5
5
  import '../chunk-B53BERKG.js';
6
6
 
@@ -1,8 +1,8 @@
1
- import { boundsOfPath, keepCorner, fitPointRun } from '../chunk-6FGQML7D.js';
1
+ import { boundsOfPath, keepCorner, fitPointRun } from '../chunk-STGSBIOL.js';
2
2
  import { pathToAnchors, anchorsToPath } from '../chunk-Q66NA2FU.js';
3
3
  import '../chunk-CE7IY7TB.js';
4
- import { nestRings, flattenPolygon, resolveCrossings } from '../chunk-LRVPK7HI.js';
5
- import { pointInPolygon } from '../chunk-EAKE3N7W.js';
4
+ import { nestRings, flattenPolygon, resolveCrossings } from '../chunk-UGE57OTX.js';
5
+ import { pointInPolygon } from '../chunk-2PKPKU4P.js';
6
6
  import '../chunk-755Y4YZS.js';
7
7
  import { cubicPointAt } from '../chunk-B53BERKG.js';
8
8
  import earcut from 'earcut';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@weasel-js/geom",
3
- "version": "1.11.1",
4
- "description": "Pure geometry kernel for @weasel-js/core: affine, box, curve, polyline, the Path command stream and its math, and easing curves in 2D. Dependency-free core; curve representations in ./curves, tessellation in ./tessellate (earcut), polygon booleans and path splitting in ./booleans (polygon-clipping), vectors, quaternions, 4x4 matrices and ray intersection in ./3d.",
3
+ "version": "1.13.0-rc.0",
4
+ "description": "Pure geometry kernel for @weasel-js/core: affine, box, curve, polyline, the Path command stream and its math, and easing curves in 2D. Dependency-free core; curve representations in ./curves, tessellation in ./tessellate (earcut), polygon booleans and path splitting in ./booleans (polygon-clipping), vectors, quaternions, 4x4 matrices and ray intersection in ./3d, and dimension-generic snapping and a BVH (bounding volume hierarchy) for box, point, ray and half-space queries in ./nd.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "sideEffects": false,
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/flatten.ts","../src/polyline.ts","../src/openFill.ts","../src/paths/schneiderFit.ts","../src/paths/cornerShape.ts","../src/paths/cornerSegments.ts","../src/paths/corners.ts"],"names":["len2","fit","sub","unit"],"mappings":"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","file":"chunk-EAKE3N7W.js","sourcesContent":["/**\n * Bezier flattening — subdivide cubic and quadratic segments into polyline\n * approximations within a flatness tolerance.\n *\n * The flatness metric is the maximum distance from any control point to the\n * chord between endpoints.\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/** Whether a control polygon turns `maxTurn` radians or less in all, skipping\n * zero-length legs. Its turn bounds the turn of the curve it controls, so it\n * bounds the corner a chord standing in for that curve can leave. */\nfunction turnsWithin(\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number,\n maxTurn: number,\n): boolean {\n let turn = legTurn(x1 - x0, y1 - y0, x2 - x1, y2 - y1);\n if (turn > maxTurn) return false;\n turn += legTurn(x2 - x1, y2 - y1, x3 - x2, y3 - y2);\n if (x2 === x1 && y2 === y1) turn += legTurn(x1 - x0, y1 - y0, x3 - x2, y3 - y2);\n return turn <= maxTurn;\n}\n\n/** Angle between two legs; zero when either has no length. */\nfunction legTurn(ax: number, ay: number, bx: number, by: number): number {\n const lens = Math.sqrt((ax * ax + ay * ay) * (bx * bx + by * by));\n if (lens === 0) return 0;\n return Math.acos(Math.max(-1, Math.min(1, (ax * bx + ay * by) / lens)));\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 to `arcOut`, for each new flattened\n * point, its *cumulative distance from the segment start* — not a normalized\n * fraction. The caller divides each by the segment's total flattened arc\n * length to yield t ∈ (0, 1]. `maxTurn`, in radians, also bounds how far each\n * piece's control polygon may turn.\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 maxTurn = Infinity,\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), maxTurn, 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 maxTurn: 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 const flat = Math.max(d1, d2) <= tolerance\n && (maxTurn === Infinity || turnsWithin(x0, y0, x1, y1, x2, y2, x3, y3, maxTurn));\n if (flat || 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, maxTurn, out, arcOut, accum, depth + 1);\n accum = flattenCubicArcRec(x0123, y0123, x123, y123, x23, y23, x3, y3, tolerance, maxTurn, 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 maxTurn = Infinity,\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), maxTurn, 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 maxTurn: 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 const flat = d <= tolerance\n && (maxTurn === Infinity || turnsWithin(x0, y0, x1, y1, x2, y2, x2, y2, maxTurn));\n if (flat || 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, maxTurn, out, arcOut, accum, depth + 1);\n accum = flattenQuadraticArcRec(x012, y012, x12, y12, x2, y2, tolerance, maxTurn, 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","import type { PathOpenFill, PolygonPath } from './path';\n\nlet fallback: PathOpenFill = 'close';\n\n/** Set whether a fill closes an open subpath, for every path that names no\n * `openFill` of its own. Starts at `'close'`. */\nexport function setDefaultOpenFill(rule: PathOpenFill): void {\n fallback = rule;\n}\n\n/** The rule a path with no `openFill` of its own follows. */\nexport function defaultOpenFill(): PathOpenFill {\n return fallback;\n}\n\n/** Whether `path`'s open subpaths fill, each closed by a straight edge back to\n * its start. What painting, area, and the filled-region hit tests all ask. */\nexport function fillsOpenSubpaths(path: PolygonPath): boolean {\n return (path.openFill ?? fallback) === 'close';\n}\n","import { PathBuilder } from './builder';\nimport { cubicPointAt, type Point } from './cubicMath';\nimport type { PolygonPath } from '../path';\n\n/**\n * Schneider (1990, Graphics Gems I) adaptive cubic-Bezier fitter.\n * Given a sequence of sample points, returns a `PolygonPath` whose `C`\n * segments approximate the samples within `errorTolerance` world units.\n *\n * Output shape: an initial `M` to the first sample, followed by N\n * `C` cubic segments. For colinear / two-point inputs, returns a single\n * degenerate cubic. For empty input, returns an empty polygon path.\n */\nexport function schneiderFit(\n samples: ReadonlyArray<Point>,\n errorTolerance: number,\n): PolygonPath {\n if (samples.length === 0) {\n return {\n kind: 'polygon',\n commands: new Uint8Array(),\n coords: new Float32Array(),\n fillRule: 'nonzero',\n };\n }\n\n const b = new PathBuilder();\n b.moveTo(samples[0].x, samples[0].y);\n\n if (samples.length === 1) {\n return b.build();\n }\n\n if (samples.length === 2) {\n emitStraightCubic(b, samples[0], samples[1]);\n return b.build();\n }\n\n fitRecursive(samples, errorTolerance, b);\n return b.build();\n}\n\nfunction fitRecursive(\n samples: ReadonlyArray<Point>,\n errorTolerance: number,\n b: PathBuilder,\n): void {\n if (samples.length === 2) {\n const fit = fitOneCubic(samples);\n b.curveTo(fit.cp1.x, fit.cp1.y, fit.cp2.x, fit.cp2.y, fit.end.x, fit.end.y);\n return;\n }\n const fit = fitOneCubic(samples);\n const { worstIndex, worstError } = measureError(samples, fit);\n if (worstError <= errorTolerance * errorTolerance) {\n b.curveTo(fit.cp1.x, fit.cp1.y, fit.cp2.x, fit.cp2.y, fit.end.x, fit.end.y);\n return;\n }\n // Split. Both halves include the split sample so endpoints meet.\n const left = samples.slice(0, worstIndex + 1);\n const right = samples.slice(worstIndex);\n fitRecursive(left, errorTolerance, b);\n fitRecursive(right, errorTolerance, b);\n}\n\nfunction measureError(\n samples: ReadonlyArray<Point>,\n fit: CubicFit,\n): { worstIndex: number; worstError: number } {\n let worstIndex = 1;\n let worstError = 0;\n const a = samples[0];\n for (let i = 1; i < samples.length - 1; i++) {\n const q = cubicPointAt(a, fit.cp1, fit.cp2, fit.end, fit.ts[i]);\n const dx = samples[i].x - q.x;\n const dy = samples[i].y - q.y;\n const sq = dx * dx + dy * dy;\n if (sq > worstError) {\n worstError = sq;\n worstIndex = i;\n }\n }\n return { worstIndex, worstError };\n}\n\ninterface CubicFit {\n cp1: Point;\n cp2: Point;\n end: Point;\n /** The curve parameter each sample was fitted at: where its error is measured. */\n ts: ReadonlyArray<number>;\n}\n\nfunction fitOneCubic(samples: ReadonlyArray<Point>): CubicFit {\n const n = samples.length;\n return fitWithTangents(\n samples,\n unit(sub(samples[1], samples[0])),\n unit(sub(samples[n - 2], samples[n - 1])),\n 4,\n );\n}\n\n/**\n * The single cubic from the first sample to the last that best fits the\n * samples between, with its control points held to the given unit tangents:\n * `tStart` leaving the first sample, `tEnd` leaving the last one backward.\n * Only the two handle lengths are solved for.\n *\n * `params` is the curve parameter each sample starts at, chord length when\n * omitted; `passes` is how many times those are refined and the lengths\n * solved again.\n */\nexport function fitCubicWithTangents(\n samples: ReadonlyArray<Point>,\n tStart: Point,\n tEnd: Point,\n opts: { params?: ReadonlyArray<number>; passes?: number } = {},\n): { cp1: Point; cp2: Point } {\n const { cp1, cp2 } = fitWithTangents(samples, tStart, tEnd, opts.passes ?? 4, opts.params);\n return { cp1, cp2 };\n}\n\nfunction fitWithTangents(\n samples: ReadonlyArray<Point>,\n tStart: Point,\n tEnd: Point,\n passes: number,\n params?: ReadonlyArray<number>,\n): CubicFit {\n const n = samples.length;\n const a = samples[0];\n const e = samples[n - 1];\n const ts = params ? [...params] : chordLengthParam(samples);\n if (ts === null) return { cp1: { ...a }, cp2: { ...e }, end: e, ts: samples.map(() => 0) };\n\n let fit = solveLS(samples, ts, a, e, tStart, tEnd);\n for (let pass = 0; pass < passes; pass++) {\n reparameterize(samples, ts, a, e, fit);\n fit = solveLS(samples, ts, a, e, tStart, tEnd);\n }\n return fit;\n}\n\nfunction chordLengthParam(samples: ReadonlyArray<Point>): number[] | null {\n const n = samples.length;\n const ts = new Array<number>(n);\n ts[0] = 0;\n let total = 0;\n for (let i = 1; i < n; i++) {\n total += dist(samples[i - 1], samples[i]);\n ts[i] = total;\n }\n if (total === 0) return null;\n for (let i = 0; i < n; i++) ts[i] /= total;\n return ts;\n}\n\nfunction solveLS(\n samples: ReadonlyArray<Point>,\n ts: ReadonlyArray<number>,\n a: Point,\n e: Point,\n tStart: Point,\n tEnd: Point,\n): CubicFit {\n const n = samples.length;\n let c11 = 0, c12 = 0, c22 = 0, x1 = 0, x2 = 0;\n for (let i = 0; i < n; i++) {\n const t = ts[i];\n const u = 1 - t;\n const b0 = u * u * u;\n const b1 = 3 * u * u * t;\n const b2 = 3 * u * t * t;\n const b3 = t * t * t;\n const A1x = b1 * tStart.x;\n const A1y = b1 * tStart.y;\n const A2x = b2 * tEnd.x;\n const A2y = b2 * tEnd.y;\n c11 += A1x * A1x + A1y * A1y;\n c12 += A1x * A2x + A1y * A2y;\n c22 += A2x * A2x + A2y * A2y;\n const targetX = samples[i].x - (b0 + b1) * a.x - (b2 + b3) * e.x;\n const targetY = samples[i].y - (b0 + b1) * a.y - (b2 + b3) * e.y;\n x1 += A1x * targetX + A1y * targetY;\n x2 += A2x * targetX + A2y * targetY;\n }\n const det = c11 * c22 - c12 * c12;\n let alpha1: number;\n let alpha2: number;\n if (Math.abs(det) < 1e-12) {\n const chord = dist(a, e);\n alpha1 = alpha2 = chord / 3;\n } else {\n alpha1 = (c22 * x1 - c12 * x2) / det;\n alpha2 = (c11 * x2 - c12 * x1) / det;\n if (alpha1 < 1e-6 || alpha2 < 1e-6) {\n const chord = dist(a, e);\n alpha1 = alpha2 = chord / 3;\n }\n }\n return {\n cp1: { x: a.x + tStart.x * alpha1, y: a.y + tStart.y * alpha1 },\n cp2: { x: e.x + tEnd.x * alpha2, y: e.y + tEnd.y * alpha2 },\n end: e,\n ts,\n };\n}\n\nfunction reparameterize(\n samples: ReadonlyArray<Point>,\n ts: number[],\n a: Point,\n e: Point,\n fit: CubicFit,\n): void {\n void a; void e;\n for (let i = 1; i < samples.length - 1; i++) {\n ts[i] = newtonRefineT(samples[i], ts[i], samples[0], fit.cp1, fit.cp2, samples[samples.length - 1]);\n }\n}\n\nfunction newtonRefineT(\n p: Point,\n t: number,\n p0: Point,\n p1: Point,\n p2: Point,\n p3: Point,\n): number {\n // Q(t) - p, where Q is the cubic. Newton step uses Q'(t)·(Q(t)-p) and\n // a second-derivative correction.\n const u = 1 - t;\n const { x: qx, y: qy } = cubicPointAt(p0, p1, p2, p3, t);\n const qpx = 3*u*u*(p1.x - p0.x) + 6*u*t*(p2.x - p1.x) + 3*t*t*(p3.x - p2.x);\n const qpy = 3*u*u*(p1.y - p0.y) + 6*u*t*(p2.y - p1.y) + 3*t*t*(p3.y - p2.y);\n const qppx = 6*u*(p2.x - 2*p1.x + p0.x) + 6*t*(p3.x - 2*p2.x + p1.x);\n const qppy = 6*u*(p2.y - 2*p1.y + p0.y) + 6*t*(p3.y - 2*p2.y + p1.y);\n const dx = qx - p.x;\n const dy = qy - p.y;\n const numerator = dx * qpx + dy * qpy;\n const denominator = qpx * qpx + qpy * qpy + dx * qppx + dy * qppy;\n if (Math.abs(denominator) < 1e-12) return t;\n const next = t - numerator / denominator;\n if (next < 0) return 0;\n if (next > 1) return 1;\n return next;\n}\n\nfunction sub(a: Point, b: Point): Point {\n return { x: a.x - b.x, y: a.y - b.y };\n}\nfunction dist(a: Point, b: Point): number {\n return Math.hypot(a.x - b.x, a.y - b.y);\n}\nfunction unit(v: Point): Point {\n const m = Math.hypot(v.x, v.y);\n if (m === 0) return { x: 0, y: 0 };\n return { x: v.x / m, y: v.y / m };\n}\n\nfunction emitStraightCubic(\n b: PathBuilder,\n a: Point,\n c: Point,\n): void {\n // cp1 at 1/3 along chord, cp2 at 2/3 — the canonical straight cubic.\n const cp1x = a.x + (c.x - a.x) / 3;\n const cp1y = a.y + (c.y - a.y) / 3;\n const cp2x = a.x + (2 * (c.x - a.x)) / 3;\n const cp2y = a.y + (2 * (c.y - a.y)) / 3;\n b.curveTo(cp1x, cp1y, cp2x, cp2y, c.x, c.y);\n}\n","/**\n * Corner shapes as the CSS `corner-shape` property defines them: one curve,\n * `superellipse(k)`, whose keywords are points on its parameter. With\n * `n = 2^|k|`, a convex corner (`k > 0`) is the quarter of `|u|^n + |v|^n = 1`\n * spanned from the corner's center (the point across the cut from the outer\n * corner), and a concave one (`k < 0`) is the same curve spanned from the\n * outer corner instead, so `-k` mirrors `k` through the cut. `k = 1` is an\n * ellipse, `0` the straight bevel, and `±∞` the square corner and the notch.\n */\nimport { fitCubicWithTangents } from './schneiderFit';\nimport type { Point } from './cubicMath';\n\n/** The six `corner-shape` keywords, from most convex to most concave. */\nexport type CornerKeyword = 'square' | 'squircle' | 'round' | 'bevel' | 'scoop' | 'notch';\n\n/** A corner's shape: a keyword, or a finite `superellipse()` parameter. */\nexport type CornerShape = CornerKeyword | number;\n\n/** The keywords in the order cycling through them steps. */\nexport const CORNER_KEYWORDS: readonly CornerKeyword[] = ['square', 'squircle', 'round', 'bevel', 'scoop', 'notch'];\n\nconst K_OF: Record<CornerKeyword, number> = {\n square: Infinity, squircle: 2, round: 1, bevel: 0, scoop: -1, notch: -Infinity,\n};\n\n/** The `superellipse()` parameter of `shape`. */\nexport function cornerShapeK(shape: CornerShape): number {\n return typeof shape === 'number' ? shape : K_OF[shape];\n}\n\n/** The keyword whose parameter is exactly `k`, or null. */\nexport function cornerKeywordOf(k: number): CornerKeyword | null {\n return CORNER_KEYWORDS.find((w) => K_OF[w] === k) ?? null;\n}\n\n/** Whether `v` is a keyword or a finite number. */\nexport function isCornerShape(v: unknown): v is CornerShape {\n return (typeof v === 'number' && Number.isFinite(v)) || CORNER_KEYWORDS.includes(v as CornerKeyword);\n}\n\n/** The keyword after `shape` in {@link CORNER_KEYWORDS}, wrapping; from a\n * number, the first keyword less convex than it. */\nexport function nextCornerShape(shape: CornerShape): CornerKeyword {\n if (typeof shape !== 'number') {\n return CORNER_KEYWORDS[(CORNER_KEYWORDS.indexOf(shape) + 1) % CORNER_KEYWORDS.length];\n }\n return CORNER_KEYWORDS.find((w) => K_OF[w] < shape) ?? CORNER_KEYWORDS[0];\n}\n\n/** Largest distance, in units of the corner's setback, the fitted cubics may\n * stray from the true superellipse. */\nexport const CORNER_FIT_TOLERANCE = 1e-3;\n\n/** The cut a corner shape spans: from `start` to `end`, the two points where\n * it leaves the edges, around `outer`, the corner the edges meet at. */\nexport interface CornerShapeFrame {\n start: Point;\n end: Point;\n outer: Point;\n}\n\n/** One piece of a corner's outline, continuing from where the last ended. */\nexport type CornerPiece =\n | { kind: 'line'; to: Point }\n | { kind: 'cubic'; c1: Point; c2: Point; to: Point };\n\n/** Kappa of the cubic quarter circle, the one the kit draws every arc with. */\nconst KAPPA = (4 / 3) * Math.tan(Math.PI / 8);\n\n/** The exponent `2^|k|`, or Infinity once the curve is a right angle within\n * the fit tolerance. */\nfunction exponentOf(k: number): number {\n const n = 2 ** Math.abs(k);\n return 1 - 0.5 ** (1 / n) < CORNER_FIT_TOLERANCE / 4 ? Infinity : n;\n}\n\n/** The point at `theta` on the unit curve `u^n + v^n = 1`: `π/2` is\n * `(0, 1)`, where the corner starts, and `0` is `(1, 0)`, where it ends. */\nfunction unitPoint(n: number, theta: number): Point {\n const p = 2 / n;\n return { x: Math.cos(theta) ** p, y: Math.sin(theta) ** p };\n}\n\n/** The unit direction of travel from start to end at `theta`. */\nfunction unitTangent(n: number, theta: number): Point {\n const q = 2 - 2 / n;\n const x = Math.sin(theta) ** q, y = -(Math.cos(theta) ** q);\n const l = Math.hypot(x, y);\n return { x: x / l, y: y / l };\n}\n\ntype UnitCubic = [Point, Point, Point];\n\nconst sub = (a: Point, b: Point): Point => ({ x: a.x - b.x, y: a.y - b.y });\n\nfunction cubicAt(p0: Point, [c1, c2, p3]: UnitCubic, t: number): Point {\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 { x: a * p0.x + b * c1.x + c * c2.x + d * p3.x, y: a * p0.y + b * c1.y + c * c2.y + d * p3.y };\n}\n\n/** The distance from `q` to the cubic `p0, piece`: the nearest of a coarse\n * scan, refined by bisecting the parameter around it. */\nfunction distanceToCubic(q: Point, p0: Point, piece: UnitCubic): number {\n const d = (t: number) => { const c = cubicAt(p0, piece, t); return Math.hypot(c.x - q.x, c.y - q.y); };\n let best = 0;\n for (let i = 1; i <= 32; i++) if (d(i / 32) < d(best / 32)) best = i;\n let lo = Math.max(0, (best - 1) / 32), hi = Math.min(1, (best + 1) / 32);\n for (let i = 0; i < 30; i++) {\n const a = lo + (hi - lo) / 3, b = hi - (hi - lo) / 3;\n if (d(a) < d(b)) hi = b; else lo = a;\n }\n return d((lo + hi) / 2);\n}\n\n/** The farthest any point of the true curve between `a` and `b` lies from\n * the cubic `p0, piece`. */\nfunction fitError(n: number, a: number, b: number, p0: Point, piece: UnitCubic): number {\n let worst = 0;\n for (let i = 1; i < 16; i++) worst = Math.max(worst, distanceToCubic(unitPoint(n, a + (b - a) * (i / 16)), p0, piece));\n return worst;\n}\n\n/** Cubics through the unit curve from `theta = a` down to `b`, split until\n * each is within `tol`. */\nfunction fitUnit(n: number, a: number, b: number, tol: number, depth: number, out: UnitCubic[]): void {\n const p0 = unitPoint(n, a), p3 = unitPoint(n, b);\n const samples: Point[] = [];\n const params: number[] = [];\n for (let i = 0; i <= 12; i++) {\n samples.push(unitPoint(n, a + (b - a) * (i / 12)));\n params.push(i / 12);\n }\n const tEnd = unitTangent(n, b);\n const { cp1, cp2 } = fitCubicWithTangents(samples, unitTangent(n, a), { x: -tEnd.x, y: -tEnd.y }, { params });\n const piece: UnitCubic = [cp1, cp2, p3];\n if (depth >= 10 || fitError(n, a, b, p0, piece) <= tol) { out.push(piece); return; }\n const mid = (a + b) / 2;\n fitUnit(n, a, mid, tol, depth + 1, out);\n fitUnit(n, mid, b, tol, depth + 1, out);\n}\n\nconst unitCache = new Map<string, UnitCubic[]>();\n\n/** The unit curve of exponent `n` as cubics, `(0, 1)` to `(1, 0)`. */\nfunction unitCubics(n: number, tol: number): UnitCubic[] {\n if (n === 2) return [[{ x: KAPPA, y: 1 }, { x: 1, y: KAPPA }, { x: 1, y: 0 }]];\n const key = `${n}:${tol}`;\n let hit = unitCache.get(key);\n if (!hit) {\n hit = [];\n fitUnit(n, Math.PI / 2, 0, tol, 0, hit);\n if (unitCache.size > 256) unitCache.clear();\n unitCache.set(key, hit);\n }\n return hit;\n}\n\n/** `frame` mapped from the unit square spanned at `center`. */\nfunction mapperFor(frame: CornerShapeFrame, center: Point): (p: Point) => Point {\n const ex = sub(frame.end, center), sy = sub(frame.start, center);\n return (p) => ({ x: center.x + p.x * ex.x + p.y * sy.x, y: center.y + p.x * ex.y + p.y * sy.y });\n}\n\n/** The center the convex curves are spanned from: across the cut from `outer`. */\nexport function cornerCenter(frame: CornerShapeFrame): Point {\n return { x: frame.start.x + frame.end.x - frame.outer.x, y: frame.start.y + frame.end.y - frame.outer.y };\n}\n\n/**\n * The outline of a corner of parameter `k` across `frame`, from its start to\n * its end. Exact at `k = 0` (a line), `±1` (the cubic quarter arc the kit\n * draws circles with) and `±∞` (two lines, through the outer corner or the\n * center); fitted with cubics within `tolerance` of the setback elsewhere.\n */\nexport function cornerShapePieces(k: number, frame: CornerShapeFrame, tolerance = CORNER_FIT_TOLERANCE): CornerPiece[] {\n if (k === 0) return [{ kind: 'line', to: frame.end }];\n const n = exponentOf(k);\n if (n === Infinity) {\n const via = k > 0 ? frame.outer : cornerCenter(frame);\n return [{ kind: 'line', to: via }, { kind: 'line', to: frame.end }];\n }\n const map = mapperFor(frame, k > 0 ? cornerCenter(frame) : frame.outer);\n return unitCubics(n, tolerance).map(([c1, c2, to]) => ({ kind: 'cubic', c1: map(c1), c2: map(c2), to: map(to) }));\n}\n\n/** The point on the true curve of parameter `k` across `frame` at `s`, from\n * 0 at its start to 1 at its end. Finite `k` only. */\nexport function cornerShapePoint(k: number, frame: CornerShapeFrame, s: number): Point {\n const n = 2 ** Math.abs(k);\n const map = mapperFor(frame, k > 0 ? cornerCenter(frame) : frame.outer);\n return map(unitPoint(n, (Math.PI / 2) * (1 - s)));\n}\n","/**\n * A path decoded into contours of anchors and the exact segments between\n * them, for corner expansion: lines stay lines, a quadratic is elevated to\n * the cubic it equals, and a closing curve that ends on its subpath's first\n * point folds onto that anchor the way `enumerateAnchors` counts it.\n */\nimport { forEachSegment, PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport { cubicEvalAt, splitCubicAt } from '../curve';\nimport type { PolygonPath } from '../path';\nimport type { Point } from './cubicMath';\n\n/** One segment as a cubic; a line has its controls on its ends. */\nexport interface Seg {\n line: boolean;\n p0: Point; c1: Point; c2: Point; p3: Point;\n}\n\n/** One subpath. Segment `k` runs from anchor `k` to anchor `k + 1`, wrapping\n * when closed, so a closed contour has as many segments as anchors. */\nexport interface Contour {\n anchors: Point[];\n segs: Seg[];\n closed: boolean;\n /** Flat index of `anchors[0]`. */\n first: number;\n /** For each anchor, the index of the command that drew it among the\n * path's M, L, C, and Q commands: the numbering `countPathAnchors` sizes\n * per-anchor arrays by. */\n sources: number[];\n}\n\nconst lineSeg = (a: Point, b: Point): Seg => ({ line: true, p0: a, c1: a, c2: b, p3: b });\n\n/** `path` as contours, or null when a command opens a subpath with no `M`,\n * where the anchor walkers and this one would count differently. */\nexport function decodeContours(path: PolygonPath): Contour[] | null {\n const { commands, coords } = path;\n const out: Contour[] = [];\n let cur: Contour | null = null;\n let flat = 0;\n let drawn = 0;\n let bad = false;\n const last = (): Point => cur!.anchors[cur!.anchors.length - 1];\n const push = (p: Point, seg: Seg): void => {\n cur!.segs.push(seg);\n cur!.anchors.push(p);\n cur!.sources.push(drawn++);\n flat++;\n };\n forEachSegment(commands, coords, (cmd, ci, _px, _py, _i, opens) => {\n if (opens) { bad = true; return false; }\n const at = (k: number): Point => ({ x: coords[ci + k], y: coords[ci + k + 1] });\n switch (cmd) {\n case PATH_M:\n if (cur) out.push(cur);\n cur = { anchors: [at(0)], segs: [], closed: false, first: flat++, sources: [drawn++] };\n break;\n case PATH_L:\n push(at(0), lineSeg(last(), at(0)));\n break;\n case PATH_C:\n push(at(4), { line: false, p0: last(), c1: at(0), c2: at(2), p3: at(4) });\n break;\n case PATH_Q: {\n const p0 = last(), q = at(0), p3 = at(2);\n const c1 = { x: p0.x + (2 / 3) * (q.x - p0.x), y: p0.y + (2 / 3) * (q.y - p0.y) };\n const c2 = { x: p3.x + (2 / 3) * (q.x - p3.x), y: p3.y + (2 / 3) * (q.y - p3.y) };\n push(p3, { line: false, p0, c1, c2, p3 });\n break;\n }\n case PATH_Z:\n if (cur) closeContour(cur, () => flat--);\n if (cur) out.push(cur);\n cur = null;\n break;\n }\n return undefined;\n });\n if (bad) return null;\n if (cur) out.push(cur);\n return out;\n}\n\nfunction closeContour(c: Contour, unfold: () => void): void {\n c.closed = true;\n const n = c.anchors.length;\n const a0 = c.anchors[0];\n const end = c.anchors[n - 1];\n if (n > 1 && !c.segs[n - 2].line && end.x === a0.x && end.y === a0.y) {\n c.anchors.pop();\n c.sources.pop();\n unfold();\n return;\n }\n c.segs.push(lineSeg(end, a0));\n}\n\nconst LUT_STEPS = 32;\n\n/** Arc length of `seg`. */\nexport function segLength(seg: Seg): number {\n if (seg.line) return Math.hypot(seg.p3.x - seg.p0.x, seg.p3.y - seg.p0.y);\n return lut(seg)[LUT_STEPS];\n}\n\nconst lutCache = new WeakMap<Seg, Float64Array>();\n\nfunction lut(seg: Seg): Float64Array {\n let table = lutCache.get(seg);\n if (table) return table;\n table = new Float64Array(LUT_STEPS + 1);\n let prev = seg.p0;\n for (let i = 1; i <= LUT_STEPS; i++) {\n const p = pointAt(seg, i / LUT_STEPS);\n table[i] = table[i - 1] + Math.hypot(p.x - prev.x, p.y - prev.y);\n prev = p;\n }\n lutCache.set(seg, table);\n return table;\n}\n\n/** Parameter of the point `s` along `seg` from its start. */\nexport function paramAtLength(seg: Seg, s: number): number {\n const total = segLength(seg);\n if (total <= 0) return 0;\n if (seg.line) return Math.min(1, Math.max(0, s / total));\n const table = lut(seg);\n if (s <= 0) return 0;\n if (s >= total) return 1;\n let i = 1;\n while (table[i] < s) i++;\n const span = table[i] - table[i - 1];\n const f = span > 0 ? (s - table[i - 1]) / span : 0;\n return (i - 1 + f) / LUT_STEPS;\n}\n\nexport function pointAt(seg: Seg, t: number): Point {\n if (seg.line) {\n return { x: seg.p0.x + (seg.p3.x - seg.p0.x) * t, y: seg.p0.y + (seg.p3.y - seg.p0.y) * t };\n }\n const { p0, c1, c2, p3 } = seg;\n const [x, y] = cubicEvalAt(p0.x, p0.y, c1.x, c1.y, c2.x, c2.y, p3.x, p3.y, t);\n return { x, y };\n}\n\nfunction unit(x: number, y: number): Point | null {\n const l = Math.hypot(x, y);\n return l > 1e-12 ? { x: x / l, y: y / l } : null;\n}\n\n/** Unit direction of travel along `seg` at `t`, or null for a segment of no length. */\nexport function tangentAt(seg: Seg, t: number): Point | null {\n const { p0, c1, c2, p3 } = seg;\n if (seg.line) return unit(p3.x - p0.x, p3.y - p0.y);\n const u = 1 - t;\n const dx = 3 * (u * u * (c1.x - p0.x) + 2 * u * t * (c2.x - c1.x) + t * t * (p3.x - c2.x));\n const dy = 3 * (u * u * (c1.y - p0.y) + 2 * u * t * (c2.y - c1.y) + t * t * (p3.y - c2.y));\n const d = unit(dx, dy);\n if (d) return d;\n // A control on its end point: the tangent there runs to the next point.\n if (t < 0.5) return unit(c2.x - p0.x, c2.y - p0.y) ?? unit(p3.x - p0.x, p3.y - p0.y);\n return unit(p3.x - c1.x, p3.y - c1.y) ?? unit(p3.x - p0.x, p3.y - p0.y);\n}\n\n/** The piece of cubic `seg` between parameters `t0 < t1`, as `[c1, c2, p3]`. */\nexport function subCubic(seg: Seg, t0: number, t1: number): [Point, Point, Point] {\n const { p0, c1, c2, p3 } = seg;\n let c = [p0.x, p0.y, c1.x, c1.y, c2.x, c2.y, p3.x, p3.y];\n if (t0 > 0) c = [...splitCubicAt(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], t0)[1]];\n const t = t0 < 1 ? (t1 - t0) / (1 - t0) : 1;\n if (t < 1) c = [...splitCubicAt(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], t)[0]];\n return [{ x: c[2], y: c[3] }, { x: c[4], y: c[5] }, { x: c[6], y: c[7] }];\n}\n","/**\n * Corner expansion: a path's corner specs turned into the plain geometry\n * that every reader draws, hits, bounds, and exports.\n */\nimport type { Path, PolygonPath } from '../path';\nimport { PathBuilder } from './builder';\nimport { cornerAt, hasCorners, withoutCorners, type CornerSpec } from './cornerSpec';\nimport { cornerShapeK, cornerShapePieces, type CornerPiece, type CornerShapeFrame } from './cornerShape';\nimport {\n decodeContours, paramAtLength, pointAt, segLength, subCubic, tangentAt,\n type Contour,\n} from './cornerSegments';\nimport type { Point } from './cubicMath';\n\n/** Below this turn (radians) an anchor is smooth, and no corner can be cut. */\nconst MIN_TURN = 1e-3;\n\n/** Where and how a corner anchor can be cut. */\nexport interface CornerFrame {\n /** Flat anchor index. */\n index: number;\n /** The anchor. */\n x: number;\n y: number;\n /** Unit direction from the anchor into the wedge the cut is taken from. */\n bisector: Point;\n /** Half the angle between the two edges at the anchor. */\n halfAngle: number;\n /** How far along each edge the stored spec cuts, its setback, after clamping. */\n trim: number;\n /** The longest cut the edges allow while the neighbors keep theirs. */\n maxTrim: number;\n}\n\ninterface AnchorCut {\n frame: Omit<CornerFrame, 'trim' | 'maxTrim'>;\n spec: CornerSpec | null;\n want: number;\n trim: number;\n}\n\n/** The cut each anchor of `c` takes, clamped so that the two cuts on any\n * segment never meet past each other. Null for an anchor that cannot be cut. */\nfunction contourCuts(path: PolygonPath, c: Contour): (AnchorCut | null)[] {\n const n = c.anchors.length;\n const lengths = c.segs.map(segLength);\n const cuts: (AnchorCut | null)[] = c.anchors.map((a, i) => {\n const inSeg = i > 0 ? c.segs[i - 1] : c.closed ? c.segs[n - 1] : null;\n const outSeg = i < c.segs.length ? c.segs[i] : null;\n if (!inSeg || !outSeg || inSeg === outSeg) return null;\n const tIn = tangentAt(inSeg, 1);\n const tOut = tangentAt(outSeg, 0);\n if (!tIn || !tOut) return null;\n const turn = Math.acos(Math.max(-1, Math.min(1, tIn.x * tOut.x + tIn.y * tOut.y)));\n if (turn < MIN_TURN || turn > Math.PI - MIN_TURN) return null;\n const bx = tOut.x - tIn.x, by = tOut.y - tIn.y;\n const bl = Math.hypot(bx, by);\n const halfAngle = (Math.PI - turn) / 2;\n const spec = cornerAt(path, c.first + i);\n const want = spec ? spec.radius : 0;\n return {\n frame: { index: c.first + i, x: a.x, y: a.y, bisector: { x: bx / bl, y: by / bl }, halfAngle },\n spec,\n want,\n trim: want,\n };\n });\n const scale = cuts.map(() => 1);\n c.segs.forEach((_seg, k) => {\n const a = k, b = (k + 1) % n;\n const sum = (cuts[a]?.want ?? 0) + (cuts[b]?.want ?? 0);\n if (sum <= lengths[k]) return;\n const f = lengths[k] / sum;\n scale[a] = Math.min(scale[a], f);\n scale[b] = Math.min(scale[b], f);\n });\n cuts.forEach((cut, i) => { if (cut) cut.trim = cut.want * scale[i]; });\n return cuts;\n}\n\n/** Every anchor of `path` that can take a corner, with the cut its spec\n * makes now. */\nexport function cornerFrames(path: PolygonPath): CornerFrame[] {\n const contours = decodeContours(path);\n if (!contours) return [];\n const out: CornerFrame[] = [];\n for (const c of contours) {\n const cuts = contourCuts(path, c);\n const n = c.anchors.length;\n cuts.forEach((cut, i) => {\n if (!cut) return;\n const prev = (i - 1 + n) % n;\n const next = (i + 1) % n;\n const inLen = segLength(c.segs[prev]);\n const outLen = segLength(c.segs[i]);\n const room = (len: number, j: number): number => len - Math.min(len, cuts[j]?.want ?? 0);\n out.push({\n ...cut.frame,\n trim: cut.trim,\n maxTrim: Math.max(0, Math.min(room(inLen, prev), room(outLen, next))),\n });\n });\n }\n return out;\n}\n\n/** The frame of the corner at flat anchor `index`, or null when that anchor\n * cannot take one. */\nexport function cornerFrameAt(path: PolygonPath, index: number): CornerFrame | null {\n return cornerFrames(path).find((f) => f.index === index) ?? null;\n}\n\n/** A path with its corners expanded, and where its anchors came from. */\nexport interface ResolvedCorners {\n path: PolygonPath;\n /**\n * For each anchor of `path` (each M, L, C, or Q, as `countPathAnchors`\n * counts them), the anchor of the source path it belongs to, in the same\n * numbering. Every point a corner's cut adds belongs to that corner's\n * anchor. Null when the expansion added none.\n */\n anchorSources: Uint32Array | null;\n}\n\nconst expanded = new WeakMap<PolygonPath, ResolvedCorners>();\n\n/** {@link resolveCorners}, also answering which source anchor each anchor of\n * the result came from, so an array kept per anchor (`vertexColors`) can be\n * carried onto it with {@link remapPerAnchor}. */\nexport function resolveCornersWithSources(path: PolygonPath): ResolvedCorners {\n if (path.corners === undefined) return { path, anchorSources: null };\n const hit = expanded.get(path);\n if (hit) return hit;\n const out = hasCorners(path) ? expand(path) : { path: withoutCorners(path), anchorSources: null };\n expanded.set(path, out);\n return out;\n}\n\n/**\n * `path` with its corner specs expanded into plain geometry and dropped: each\n * corner is cut `radius` along both edges and spans the cut with its shape's\n * superellipse (`cornerShapePieces`). Each cut is clamped so the cuts on\n * either end of a segment never overlap. A path with no corners comes back\n * as itself, and so does a rect.\n */\nexport function resolveCorners<P extends Path>(path: P): P;\nexport function resolveCorners(path: Path): Path {\n if (path.kind !== 'polygon') return path;\n return resolveCornersWithSources(path).path;\n}\n\n/** `values`, `stride` numbers per source anchor, as `stride` per anchor of\n * the expanded path that `sources` describes. */\nexport function remapPerAnchor<T>(values: readonly T[], sources: Uint32Array, stride: number): T[] {\n const out = new Array<T>(sources.length * stride);\n for (let i = 0; i < sources.length; i++) {\n for (let k = 0; k < stride; k++) out[i * stride + k] = values[sources[i] * stride + k];\n }\n return out;\n}\n\n/** A `PathBuilder` that records, for each anchor it writes, the source anchor `src`. */\nclass Emitter {\n readonly b = new PathBuilder();\n readonly sources: number[] = [];\n src = 0;\n moveTo(x: number, y: number): void { this.b.moveTo(x, y); this.sources.push(this.src); }\n lineTo(x: number, y: number): void { this.b.lineTo(x, y); this.sources.push(this.src); }\n curveTo(a: number, b: number, c: number, d: number, x: number, y: number): void {\n this.b.curveTo(a, b, c, d, x, y);\n this.sources.push(this.src);\n }\n close(): void { this.b.close(); }\n}\n\nfunction expand(path: PolygonPath): ResolvedCorners {\n const contours = decodeContours(path);\n if (!contours) return { path: withoutCorners(path), anchorSources: null };\n const e = new Emitter();\n for (const c of contours) emitContour(e, c, contourCuts(path, c));\n const { commands, coords } = e.b.build();\n return {\n path: { ...withoutCorners(path), commands, coords },\n anchorSources: Uint32Array.from(e.sources),\n };\n}\n\n/** Parameter on segment `k` where the cut at its start ends, and where the\n * cut at its end begins. */\nfunction segSpan(c: Contour, cuts: readonly (AnchorCut | null)[], k: number): [number, number] {\n const seg = c.segs[k];\n const len = segLength(seg);\n const t0 = paramAtLength(seg, cuts[k]?.trim ?? 0);\n const t1 = paramAtLength(seg, len - (cuts[(k + 1) % c.anchors.length]?.trim ?? 0));\n return [t0, Math.max(t0, t1)];\n}\n\n/** The corner cut at the anchor segment `k` runs into, as the expansion\n * draws it, or null when that anchor takes none. */\nfunction cutAfter(\n c: Contour, cuts: readonly (AnchorCut | null)[], spans: readonly [number, number][], k: number,\n): { cut: AnchorCut; start: Point; end: Point; pieces: CornerPiece[] } | null {\n const j = (k + 1) % c.anchors.length;\n const cut = cuts[j];\n const next = c.segs[j];\n if (!cut?.spec || cut.trim <= 0 || !next) return null;\n const seg = c.segs[k];\n const start = pointAt(seg, spans[k][1]);\n const end = pointAt(next, spans[j][0]);\n const frame = shapeFrame({ x: cut.frame.x, y: cut.frame.y }, start, tangentAt(seg, spans[k][1]), end, tangentAt(next, spans[j][0]));\n return { cut, start, end, pieces: cornerShapePieces(cornerShapeK(cut.spec.shape), frame) };\n}\n\n/** One corner of a path as its expansion draws it. */\nexport interface CornerCut {\n /** Flat anchor index. */\n index: number;\n anchor: Point;\n spec: CornerSpec;\n /** Where the cut leaves the edge into the anchor, and where it rejoins the edge out of it. */\n start: Point;\n end: Point;\n /** The outline from `start` to `end`. */\n pieces: CornerPiece[];\n}\n\n/** Every corner `path` cuts, in path order. */\nexport function cornerCuts(path: PolygonPath): CornerCut[] {\n if (!hasCorners(path)) return [];\n const out: CornerCut[] = [];\n for (const c of decodeContours(path) ?? []) {\n const cuts = contourCuts(path, c);\n const spans = c.segs.map((_s, k) => segSpan(c, cuts, k));\n c.segs.forEach((_seg, k) => {\n const at = cutAfter(c, cuts, spans, k);\n if (!at) return;\n const { frame } = at.cut;\n out.push({ index: frame.index, anchor: { x: frame.x, y: frame.y }, spec: at.cut.spec!, start: at.start, end: at.end, pieces: at.pieces });\n });\n }\n return out;\n}\n\nfunction emitContour(b: Emitter, c: Contour, cuts: readonly (AnchorCut | null)[]): void {\n const n = c.anchors.length;\n const spans = c.segs.map((_s, k) => segSpan(c, cuts, k));\n const start = c.closed && c.segs.length > 0 ? pointAt(c.segs[0], spans[0][0]) : c.anchors[0];\n b.src = c.sources[0];\n b.moveTo(start.x, start.y);\n c.segs.forEach((seg, k) => {\n const [t0, t1] = spans[k];\n // Both the run up to the next anchor and the cut at it belong to that anchor.\n b.src = c.sources[(k + 1) % n];\n const closing = c.closed && k === n - 1 && !(cuts[0]?.spec && cuts[0].trim > 0);\n if (t1 > t0 && !(closing && seg.line)) {\n if (seg.line) {\n const p = pointAt(seg, t1);\n b.lineTo(p.x, p.y);\n } else {\n const [c1, c2, p3] = subCubic(seg, t0, t1);\n b.curveTo(c1.x, c1.y, c2.x, c2.y, p3.x, p3.y);\n }\n }\n const at = cutAfter(c, cuts, spans, k);\n if (!at) return;\n const pieces = [...at.pieces];\n // A closing line that ends where the contour started is drawn by the close.\n if ((k + 1) % n === 0 && pieces.at(-1)?.kind === 'line') pieces.pop();\n for (const piece of pieces) {\n if (piece.kind === 'line') b.lineTo(piece.to.x, piece.to.y);\n else b.curveTo(piece.c1.x, piece.c1.y, piece.c2.x, piece.c2.y, piece.to.x, piece.to.y);\n }\n });\n if (c.closed) b.close();\n}\n\n/** The frame a corner's shape spans: from `p1` to `p2`, around where the two\n * edges' tangents there meet. That is the anchor itself between straight\n * edges; between curves it keeps every convex shape tangent to both. */\nfunction shapeFrame(v: Point, p1: Point, t1: Point | null, p2: Point, t2: Point | null): CornerShapeFrame {\n const outer = t1 && t2 ? tangentMeet(p1, t1, p2, t2) : null;\n const chord = Math.hypot(p2.x - p1.x, p2.y - p1.y);\n const far = !outer || Math.hypot(outer.x - v.x, outer.y - v.y) > 4 * chord;\n return { start: p1, end: p2, outer: far ? v : outer };\n}\n\n/** Where the line through `a` along `ta` meets the one through `b` along\n * `tb`, or null when they are parallel. */\nfunction tangentMeet(a: Point, ta: Point, b: Point, tb: Point): Point | null {\n const den = ta.x * tb.y - ta.y * tb.x;\n if (Math.abs(den) < 1e-9) return null;\n const s = ((b.x - a.x) * tb.y - (b.y - a.y) * tb.x) / den;\n return { x: a.x + ta.x * s, y: a.y + ta.y * s };\n}\n"]}