@weasel-js/geom 1.12.0 → 1.13.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"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@weasel-js/geom",
3
- "version": "1.12.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.",
3
+ "version": "1.13.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,