@weasel-js/geom 1.13.0 → 1.14.1
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.
- package/README.md +6 -2
- package/dist/3d/index.d.ts +8 -1
- package/dist/3d/index.js +25 -1
- package/dist/3d/index.js.map +1 -1
- package/dist/booleans/index.d.ts +6 -5
- package/dist/booleans/index.js +583 -73
- package/dist/booleans/index.js.map +1 -1
- package/dist/{chunk-CE7IY7TB.js → chunk-2N6OWA7E.js} +3 -3
- package/dist/{chunk-CE7IY7TB.js.map → chunk-2N6OWA7E.js.map} +1 -1
- package/dist/{chunk-Q66NA2FU.js → chunk-3HQJGI63.js} +8 -5
- package/dist/chunk-3HQJGI63.js.map +1 -0
- package/dist/{chunk-YPWFGFQX.js → chunk-3YH5XU3H.js} +125 -8
- package/dist/chunk-3YH5XU3H.js.map +1 -0
- package/dist/{chunk-UI3FUWXM.js → chunk-42TZDN5C.js} +4 -4
- package/dist/{chunk-UI3FUWXM.js.map → chunk-42TZDN5C.js.map} +1 -1
- package/dist/{chunk-B53BERKG.js → chunk-B3D6KWW3.js} +110 -8
- package/dist/chunk-B3D6KWW3.js.map +1 -0
- package/dist/{chunk-2PKPKU4P.js → chunk-EURWZUNY.js} +25 -22
- package/dist/chunk-EURWZUNY.js.map +1 -0
- package/dist/{chunk-VHXOCDZ2.js → chunk-FROQPADA.js} +6 -6
- package/dist/{chunk-VHXOCDZ2.js.map → chunk-FROQPADA.js.map} +1 -1
- package/dist/{chunk-UGE57OTX.js → chunk-GWSJQSQE.js} +11 -8
- package/dist/chunk-GWSJQSQE.js.map +1 -0
- package/dist/chunk-XXNK4N7Z.js +683 -0
- package/dist/chunk-XXNK4N7Z.js.map +1 -0
- package/dist/chunk-ZOMUTU7J.js +249 -0
- package/dist/chunk-ZOMUTU7J.js.map +1 -0
- package/dist/{curvature-PkoLduGc.d.ts → curvature-CDOI32hv.d.ts} +46 -3
- package/dist/curves/index.d.ts +2 -2
- package/dist/curves/index.js +4 -4
- package/dist/index.d.ts +172 -45
- package/dist/index.js +244 -178
- package/dist/index.js.map +1 -1
- package/dist/nd/index.d.ts +28 -1
- package/dist/nd/index.js +27 -675
- package/dist/nd/index.js.map +1 -1
- package/dist/{path-BW8d_2RY.d.ts → path-t80OoJnM.d.ts} +11 -0
- package/dist/tessellate/index.d.ts +11 -4
- package/dist/tessellate/index.js +4 -4
- package/dist/warp/index.d.ts +1 -1
- package/dist/warp/index.js +238 -64
- package/dist/warp/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-2PKPKU4P.js.map +0 -1
- package/dist/chunk-B53BERKG.js.map +0 -1
- package/dist/chunk-Q66NA2FU.js.map +0 -1
- package/dist/chunk-STGSBIOL.js +0 -152
- package/dist/chunk-STGSBIOL.js.map +0 -1
- package/dist/chunk-UGE57OTX.js.map +0 -1
- package/dist/chunk-YPWFGFQX.js.map +0 -1
package/dist/warp/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/warp/quad.ts","../../src/warp/mesh.ts","../../src/warp/profileCholesky.ts","../../src/warp/arapSystem.ts","../../src/warp/injective.ts","../../src/warp/arapPiece.ts","../../src/warp/arap.ts","../../src/warp/cloughTocher.ts","../../src/warp/meshMap.ts","../../src/warp/refine.ts","../../src/warp/puppetMesh.ts","../../src/warp/puppet.ts","../../src/warp/warpPath.ts","../../src/warp/pathWarp.ts"],"names":["restFrames","x","y","a","b"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Maps from the unit square onto a quadrilateral: what a box becomes when its\n * four corners are dragged apart independently.\n */\nimport type { Point } from '../paths/cubicMath';\n\n/** Four corners, in the order the unit square's land on them: (0,0), (1,0),\n * (1,1), (0,1) — a box's top-left, top-right, bottom-right, bottom-left. */\nexport type Quad = readonly [Point, Point, Point, Point];\n\n/** A map from unit-square coordinates to the plane. */\nexport type UvMap = (u: number, v: number) => Point;\n\n/**\n * The bilinear map onto `q`: each corner weighted by its share of the square.\n * Lines of constant `u` or `v` stay straight; any other line bends.\n */\nexport function bilinearQuad(q: Quad): UvMap {\n const [a, b, c, d] = q;\n return (u, v) => {\n const w00 = (1 - u) * (1 - v);\n const w10 = u * (1 - v);\n const w11 = u * v;\n const w01 = (1 - u) * v;\n return {\n x: w00 * a.x + w10 * b.x + w11 * c.x + w01 * d.x,\n y: w00 * a.y + w10 * b.y + w11 * c.y + w01 * d.y,\n };\n };\n}\n\n/**\n * The projective map taking the unit square onto `q`, as `[a, b, c, d, e, f,\n * g, h]`: `x = (a·u + b·v + c) / w` and `y = (d·u + e·v + f) / w`, where\n * `w = g·u + h·v + 1`. Null when `q` is not strictly convex, since no\n * projective map then sends the square's inside onto the quad's.\n */\nexport function squareToQuadHomography(q: Quad): readonly number[] | null {\n if (!isConvex(q)) return null;\n const [p0, p1, p2, p3] = q;\n const sx = p0.x - p1.x + p2.x - p3.x;\n const sy = p0.y - p1.y + p2.y - p3.y;\n const dx1 = p1.x - p2.x;\n const dx2 = p3.x - p2.x;\n const dy1 = p1.y - p2.y;\n const dy2 = p3.y - p2.y;\n const den = dx1 * dy2 - dx2 * dy1;\n if (den === 0) return null;\n const g = (sx * dy2 - dx2 * sy) / den;\n const h = (dx1 * sy - sx * dy1) / den;\n return [\n p1.x - p0.x + g * p1.x, p3.x - p0.x + h * p3.x, p0.x,\n p1.y - p0.y + g * p1.y, p3.y - p0.y + h * p3.y, p0.y,\n g, h,\n ];\n}\n\n/**\n * The projective map onto `q`: straight lines stay straight, and the box's far\n * side foreshortens the way a plane seen at an angle does. Null where\n * {@link squareToQuadHomography} is.\n */\nexport function projectiveQuad(q: Quad): UvMap | null {\n const m = squareToQuadHomography(q);\n if (!m) return null;\n const [a, b, c, d, e, f, g, h] = m;\n return (u, v) => {\n const w = g * u + h * v + 1;\n return { x: (a * u + b * v + c) / w, y: (d * u + e * v + f) / w };\n };\n}\n\n/** Whether every turn around `q` goes the same way, none of them straight. */\nfunction isConvex(q: Quad): boolean {\n let sign = 0;\n for (let i = 0; i < 4; i++) {\n const a = q[i];\n const b = q[(i + 1) % 4];\n const c = q[(i + 2) % 4];\n const cross = (b.x - a.x) * (c.y - b.y) - (b.y - a.y) * (c.x - b.x);\n if (cross === 0) return false;\n if (sign === 0) sign = Math.sign(cross);\n else if (Math.sign(cross) !== sign) return false;\n }\n return true;\n}\n","/**\n * Maps from the unit square through a grid of control points: an envelope\n * mesh. The grid's points are interpolated, so a grid laid evenly over a box\n * maps the box onto itself.\n */\nimport type { Point } from '../paths/cubicMath';\nimport type { UvMap } from './quad';\n\n/** A grid of `rows` × `cols` patches: `(rows + 1) × (cols + 1)` points, row by\n * row from the top. */\nexport interface MeshGrid {\n rows: number;\n cols: number;\n points: readonly Point[];\n}\n\n/** An even grid of `rows` × `cols` patches over the box. */\nexport function meshGridOver(\n box: { x: number; y: number; width: number; height: number },\n rows: number,\n cols: number,\n): MeshGrid {\n return meshGridFrom((u, v) => ({ x: box.x + u * box.width, y: box.y + v * box.height }), rows, cols);\n}\n\n/** A grid of `rows` × `cols` patches whose points are where `map` sends an\n * even grid over the unit square — a mesh resampled at a new resolution. */\nexport function meshGridFrom(map: UvMap, rows: number, cols: number): MeshGrid {\n const r = Math.max(1, Math.round(rows));\n const c = Math.max(1, Math.round(cols));\n const points: Point[] = [];\n for (let i = 0; i <= r; i++) {\n for (let j = 0; j <= c; j++) points.push(map(j / c, i / r));\n }\n return { rows: r, cols: c, points };\n}\n\n/** The grid point at row `i`, column `j`, extended past the edges along the\n * line through the last two, so the spline through the edge runs straight. */\nfunction gridPoint(grid: MeshGrid, i: number, j: number): Point {\n if (i < 0) return extend(gridPoint(grid, 0, j), gridPoint(grid, 1, j));\n if (i > grid.rows) return extend(gridPoint(grid, grid.rows, j), gridPoint(grid, grid.rows - 1, j));\n if (j < 0) return extend(gridPoint(grid, i, 0), gridPoint(grid, i, 1));\n if (j > grid.cols) return extend(gridPoint(grid, i, grid.cols), gridPoint(grid, i, grid.cols - 1));\n return grid.points[i * (grid.cols + 1) + j];\n}\n\nconst extend = (edge: Point, inner: Point): Point => ({ x: 2 * edge.x - inner.x, y: 2 * edge.y - inner.y });\n\n/** The uniform Catmull-Rom spline through four values, between the middle two. */\nfunction catmullRom(p0: number, p1: number, p2: number, p3: number, t: number): number {\n const t2 = t * t;\n return 0.5 * (2 * p1 + (p2 - p0) * t + (2 * p0 - 5 * p1 + 4 * p2 - p3) * t2 + (3 * p1 - p0 - 3 * p2 + p3) * t2 * t);\n}\n\nfunction catmullRomPoint(p: readonly Point[], t: number): Point {\n return {\n x: catmullRom(p[0].x, p[1].x, p[2].x, p[3].x, t),\n y: catmullRom(p[0].y, p[1].y, p[2].y, p[3].y, t),\n };\n}\n\n/** Which patch `u` (or `v`) falls in out of `n`, and where in it. */\nfunction cellOf(s: number, n: number): [number, number] {\n const k = Math.min(n - 1, Math.max(0, Math.floor(s * n)));\n return [k, s * n - k];\n}\n\n/**\n * The smooth surface through every grid point: a Catmull-Rom spline along each\n * row, and another down the columns through those. Bending one point bends its\n * neighborhood smoothly, across patch edges included.\n */\nexport function bicubicMesh(grid: MeshGrid): UvMap {\n return (u, v) => {\n const [j, s] = cellOf(u, grid.cols);\n const [i, t] = cellOf(v, grid.rows);\n const across: Point[] = [];\n for (let di = -1; di <= 2; di++) {\n across.push(catmullRomPoint([-1, 0, 1, 2].map((dj) => gridPoint(grid, i + di, j + dj)), s));\n }\n return catmullRomPoint(across, t);\n };\n}\n\n/**\n * One Coons patch per grid cell: the cell's four edges are the splines through\n * the grid lines, and its inside is blended from those edges alone. Edges\n * match the bicubic surface; the inside follows them more literally, without\n * the bicubic surface's pull from points beyond the cell.\n */\nexport function coonsMesh(grid: MeshGrid): UvMap {\n const row = (i: number, j: number, s: number) =>\n catmullRomPoint([-1, 0, 1, 2].map((dj) => gridPoint(grid, i, j + dj)), s);\n const col = (i: number, j: number, t: number) =>\n catmullRomPoint([-1, 0, 1, 2].map((di) => gridPoint(grid, i + di, j)), t);\n return (u, v) => {\n const [j, s] = cellOf(u, grid.cols);\n const [i, t] = cellOf(v, grid.rows);\n const top = row(i, j, s);\n const bottom = row(i + 1, j, s);\n const left = col(i, j, t);\n const right = col(i, j + 1, t);\n const p00 = gridPoint(grid, i, j);\n const p10 = gridPoint(grid, i, j + 1);\n const p01 = gridPoint(grid, i + 1, j);\n const p11 = gridPoint(grid, i + 1, j + 1);\n const blend = (k: 'x' | 'y') =>\n (1 - t) * top[k] + t * bottom[k] + (1 - s) * left[k] + s * right[k]\n - ((1 - s) * (1 - t) * p00[k] + s * (1 - t) * p10[k] + (1 - s) * t * p01[k] + s * t * p11[k]);\n return { x: blend('x'), y: blend('y') };\n };\n}\n","/**\n * Sparse symmetric positive-definite solves for mesh systems: the unknowns\n * reordered by reverse Cuthill–McKee so each row's nonzeros sit close to the\n * diagonal, then a Cholesky factor stored by profile (each row from its first\n * nonzero to the diagonal). Factoring costs the sum of the squared row widths\n * and a solve the profile's size, which for a mesh of n vertices is about\n * n·√n — small enough to factor once and re-solve every frame.\n */\n\n/** A symmetric matrix under assembly: `rows[i]` maps a column `j <= i` to its entry. */\nexport type SymmetricRows = Map<number, number>[];\n\n/** `n` empty rows. */\nexport function symmetricRows(n: number): SymmetricRows {\n return Array.from({ length: n }, () => new Map<number, number>());\n}\n\n/** Add `v` at `(i, j)` and, implicitly, `(j, i)`. */\nexport function addSymmetric(rows: SymmetricRows, i: number, j: number, v: number): void {\n const [r, c] = i >= j ? [i, j] : [j, i];\n const row = rows[r];\n row.set(c, (row.get(c) ?? 0) + v);\n}\n\n/** A factored matrix. `solve` returns `x` with `A x = b`. */\nexport interface Factored {\n solve(b: ArrayLike<number>): Float64Array;\n}\n\n/** Reverse Cuthill–McKee over the matrix's graph: `order[k]` is the old index placed at `k`. */\nfunction reverseCuthillMcKee(rows: SymmetricRows): Int32Array {\n const n = rows.length;\n const adj: number[][] = Array.from({ length: n }, () => []);\n rows.forEach((row, i) => row.forEach((_, j) => {\n if (j !== i) { adj[i].push(j); adj[j].push(i); }\n }));\n const degree = adj.map((a) => a.length);\n const seen = new Uint8Array(n);\n const order: number[] = [];\n const byDegree = [...Array(n).keys()].sort((a, b) => degree[a] - degree[b]);\n for (const root of byDegree) {\n if (seen[root]) continue;\n seen[root] = 1;\n const queue = [root];\n for (let head = 0; head < queue.length; head++) {\n const v = queue[head];\n order.push(v);\n const next = adj[v].filter((w) => !seen[w]).sort((a, b) => degree[a] - degree[b]);\n for (const w of next) { seen[w] = 1; queue.push(w); }\n }\n }\n return Int32Array.from(order.reverse());\n}\n\n/**\n * Factor the symmetric positive-definite matrix `rows`. Null when it is not\n * positive definite — a system with too few constraints to fix its solution.\n */\nexport function factorSymmetric(rows: SymmetricRows): Factored | null {\n const n = rows.length;\n const order = reverseCuthillMcKee(rows);\n const at = new Int32Array(n);\n order.forEach((old, k) => { at[old] = k; });\n // Profile: row k holds columns first[k]..k, at offset start[k].\n const first = Int32Array.from({ length: n }, (_, k) => k);\n rows.forEach((row, i) => row.forEach((_, j) => {\n const a = at[i], b = at[j];\n const r = Math.max(a, b), c = Math.min(a, b);\n if (c < first[r]) first[r] = c;\n }));\n const start = new Int32Array(n + 1);\n for (let k = 0; k < n; k++) start[k + 1] = start[k] + (k - first[k] + 1);\n const L = new Float64Array(start[n]);\n rows.forEach((row, i) => row.forEach((v, j) => {\n const a = at[i], b = at[j];\n const r = Math.max(a, b), c = Math.min(a, b);\n L[start[r] + c - first[r]] += v;\n }));\n for (let i = 0; i < n; i++) {\n const fi = first[i], si = start[i];\n for (let j = fi; j <= i; j++) {\n const fj = first[j], sj = start[j];\n let sum = L[si + j - fi];\n for (let k = Math.max(fi, fj); k < j; k++) sum -= L[si + k - fi] * L[sj + k - fj];\n if (j === i) {\n if (!(sum > 0)) return null;\n L[si + i - fi] = Math.sqrt(sum);\n } else {\n L[si + j - fi] = sum / L[sj + j - fj];\n }\n }\n }\n return {\n solve(b) {\n const y = new Float64Array(n);\n for (let k = 0; k < n; k++) y[k] = b[order[k]];\n for (let i = 0; i < n; i++) {\n const fi = first[i], si = start[i];\n let sum = y[i];\n for (let k = fi; k < i; k++) sum -= L[si + k - fi] * y[k];\n y[i] = sum / L[si + i - fi];\n }\n for (let i = n - 1; i >= 0; i--) {\n const fi = first[i], si = start[i];\n y[i] /= L[si + i - fi];\n const yi = y[i];\n for (let k = fi; k < i; k++) y[k] -= L[si + k - fi] * yi;\n }\n const x = new Float64Array(n);\n for (let k = 0; k < n; k++) x[order[k]] = y[k];\n return x;\n },\n };\n}\n","/**\n * The two linear systems an as-rigid-as-possible solve uses, assembled over\n * one piece of a mesh and split into free and pinned unknowns so that each is\n * factored once per pin set.\n */\nimport { addSymmetric, factorSymmetric, symmetricRows, type Factored, type SymmetricRows } from './profileCholesky';\n\n/** A linear system split into its free and pinned unknowns. */\nexport interface Split {\n factored: Factored;\n /** For each free unknown, the pinned unknowns it couples to and by how much. */\n coupling: { at: Int32Array; by: Float64Array }[];\n}\n\n/** `full` split by `freeIndex`, an unknown's index among the free ones or -1 when pinned; null when singular. */\nexport function split(full: SymmetricRows, freeIndex: Int32Array): Split | null {\n const nFree = freeIndex.reduce((n, f) => (f >= 0 ? n + 1 : n), 0);\n const rows = symmetricRows(nFree);\n const coupling: { at: number[]; by: number[] }[] = Array.from({ length: nFree }, () => ({ at: [], by: [] }));\n full.forEach((row, i) => row.forEach((v, j) => {\n const fi = freeIndex[i] >= 0, fj = freeIndex[j] >= 0;\n if (fi && fj) addSymmetric(rows, freeIndex[i], freeIndex[j], v);\n else if (fi) { coupling[freeIndex[i]].at.push(j); coupling[freeIndex[i]].by.push(v); }\n else if (fj) { coupling[freeIndex[j]].at.push(i); coupling[freeIndex[j]].by.push(v); }\n }));\n const factored = factorSymmetric(rows);\n if (!factored) return null;\n return { factored, coupling: coupling.map((c) => ({ at: Int32Array.from(c.at), by: Float64Array.from(c.by) })) };\n}\n\n/** The free unknowns of `s` given the right side `b` (consumed) and each pinned unknown's value. */\nexport function solveSplit(s: Split, fixedValue: (u: number) => number, b: Float64Array): Float64Array {\n for (let f = 0; f < s.coupling.length; f++) {\n const { at, by } = s.coupling[f];\n for (let k = 0; k < at.length; k++) b[f] -= by[k] * fixedValue(at[k]);\n }\n return s.factored.solve(b);\n}\n\n/**\n * The similarity step's energy over `n` local vertices at `rest`, triangles\n * `tris` as local triples: each triangle vertex kept where its opposite edge,\n * turned and scaled, puts it. Unknowns are interleaved `x, y`.\n */\nexport function similarityEnergy(rest: Float64Array, tris: Int32Array, n: number): SymmetricRows {\n const rows = symmetricRows(2 * n);\n const coef = new Float64Array(6);\n const idx = new Int32Array(6);\n for (let t = 0; t < tris.length; t += 3) {\n for (let e = 0; e < 3; e++) {\n const a = tris[t + e], b = tris[t + (e + 1) % 3], c = tris[t + (e + 2) % 3];\n const dx = rest[2 * b] - rest[2 * a], dy = rest[2 * b + 1] - rest[2 * a + 1];\n const ex = rest[2 * c] - rest[2 * a], ey = rest[2 * c + 1] - rest[2 * a + 1];\n const d2 = dx * dx + dy * dy;\n if (d2 === 0) continue;\n const x = (ex * dx + ey * dy) / d2;\n const y = (ey * dx - ex * dy) / d2;\n idx.set([2 * a, 2 * a + 1, 2 * b, 2 * b + 1, 2 * c, 2 * c + 1]);\n // The miss in x, then in y, as coefficients on (ax, ay, bx, by, cx, cy).\n for (const r of [[-(1 - x), -y, -x, y, 1, 0], [y, -(1 - x), -y, -x, 0, 1]]) {\n coef.set(r);\n for (let i = 0; i < 6; i++) {\n for (let j = 0; j <= i; j++) if (coef[i] !== 0 && coef[j] !== 0) addSymmetric(rows, idx[i], idx[j], coef[i] * coef[j]);\n }\n }\n }\n }\n return rows;\n}\n\n/** The rigid step's energy: every triangle edge kept as its fitted copy has it, one coordinate at a time. */\nexport function edgeEnergy(tris: Int32Array, n: number): SymmetricRows {\n const rows = symmetricRows(n);\n for (let t = 0; t < tris.length; t += 3) {\n for (let e = 0; e < 3; e++) {\n const i = tris[t + e], j = tris[t + (e + 1) % 3];\n addSymmetric(rows, i, i, 1);\n addSymmetric(rows, j, j, 1);\n addSymmetric(rows, i, j, -1);\n }\n }\n return rows;\n}\n","/**\n * The injective pass of an as-rigid-as-possible solve, for a result that left\n * triangles turned over. It descends on the untangling energy of Garanzha et\n * al. (\"Foldover-free maps in 50 lines of code\", 2021): a distortion measure\n * whose denominator is a softened area, finite for a turned-over triangle while\n * the softening `eps` is above zero and growing without bound as a triangle\n * flattens once it reaches zero. `eps` shrinks round by round as the turned\n * triangles right themselves; once none is left, the pass holds it at zero and\n * a line search that never lets a triangle flatten keeps the map injective.\n * Each step is the energy's gradient carried through the rigid step's edge\n * system, already factored (the quadratic proxy of Kovalsky, Galun and Lipman,\n * 2016), with the pins held where they are, so a round costs about what a\n * local/global round does and the pins land exactly.\n */\nimport { solveSplit } from './arapSystem';\nimport type { Piece } from './arapPiece';\n\n/** Each rest triangle's inverse edge matrix, four entries per triangle, and its area. */\nexport interface RestFrames {\n inv: Float64Array;\n area: Float64Array;\n}\n\nexport function restFrames(rest: Float64Array, tris: Int32Array): RestFrames {\n const nt = tris.length / 3;\n const inv = new Float64Array(4 * nt), area = new Float64Array(nt);\n for (let t = 0; t < nt; t++) {\n const a = tris[3 * t], b = tris[3 * t + 1], c = tris[3 * t + 2];\n const ux = rest[2 * b] - rest[2 * a], uy = rest[2 * b + 1] - rest[2 * a + 1];\n const vx = rest[2 * c] - rest[2 * a], vy = rest[2 * c + 1] - rest[2 * a + 1];\n const det = ux * vy - uy * vx;\n if (det === 0) continue;\n inv.set([vy / det, -vx / det, -uy / det, ux / det], 4 * t);\n area[t] = Math.abs(det) / 2;\n }\n return { inv, area };\n}\n\n/** The share of the way to the nearest flattening a step may go. */\nconst FLIP_MARGIN = 0.8;\nconst ARMIJO = 1e-4;\n/** Weight of the area term against the shape term. */\nconst AREA = 1;\n\n/** Triangle `t`'s Jacobian at `pos`, as `[j11, j12, j21, j22]`, or null when it has no area at rest. */\nfunction jacobian(piece: Piece, pos: Float64Array, t: number, J: Float64Array): boolean {\n const { tris, frames } = piece;\n if (frames.area[t] === 0) return false;\n const a = tris[3 * t], b = tris[3 * t + 1], c = tris[3 * t + 2];\n const ux = pos[2 * b] - pos[2 * a], uy = pos[2 * b + 1] - pos[2 * a + 1];\n const vx = pos[2 * c] - pos[2 * a], vy = pos[2 * c + 1] - pos[2 * a + 1];\n const m = frames.inv;\n const i = 4 * t;\n J[0] = ux * m[i] + vx * m[i + 2]; J[1] = ux * m[i + 1] + vx * m[i + 3];\n J[2] = uy * m[i] + vy * m[i + 2]; J[3] = uy * m[i + 1] + vy * m[i + 3];\n return true;\n}\n\n/** How far along `d` from `pos` the first triangle flattens, or Infinity when none does. */\nexport function flipBound(piece: Piece, pos: Float64Array, d: Float64Array): number {\n const { tris, rest } = piece;\n let bound = Infinity;\n for (let t = 0; t < tris.length; t += 3) {\n const a = tris[t], b = tris[t + 1], c = tris[t + 2];\n const side = Math.sign((rest[2 * b] - rest[2 * a]) * (rest[2 * c + 1] - rest[2 * a + 1]) - (rest[2 * b + 1] - rest[2 * a + 1]) * (rest[2 * c] - rest[2 * a]));\n if (side === 0) continue;\n const ux = pos[2 * b] - pos[2 * a], uy = pos[2 * b + 1] - pos[2 * a + 1];\n const vx = pos[2 * c] - pos[2 * a], vy = pos[2 * c + 1] - pos[2 * a + 1];\n const dux = d[2 * b] - d[2 * a], duy = d[2 * b + 1] - d[2 * a + 1];\n const dvx = d[2 * c] - d[2 * a], dvy = d[2 * c + 1] - d[2 * a + 1];\n // side * det(u + s du, v + s dv) = c0 + c1 s + c2 s²\n const c0 = side * (ux * vy - uy * vx);\n const c1 = side * (ux * dvy - uy * dvx + dux * vy - duy * vx);\n const c2 = side * (dux * dvy - duy * dvx);\n if (c0 <= 0) return 0;\n bound = Math.min(bound, smallestPositiveRoot(c0, c1, c2));\n }\n return bound;\n}\n\nfunction smallestPositiveRoot(c0: number, c1: number, c2: number): number {\n if (Math.abs(c2) < 1e-14 * (Math.abs(c1) + Math.abs(c0))) return c1 < 0 ? -c0 / c1 : Infinity;\n const disc = c1 * c1 - 4 * c2 * c0;\n if (disc < 0) return Infinity;\n const q = -0.5 * (c1 + Math.sign(c1 || 1) * Math.sqrt(disc));\n const roots = [q / c2, c0 / q].filter((s) => s > 0 && Number.isFinite(s));\n return roots.length ? Math.min(...roots) : Infinity;\n}\n\n/** The softened area: `d` itself well above `eps`, small and positive below zero. */\nconst chi = (d: number, eps: number) => (d + Math.sqrt(eps * eps + d * d)) / 2;\n\n/** The untangling energy at `pos`; at `eps` 0, infinite once a triangle has turned over or flattened. */\nexport function untangleEnergy(piece: Piece, pos: Float64Array, eps: number): number {\n const J = new Float64Array(4);\n const { area } = piece.frames;\n let E = 0;\n for (let t = 0; t < area.length; t++) {\n if (!jacobian(piece, pos, t, J)) continue;\n const d = J[0] * J[3] - J[1] * J[2];\n const c = chi(d, eps);\n if (!(c > 0)) return Infinity;\n E += (area[t] * (J[0] * J[0] + J[1] * J[1] + J[2] * J[2] + J[3] * J[3] + AREA * (d * d + 1))) / c;\n }\n return E;\n}\n\n/** The smallest Jacobian determinant over the piece's triangles at `pos`: below zero where one has turned over. */\nexport function leastArea(piece: Piece, pos: Float64Array): number {\n const J = new Float64Array(4);\n let least = Infinity;\n for (let t = 0; t < piece.frames.area.length; t++) {\n if (jacobian(piece, pos, t, J)) least = Math.min(least, J[0] * J[3] - J[1] * J[2]);\n }\n return least;\n}\n\nfunction gradient(piece: Piece, pos: Float64Array, eps: number): Float64Array {\n const { tris, frames } = piece;\n const g = new Float64Array(pos.length);\n const J = new Float64Array(4);\n for (let t = 0; t < frames.area.length; t++) {\n if (!jacobian(piece, pos, t, J)) continue;\n const d = J[0] * J[3] - J[1] * J[2];\n const root = Math.sqrt(eps * eps + d * d);\n const c = (d + root) / 2;\n const A = frames.area[t];\n const top = J[0] * J[0] + J[1] * J[1] + J[2] * J[2] + J[3] * J[3] + AREA * (d * d + 1);\n const dc = root === 0 ? 0.5 : (1 + d / root) / 2;\n // dE/dJ = (2 J + 2 AREA d cof J) / c - top dc cof J / c², cof J being d's own gradient.\n const s = (2 * A) / c, r = A * ((2 * AREA * d) / c - (top * dc) / (c * c));\n const g0 = s * J[0] + r * J[3], g1 = s * J[1] - r * J[2], g2 = s * J[2] - r * J[1], g3 = s * J[3] + r * J[0];\n const m = frames.inv, i = 4 * t;\n const gux = g0 * m[i] + g1 * m[i + 1], gvx = g0 * m[i + 2] + g1 * m[i + 3];\n const guy = g2 * m[i] + g3 * m[i + 1], gvy = g2 * m[i + 2] + g3 * m[i + 3];\n const a = tris[3 * t], b = tris[3 * t + 1], cc = tris[3 * t + 2];\n g[2 * b] += gux; g[2 * b + 1] += guy; g[2 * cc] += gvx; g[2 * cc + 1] += gvy;\n g[2 * a] -= gux + gvx; g[2 * a + 1] -= guy + gvy;\n }\n return g;\n}\n\n/** Whether any triangle at `pos` has turned over or flattened against its rest orientation. */\nexport function turnedOver(piece: Piece, pos: Float64Array): boolean {\n return flipBound(piece, pos, new Float64Array(pos.length)) === 0;\n}\n\n/** The softening to start untangling `pos` with. */\nexport function startingEps(piece: Piece, pos: Float64Array): number {\n return Math.max(1e-3, 2 * Math.abs(Math.min(0, leastArea(piece, pos))));\n}\n\n/**\n * The softening for the next round, after a round took the energy from\n * `before` to `after` (both at `eps`): small enough that it keeps pressing a\n * turned triangle towards positive area, never below zero, and zero once\n * every triangle has some.\n */\nexport function nextEps(piece: Piece, pos: Float64Array, eps: number, before: number, after: number): number {\n const least = leastArea(piece, pos);\n const sigma = Math.max(1 - after / before, 0.1);\n const mu = (1 - sigma) * chi(least, eps);\n return least < mu ? 2 * Math.sqrt(mu * (mu - least)) : 0;\n}\n\n/**\n * One round of descent from `pos` at softening `eps`, the pins held. At `eps`\n * 0 the step stops short of flattening any triangle. Returns the new positions,\n * their energy at `eps`, and the farthest any vertex moved.\n */\nexport function untangleRound(piece: Piece, pos: Float64Array, eps: number, energy: number): { pos: Float64Array; energy: number; moved: number } {\n const { pinOf, freeOf, step2 } = piece;\n const g = gradient(piece, pos, eps);\n const nf = step2.coupling.length;\n const bx = new Float64Array(nf), by = new Float64Array(nf);\n for (let i = 0; i < pinOf.length; i++) {\n if (freeOf[i] >= 0) { bx[freeOf[i]] = -g[2 * i]; by[freeOf[i]] = -g[2 * i + 1]; }\n }\n const dx = solveSplit(step2, () => 0, bx);\n const dy = solveSplit(step2, () => 0, by);\n const d = new Float64Array(pos.length);\n let slope = 0;\n for (let i = 0; i < pinOf.length; i++) {\n const f = freeOf[i];\n if (f < 0) continue;\n d[2 * i] = dx[f]; d[2 * i + 1] = dy[f];\n slope += g[2 * i] * dx[f] + g[2 * i + 1] * dy[f];\n }\n let s = eps > 0 ? 1 : Math.min(1, FLIP_MARGIN * flipBound(piece, pos, d));\n const next = new Float64Array(pos.length);\n for (; s > 1e-12; s /= 2) {\n for (let i = 0; i < next.length; i++) next[i] = pos[i] + s * d[i];\n const e = untangleEnergy(piece, next, eps);\n if (e <= energy + ARMIJO * s * slope) {\n let moved = 0;\n for (let i = 0; i < d.length; i += 2) moved = Math.max(moved, s * Math.hypot(d[i], d[i + 1]));\n return { pos: next, energy: e, moved };\n }\n }\n return { pos, energy, moved: 0 };\n}\n","/**\n * One connected piece of an as-rigid-as-possible mesh holding at least two\n * pins, in its own local vertex numbering, with both systems factored. Its\n * positions are interleaved `x, y` in that numbering, pinned vertices included.\n */\nimport type { ArapMesh } from './arap';\nimport { edgeEnergy, similarityEnergy, solveSplit, split, type Split } from './arapSystem';\nimport { restFrames, type RestFrames } from './injective';\n\nexport interface Piece {\n /** Local vertex → mesh vertex. */\n verts: Int32Array;\n /** Rest positions, local. */\n rest: Float64Array;\n /** The larger side of its rest bounds. */\n size: number;\n /** Triangles as local vertex triples. */\n tris: Int32Array;\n /** Local vertex → pin index, or -1 when free. */\n pinOf: Int32Array;\n freeOf: Int32Array;\n step1: Split;\n step2: Split;\n frames: RestFrames;\n}\n\nexport function buildPiece(mesh: ArapMesh, verts: number[], tris: number[], pinAt: Map<number, number>, local: Int32Array): Piece | null {\n const n = verts.length;\n verts.forEach((v, i) => { local[v] = i; });\n const rest = new Float64Array(2 * n);\n verts.forEach((v, i) => { rest[2 * i] = mesh.vertices[2 * v]; rest[2 * i + 1] = mesh.vertices[2 * v + 1]; });\n let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n for (let i = 0; i < 2 * n; i += 2) {\n x0 = Math.min(x0, rest[i]); x1 = Math.max(x1, rest[i]); y0 = Math.min(y0, rest[i + 1]); y1 = Math.max(y1, rest[i + 1]);\n }\n const T = mesh.triangles;\n const lt = new Int32Array(3 * tris.length);\n tris.forEach((t, k) => { for (let c = 0; c < 3; c++) lt[3 * k + c] = local[T[3 * t + c]]; });\n const pinOf = Int32Array.from(verts, (v) => pinAt.get(v) ?? -1);\n const freeOf = new Int32Array(n).fill(-1);\n let nf = 0;\n for (let i = 0; i < n; i++) if (pinOf[i] < 0) freeOf[i] = nf++;\n const free2 = Int32Array.from({ length: 2 * n }, (_, u) => (freeOf[u >> 1] < 0 ? -1 : 2 * freeOf[u >> 1] + (u & 1)));\n const step1 = split(similarityEnergy(rest, lt, n), free2);\n const step2 = split(edgeEnergy(lt, n), freeOf);\n if (!step1 || !step2) return null;\n return { verts: Int32Array.from(verts), rest, size: Math.max(x1 - x0, y1 - y0), tris: lt, pinOf, freeOf, step1, step2, frames: restFrames(rest, lt) };\n}\n\n/** The similarity step: the shape keeping each triangle closest to a turned and scaled copy of itself. */\nexport function similaritySolve(piece: Piece, targets: ArrayLike<number>): Float64Array {\n const { pinOf, freeOf, step1 } = piece;\n const x = solveSplit(step1, (u) => targets[2 * pinOf[u >> 1] + (u & 1)], new Float64Array(step1.coupling.length));\n const pos = new Float64Array(2 * pinOf.length);\n for (let i = 0; i < pinOf.length; i++) {\n for (let c = 0; c < 2; c++) pos[2 * i + c] = pinOf[i] >= 0 ? targets[2 * pinOf[i] + c] : x[2 * freeOf[i] + c];\n }\n return pos;\n}\n\n/**\n * One local/global round from `pos`: fit a turned, unscaled copy of each rest\n * triangle to it, then find the vertices that best agree with every copy.\n * Returns the new positions and the rigidity energy `pos` had against the fit.\n */\nexport function rigidRound(piece: Piece, targets: ArrayLike<number>, pos: Float64Array): { pos: Float64Array; energy: number } {\n const { rest, tris, pinOf, freeOf, step2 } = piece;\n const nf = step2.coupling.length;\n const bx = new Float64Array(nf), by = new Float64Array(nf);\n let energy = 0;\n for (let t = 0; t < tris.length; t += 3) {\n let dot = 0, cross = 0, sq = 0;\n for (let e = 0; e < 3; e++) {\n const i = tris[t + e], j = tris[t + (e + 1) % 3];\n const px = rest[2 * i] - rest[2 * j], py = rest[2 * i + 1] - rest[2 * j + 1];\n const qx = pos[2 * i] - pos[2 * j], qy = pos[2 * i + 1] - pos[2 * j + 1];\n dot += px * qx + py * qy;\n cross += px * qy - py * qx;\n sq += px * px + py * py + qx * qx + qy * qy;\n }\n const len = Math.hypot(dot, cross);\n energy += sq - 2 * len;\n const cos = len === 0 ? 1 : dot / len, sin = len === 0 ? 0 : cross / len;\n for (let e = 0; e < 3; e++) {\n const i = tris[t + e], j = tris[t + (e + 1) % 3];\n const ex = rest[2 * i] - rest[2 * j], ey = rest[2 * i + 1] - rest[2 * j + 1];\n const fx = cos * ex - sin * ey, fy = sin * ex + cos * ey;\n if (freeOf[i] >= 0) { bx[freeOf[i]] += fx; by[freeOf[i]] += fy; }\n if (freeOf[j] >= 0) { bx[freeOf[j]] -= fx; by[freeOf[j]] -= fy; }\n }\n }\n const x = solveSplit(step2, (u) => targets[2 * pinOf[u]], bx);\n const y = solveSplit(step2, (u) => targets[2 * pinOf[u] + 1], by);\n const out = new Float64Array(pos.length);\n for (let i = 0; i < pinOf.length; i++) {\n const p = pinOf[i];\n out[2 * i] = p >= 0 ? targets[2 * p] : x[freeOf[i]];\n out[2 * i + 1] = p >= 0 ? targets[2 * p + 1] : y[freeOf[i]];\n }\n return { pos: out, energy };\n}\n\n/** Copy a piece's positions into the whole mesh's. */\nexport function placePiece(piece: Piece, pos: Float64Array, out: Float64Array): void {\n piece.verts.forEach((v, i) => { out[2 * v] = pos[2 * i]; out[2 * v + 1] = pos[2 * i + 1]; });\n}\n","/**\n * As-rigid-as-possible deformation of a triangle mesh with pinned vertices.\n * It starts from Igarashi, Moscovich and Hughes's two linear steps (2005): the\n * shape keeping each triangle closest to a turned and scaled copy of itself,\n * then the vertices best agreeing with an unscaled copy of each rest triangle\n * fitted to it. Rounds of the local/global method (Liu et al., 2008) follow,\n * each refitting the copies to the last result and solving again, which takes\n * out more of the stretch and squash the first step left. None of these stops\n * a hard pull from turning triangles over, which runs the outline backwards\n * through the fold; when the rounds leave any, an injective pass (`injective`)\n * rights them with the pins held. Every system depends only on the mesh and\n * which vertices are pinned, so each is factored once per pin set and only\n * re-solved as the pins move.\n */\nimport { buildPiece, placePiece, rigidRound, similaritySolve, type Piece } from './arapPiece';\nimport { nextEps, startingEps, turnedOver, untangleEnergy, untangleRound } from './injective';\n\n/** A triangle mesh at rest: interleaved `x, y` vertices and vertex-index triples. */\nexport interface ArapMesh {\n vertices: Float64Array;\n triangles: Uint32Array;\n}\n\n/**\n * A stage of a solve: `similarity` is the first linear step, `rigid` the\n * second, `local-global` each round after them, and `injective` each round\n * of the pass that runs when those leave a triangle turned over. That pass's\n * last step is the result: its pins set exactly, or the local/global result\n * again when the pins cannot be set without a fold.\n */\nexport type ArapStage = 'similarity' | 'rigid' | 'local-global' | 'injective';\n\n/** A solve's state after one stage: every vertex's position, interleaved `x, y`. */\nexport interface ArapStep {\n stage: ArapStage;\n /** Which round of its stage, from 1. */\n round: number;\n vertices: Float64Array;\n}\n\n/** Options for {@link ArapSolver.solve}. */\nexport interface ArapSolveOptions {\n /** The most local/global rounds to run after the two linear steps; 0\n * returns their result alone. Rounds stop early once the mesh settles.\n * Default {@link ARAP_ROUNDS}. */\n iterations?: number;\n /** The most rounds of the injective pass; 0 skips it. Default\n * {@link ARAP_INJECTIVE_ROUNDS}. */\n injectiveIterations?: number;\n /** Called with the state after each stage, in order; the last call carries\n * the result. A step's `vertices` is the caller's to keep. */\n trace?: (step: ArapStep) => void;\n}\n\n/** A factored deformation; `solve` takes each pinned vertex's target, as\n * interleaved `x, y` in pin order, and returns every vertex's position. */\nexport interface ArapSolver {\n solve(targets: ArrayLike<number>, opts?: ArapSolveOptions): Float64Array;\n}\n\n/** The default most local/global rounds per solve. */\nexport const ARAP_ROUNDS = 5;\n/** The default most injective rounds per solve. */\nexport const ARAP_INJECTIVE_ROUNDS = 100;\n/** A round moving no vertex farther than this share of the piece's size ends the rounds. */\nconst SETTLED = 1e-4;\n\n/** The mesh's connected pieces: vertex lists and triangle lists. */\nfunction piecesOf(mesh: ArapMesh): { verts: number[]; tris: number[] }[] {\n const n = mesh.vertices.length >> 1;\n const parent = Int32Array.from({ length: n }, (_, i) => i);\n const find = (i: number): number => {\n while (parent[i] !== i) { parent[i] = parent[parent[i]]; i = parent[i]; }\n return i;\n };\n const T = mesh.triangles;\n for (let t = 0; t + 2 < T.length; t += 3) {\n parent[find(T[t + 1])] = find(T[t]);\n parent[find(T[t + 2])] = find(T[t]);\n }\n const byRoot = new Map<number, { verts: number[]; tris: number[] }>();\n const used = new Uint8Array(n);\n for (let t = 0; t + 2 < T.length; t += 3) {\n const r = find(T[t]);\n let p = byRoot.get(r);\n if (!p) { p = { verts: [], tris: [] }; byRoot.set(r, p); }\n p.tris.push(t / 3);\n for (let k = 0; k < 3; k++) if (!used[T[t + k]]) { used[T[t + k]] = 1; p.verts.push(T[t + k]); }\n }\n return [...byRoot.values()];\n}\n\n/** The farthest any vertex moved between `a` and `b`. */\nfunction largestMove(a: Float64Array, b: Float64Array): number {\n let m = 0;\n for (let i = 0; i < a.length; i += 2) m = Math.max(m, Math.hypot(b[i] - a[i], b[i + 1] - a[i + 1]));\n return m;\n}\n\n/** The rigid motion best carrying `from` points onto `to` points. */\nfunction rigidFit(from: readonly number[], to: ArrayLike<number>): (x: number, y: number) => [number, number] {\n const k = from.length >> 1;\n let pcx = 0, pcy = 0, qcx = 0, qcy = 0;\n for (let i = 0; i < k; i++) { pcx += from[2 * i]; pcy += from[2 * i + 1]; qcx += to[2 * i]; qcy += to[2 * i + 1]; }\n pcx /= k; pcy /= k; qcx /= k; qcy /= k;\n let dot = 0, cross = 0;\n for (let i = 0; i < k; i++) {\n const px = from[2 * i] - pcx, py = from[2 * i + 1] - pcy;\n const qx = to[2 * i] - qcx, qy = to[2 * i + 1] - qcy;\n dot += px * qx + py * qy; cross += px * qy - py * qx;\n }\n const len = Math.hypot(dot, cross);\n const cos = len === 0 ? 1 : dot / len, sin = len === 0 ? 0 : cross / len;\n return (x, y) => [cos * (x - pcx) - sin * (y - pcy) + qcx, sin * (x - pcx) + cos * (y - pcy) + qcy];\n}\n\n/**\n * Factor the deformation of `mesh` with vertices `pinned` held. A piece of\n * the mesh holding two pins or more deforms as rigidly as they allow; one\n * holding a single pin moves with it; one holding none moves rigidly with the\n * pins as a whole.\n */\nexport function createArapSolver(mesh: ArapMesh, pinned: readonly number[]): ArapSolver {\n const n = mesh.vertices.length >> 1;\n const pinAt = new Map<number, number>();\n pinned.forEach((v, k) => { if (!pinAt.has(v)) pinAt.set(v, k); });\n const local = new Int32Array(n);\n const pinFrom = pinned.flatMap((v) => [mesh.vertices[2 * v], mesh.vertices[2 * v + 1]]);\n const solved: Piece[] = [];\n const carried: { verts: number[]; pin: number }[] = [];\n for (const p of piecesOf(mesh)) {\n const pins = [...new Set(p.verts.filter((v) => pinAt.has(v)).map((v) => pinAt.get(v)!))];\n const piece = pins.length >= 2 ? buildPiece(mesh, p.verts, p.tris, pinAt, local) : null;\n if (piece) solved.push(piece);\n else carried.push({ verts: p.verts, pin: pins.length === 1 ? pins[0] : -1 });\n }\n return {\n solve(targets, opts = {}) {\n const out = Float64Array.from(mesh.vertices);\n const whole = carried.some((c) => c.pin < 0) && pinned.length > 0 ? rigidFit(pinFrom, targets) : null;\n for (const { verts, pin } of carried) {\n for (const v of verts) {\n const x = mesh.vertices[2 * v], y = mesh.vertices[2 * v + 1];\n if (pin >= 0) {\n out[2 * v] = x + targets[2 * pin] - pinFrom[2 * pin];\n out[2 * v + 1] = y + targets[2 * pin + 1] - pinFrom[2 * pin + 1];\n } else if (whole) {\n [out[2 * v], out[2 * v + 1]] = whole(x, y);\n }\n }\n }\n const { trace } = opts;\n const report = (stage: ArapStage, round: number) => trace?.({ stage, round, vertices: Float64Array.from(out) });\n const pos = solved.map((piece) => similaritySolve(piece, targets));\n solved.forEach((piece, k) => placePiece(piece, pos[k], out));\n report('similarity', 1);\n solved.forEach((piece, k) => { pos[k] = rigidRound(piece, targets, pos[k]).pos; placePiece(piece, pos[k], out); });\n report('rigid', 1);\n const rounds = Math.max(0, Math.floor(opts.iterations ?? ARAP_ROUNDS));\n const live = solved.map(() => true);\n for (let r = 1; r <= rounds && live.some(Boolean); r++) {\n solved.forEach((piece, k) => {\n if (!live[k]) return;\n const next = rigidRound(piece, targets, pos[k]).pos;\n live[k] = largestMove(pos[k], next) > SETTLED * piece.size;\n pos[k] = next;\n placePiece(piece, next, out);\n });\n report('local-global', r);\n }\n const injective = Math.max(0, Math.floor(opts.injectiveIterations ?? ARAP_INJECTIVE_ROUNDS));\n const tangled = solved.map((piece, k) => injective > 0 && turnedOver(piece, pos[k]));\n if (tangled.some(Boolean)) {\n const state = solved.map((piece, k) => {\n const eps = tangled[k] ? startingEps(piece, pos[k]) : 0;\n return { pos: pos[k], eps, energy: tangled[k] ? untangleEnergy(piece, pos[k], eps) : 0, live: tangled[k] };\n });\n let r = 1;\n for (; r <= injective && state.some((s) => s.live); r++) {\n solved.forEach((piece, k) => {\n const s = state[k];\n if (!s.live) return;\n const step = untangleRound(piece, s.pos, s.eps, s.energy);\n const settled = step.moved <= SETTLED * piece.size || s.energy - step.energy <= SETTLED * step.energy;\n s.pos = step.pos;\n if (s.eps > 0) {\n s.eps = nextEps(piece, s.pos, s.eps, s.energy, step.energy);\n s.energy = untangleEnergy(piece, s.pos, s.eps);\n } else {\n s.energy = step.energy;\n s.live = !settled;\n }\n placePiece(piece, s.pos, out);\n });\n report('injective', r);\n }\n // A piece still tangled when the rounds run out keeps the local/global result.\n let fell = false;\n solved.forEach((piece, k) => {\n if (!tangled[k] || !turnedOver(piece, state[k].pos)) return;\n placePiece(piece, pos[k], out);\n fell = true;\n });\n if (fell) report('injective', r);\n }\n return out;\n },\n };\n}\n","/**\n * A smooth map through a deformed triangle mesh: the Clough–Tocher\n * interpolant (Farin's reduced form). Each triangle is split at its centroid\n * into three cubic pieces built from the vertices' positions and derivatives,\n * and the derivative across every edge, between triangles and inside one, is\n * the same on both sides. Only the triangle holding a point is read, so a\n * point costs what one cubic costs.\n */\nimport type { ArapMesh } from './arap';\nimport type { MeshSpot } from './meshMap';\n\n/** What the interpolant needs of a mesh at rest, set up once per mesh: each\n * triangle's inverse edge matrix and area. */\nexport interface RestFrames {\n inverse: Float64Array;\n area: Float64Array;\n}\n\nexport function restFrames(mesh: ArapMesh): RestFrames {\n const V = mesh.vertices, T = mesh.triangles;\n const nt = T.length / 3;\n const inverse = new Float64Array(4 * nt);\n const area = new Float64Array(nt);\n for (let t = 0; t < nt; t++) {\n const a = T[3 * t], b = T[3 * t + 1], c = T[3 * t + 2];\n const ux = V[2 * b] - V[2 * a], uy = V[2 * b + 1] - V[2 * a + 1];\n const vx = V[2 * c] - V[2 * a], vy = V[2 * c + 1] - V[2 * a + 1];\n const det = ux * vy - uy * vx;\n if (det === 0) continue;\n inverse.set([vy / det, -vx / det, -uy / det, ux / det], 4 * t);\n area[t] = Math.abs(det) / 2;\n }\n return { inverse, area };\n}\n\n/** Each vertex's derivative under the deformation `at`: the area-weighted\n * mean of its triangles' affine derivatives, row-major 2×2. */\nfunction vertexDerivatives(mesh: ArapMesh, frames: RestFrames, at: Float64Array): Float64Array {\n const T = mesh.triangles;\n const nv = mesh.vertices.length / 2;\n const J = new Float64Array(4 * nv);\n const weight = new Float64Array(nv);\n for (let t = 0; t < T.length / 3; t++) {\n const w = frames.area[t];\n if (w === 0) continue;\n const a = T[3 * t], b = T[3 * t + 1], c = T[3 * t + 2];\n const ux = at[2 * b] - at[2 * a], uy = at[2 * b + 1] - at[2 * a + 1];\n const vx = at[2 * c] - at[2 * a], vy = at[2 * c + 1] - at[2 * a + 1];\n const i = frames.inverse;\n const m0 = ux * i[4 * t] + vx * i[4 * t + 2], m1 = ux * i[4 * t + 1] + vx * i[4 * t + 3];\n const m2 = uy * i[4 * t] + vy * i[4 * t + 2], m3 = uy * i[4 * t + 1] + vy * i[4 * t + 3];\n for (const v of [a, b, c]) {\n J[4 * v] += w * m0; J[4 * v + 1] += w * m1; J[4 * v + 2] += w * m2; J[4 * v + 3] += w * m3;\n weight[v] += w;\n }\n }\n for (let v = 0; v < nv; v++) {\n if (weight[v] === 0) { J[4 * v] = 1; J[4 * v + 3] = 1; continue; }\n for (let k = 0; k < 4; k++) J[4 * v + k] /= weight[v];\n }\n return J;\n}\n\n/*\n * A triangle's Bézier ordinates, 19 points. For corner i: its position F+i,\n * its ordinate toward the centroid S+i and the next one in, I+i. Toward the\n * corner after it, N+i, and the one before, P+i. M+k sits on the edge opposite\n * corner k, and C is the centroid.\n */\nconst F = 0, S = 3, I = 6, N = 9, P = 12, M = 15, C = 18;\nconst ORDINATES = 19;\n\nfunction buildOrdinates(V: Float64Array, T: Uint32Array, at: Float64Array, J: Float64Array, t: number, out: Float64Array): void {\n const vx = [0, 0, 0], vy = [0, 0, 0], v = [0, 0, 0];\n for (let k = 0; k < 3; k++) { v[k] = T[3 * t + k]; vx[k] = V[2 * v[k]]; vy[k] = V[2 * v[k] + 1]; }\n const sx = (vx[0] + vx[1] + vx[2]) / 3, sy = (vy[0] + vy[1] + vy[2]) / 3;\n const set = (o: number, x: number, y: number) => { out[2 * o] = x; out[2 * o + 1] = y; };\n const x = (o: number) => out[2 * o], y = (o: number) => out[2 * o + 1];\n // Corner k's tangent plane, a third of the way to (px, py).\n const toward = (o: number, k: number, px: number, py: number) => {\n const dx = (px - vx[k]) / 3, dy = (py - vy[k]) / 3, j = 4 * v[k];\n set(o, at[2 * v[k]] + J[j] * dx + J[j + 1] * dy, at[2 * v[k] + 1] + J[j + 2] * dx + J[j + 3] * dy);\n };\n for (let k = 0; k < 3; k++) {\n const n = (k + 1) % 3, p = (k + 2) % 3;\n set(F + k, at[2 * v[k]], at[2 * v[k] + 1]);\n toward(S + k, k, sx, sy);\n toward(N + k, k, vx[n], vy[n]);\n toward(P + k, k, vx[p], vy[p]);\n }\n // The edge ordinate that makes the derivative along the edge's normal linear\n // along the edge: then both triangles beside it agree on it.\n for (let k = 0; k < 3; k++) {\n const a = (k + 1) % 3, b = (k + 2) % 3;\n const ex = vx[b] - vx[a], ey = vy[b] - vy[a];\n const lb = ((sx - vx[a]) * ex + (sy - vy[a]) * ey) / (ex * ex + ey * ey), la = 1 - lb;\n const mid = (c: (o: number) => number) => la * c(N + a) + lb * c(P + b)\n + 0.5 * (c(S + a) - la * c(F + a) - lb * c(N + a) + c(S + b) - la * c(P + b) - lb * c(F + b));\n set(M + k, mid(x), mid(y));\n }\n for (let k = 0; k < 3; k++) {\n // The ordinate beside corner k's on the spoke to the centroid, between the two edges that meet at k.\n const e1 = M + (k + 1) % 3, e2 = M + (k + 2) % 3;\n set(I + k, (x(S + k) + x(e1) + x(e2)) / 3, (y(S + k) + y(e1) + y(e2)) / 3);\n }\n set(C, (x(I) + x(I + 1) + x(I + 2)) / 3, (y(I) + y(I + 1) + y(I + 2)) / 3);\n}\n\n/** For the piece beside the edge opposite each corner, where each of its ten ordinates sits, in term order. */\nconst PIECES = [0, 1, 2].map((k) => {\n const a = (k + 1) % 3, b = (k + 2) % 3;\n return Int32Array.from([F + a, F + b, C, N + a, P + b, S + a, I + a, S + b, I + b, M + k], (o) => 2 * o);\n});\n\n/**\n * The cubic piece's value at weights `w` (on corners 0, 1, 2) inside the\n * triangle, plus its derivative along the weight step `d` where one is given.\n */\nfunction evaluate(o: Float64Array, base: number, w: readonly number[], d: readonly number[] = [0, 0, 0]): { x: number; y: number } {\n const k = w[0] <= w[1] && w[0] <= w[2] ? 0 : w[1] <= w[2] ? 1 : 2;\n const a = (k + 1) % 3, b = (k + 2) % 3;\n const u = w[a] - w[k], v = w[b] - w[k], s = 3 * w[k];\n const du = d[a] - d[k], dv = d[b] - d[k], ds = 3 * d[k];\n const c0 = u * u * u + 3 * u * u * du;\n const c1 = v * v * v + 3 * v * v * dv;\n const c2 = s * s * s + 3 * s * s * ds;\n const c3 = 3 * (u * u * v + 2 * u * v * du + u * u * dv);\n const c4 = 3 * (u * v * v + v * v * du + 2 * u * v * dv);\n const c5 = 3 * (u * u * s + 2 * u * s * du + u * u * ds);\n const c6 = 3 * (u * s * s + s * s * du + 2 * u * s * ds);\n const c7 = 3 * (v * v * s + 2 * v * s * dv + v * v * ds);\n const c8 = 3 * (v * s * s + s * s * dv + 2 * v * s * ds);\n const c9 = 6 * (u * v * s + v * s * du + u * s * dv + u * v * ds);\n const q = PIECES[k];\n const sum = (c: number) =>\n c0 * o[base + q[0] + c] + c1 * o[base + q[1] + c] + c2 * o[base + q[2] + c] + c3 * o[base + q[3] + c]\n + c4 * o[base + q[4] + c] + c5 * o[base + q[5] + c] + c6 * o[base + q[6] + c] + c7 * o[base + q[7] + c]\n + c8 * o[base + q[8] + c] + c9 * o[base + q[9] + c];\n return { x: sum(0), y: sum(1) };\n}\n\n/**\n * The smooth map carrying `mesh` onto its vertices placed at `at`, read at a\n * point's spot. A spot outside its triangle, a point off the mesh, takes the\n * value and derivative at the nearest weights inside it and steps on from\n * there in a straight line, so the map runs on smoothly past the outline\n * without the cubic's growth far from it. Each triangle's\n * ordinates are built the first time a point lands in it.\n */\nexport function cloughTocherMap(mesh: ArapMesh, frames: RestFrames, at: Float64Array): (spot: MeshSpot) => { x: number; y: number } {\n const V = mesh.vertices, T = mesh.triangles;\n const J = vertexDerivatives(mesh, frames, at);\n const ordinates = new Float64Array(2 * ORDINATES * (T.length / 3));\n const built = new Uint8Array(T.length / 3);\n return (spot) => {\n const t = spot.tri;\n if (!built[t]) { buildOrdinates(V, T, at, J, t, ordinates.subarray(2 * ORDINATES * t, 2 * ORDINATES * (t + 1))); built[t] = 1; }\n const base = 2 * ORDINATES * t;\n const w = [spot.w0, spot.w1, spot.w2];\n if (w[0] >= 0 && w[1] >= 0 && w[2] >= 0) return evaluate(ordinates, base, w);\n const clamped = w.map((v) => Math.max(0, v));\n const sum = clamped[0] + clamped[1] + clamped[2];\n const near = clamped.map((v) => v / sum);\n return evaluate(ordinates, base, near, w.map((v, i) => v - near[i]));\n };\n}\n","/**\n * A point's place in a triangle mesh, as the triangle holding it and its\n * barycentric weights there, so the point can follow the triangle when the\n * mesh deforms. A point outside every triangle takes the nearest one's\n * weights, extended past its edge.\n */\nimport type { ArapMesh } from './arap';\n\n/** A triangle and a point's weights on its three corners. */\nexport interface MeshSpot {\n tri: number;\n w0: number;\n w1: number;\n w2: number;\n}\n\nconst EPS = 1e-9;\n\nfunction weights(V: Float64Array, T: Uint32Array, t: number, x: number, y: number): MeshSpot | null {\n const a = T[3 * t], b = T[3 * t + 1], c = T[3 * t + 2];\n const ax = V[2 * a], ay = V[2 * a + 1];\n const bx = V[2 * b] - ax, by = V[2 * b + 1] - ay;\n const cx = V[2 * c] - ax, cy = V[2 * c + 1] - ay;\n const det = bx * cy - by * cx;\n if (det === 0) return null;\n const px = x - ax, py = y - ay;\n const w1 = (px * cy - py * cx) / det;\n const w2 = (bx * py - by * px) / det;\n return { tri: t, w0: 1 - w1 - w2, w1, w2 };\n}\n\n/** How far outside its triangle a spot lies, in weight terms; 0 inside. */\nconst outside = (s: MeshSpot) => Math.max(0, -s.w0, -s.w1, -s.w2);\n\n/** A lookup of the spot each point of the plane takes in `mesh`, through a bucket grid. */\nexport function meshLocator(mesh: ArapMesh): (x: number, y: number) => MeshSpot | null {\n const V = mesh.vertices, T = mesh.triangles;\n const nt = T.length / 3;\n if (nt === 0) return () => null;\n let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n for (let i = 0; i < V.length; i += 2) {\n x0 = Math.min(x0, V[i]); x1 = Math.max(x1, V[i]); y0 = Math.min(y0, V[i + 1]); y1 = Math.max(y1, V[i + 1]);\n }\n const side = Math.max(1, Math.ceil(Math.sqrt(nt)));\n const cw = (x1 - x0) / side || 1, ch = (y1 - y0) / side || 1;\n const cell = (v: number, o: number, s: number) => Math.min(side - 1, Math.max(0, Math.floor((v - o) / s)));\n const buckets: number[][] = Array.from({ length: side * side }, () => []);\n for (let t = 0; t < nt; t++) {\n let tx0 = Infinity, ty0 = Infinity, tx1 = -Infinity, ty1 = -Infinity;\n for (let k = 0; k < 3; k++) {\n const v = T[3 * t + k];\n tx0 = Math.min(tx0, V[2 * v]); tx1 = Math.max(tx1, V[2 * v]);\n ty0 = Math.min(ty0, V[2 * v + 1]); ty1 = Math.max(ty1, V[2 * v + 1]);\n }\n for (let i = cell(tx0, x0, cw); i <= cell(tx1, x0, cw); i++) {\n for (let j = cell(ty0, y0, ch); j <= cell(ty1, y0, ch); j++) buckets[j * side + i].push(t);\n }\n }\n return (x, y) => {\n const ci = cell(x, x0, cw), cj = cell(y, y0, ch);\n let best: MeshSpot | null = null;\n let bestOut = Infinity;\n // Widen the search ring by ring until a triangle holds the point, or the\n // nearest found cannot be beaten by a farther ring.\n for (let r = 0; r < side; r++) {\n for (let i = ci - r; i <= ci + r; i++) {\n for (let j = cj - r; j <= cj + r; j++) {\n if (i < 0 || j < 0 || i >= side || j >= side) continue;\n if (Math.max(Math.abs(i - ci), Math.abs(j - cj)) !== r) continue;\n for (const t of buckets[j * side + i]) {\n const s = weights(V, T, t, x, y);\n if (!s) continue;\n const o = outside(s);\n if (o <= EPS) return s;\n if (o < bestOut) { bestOut = o; best = s; }\n }\n }\n }\n if (best && r >= 1) return best;\n }\n return best;\n };\n}\n\n/** Where `spot` lands on the mesh's vertices placed at `at`. */\nexport function placeSpot(T: Uint32Array, at: Float64Array, s: MeshSpot): { x: number; y: number } {\n const a = T[3 * s.tri], b = T[3 * s.tri + 1], c = T[3 * s.tri + 2];\n return {\n x: s.w0 * at[2 * a] + s.w1 * at[2 * b] + s.w2 * at[2 * c],\n y: s.w0 * at[2 * a + 1] + s.w1 * at[2 * b + 1] + s.w2 * at[2 * c + 1],\n };\n}\n","/**\n * Points added inside a triangulated region, and its triangles flipped toward\n * Delaunay (Lawson's flips): each added point splits the triangle holding it,\n * and an edge two triangles share is flipped while the far corner of one lies\n * inside the other's circumcircle. An edge only one triangle has — the\n * region's outline — is never flipped, so the triangles stay inside it.\n */\n\n/** Twice the signed area of `(a, b, c)`; positive when counter-clockwise. */\nfunction orient(V: number[], a: number, b: number, c: number): number {\n return (V[2 * b] - V[2 * a]) * (V[2 * c + 1] - V[2 * a + 1]) - (V[2 * b + 1] - V[2 * a + 1]) * (V[2 * c] - V[2 * a]);\n}\n\n/** Whether `d` lies inside the circle through counter-clockwise `(a, b, c)`. */\nfunction inCircle(V: number[], a: number, b: number, c: number, d: number): boolean {\n const ax = V[2 * a] - V[2 * d], ay = V[2 * a + 1] - V[2 * d + 1];\n const bx = V[2 * b] - V[2 * d], by = V[2 * b + 1] - V[2 * d + 1];\n const cx = V[2 * c] - V[2 * d], cy = V[2 * c + 1] - V[2 * d + 1];\n const det = (ax * ax + ay * ay) * (bx * cy - cx * by) - (bx * bx + by * by) * (ax * cy - cx * ay)\n + (cx * cx + cy * cy) * (ax * by - bx * ay);\n return det > 1e-12 * (ax * ax + ay * ay + bx * bx + by * by + cx * cx + cy * cy) ** 2;\n}\n\nclass Triangulation {\n readonly tris: number[] = [];\n /** Directed edge `a→b` to the triangle having it, counter-clockwise. */\n private readonly owner = new Map<number, number>();\n private readonly free: number[] = [];\n /** The triangle made last, where the next point's search starts. */\n private last = 0;\n\n constructor(private readonly V: number[], private readonly stride: number) {}\n\n private key(a: number, b: number): number { return a * this.stride + b; }\n\n add(a: number, b: number, c: number): number {\n const t = this.free.pop() ?? this.tris.length / 3;\n this.last = t;\n this.tris[3 * t] = a; this.tris[3 * t + 1] = b; this.tris[3 * t + 2] = c;\n this.owner.set(this.key(a, b), t); this.owner.set(this.key(b, c), t); this.owner.set(this.key(c, a), t);\n return t;\n }\n\n remove(t: number): void {\n const [a, b, c] = this.corners(t);\n for (const [u, v] of [[a, b], [b, c], [c, a]]) if (this.owner.get(this.key(u, v)) === t) this.owner.delete(this.key(u, v));\n this.tris[3 * t] = -1;\n this.free.push(t);\n }\n\n corners(t: number): [number, number, number] {\n return [this.tris[3 * t], this.tris[3 * t + 1], this.tris[3 * t + 2]];\n }\n\n /** The triangle across edge `a→b` and its corner off that edge, if any. */\n across(a: number, b: number): { t: number; c: number } | null {\n const t = this.owner.get(this.key(b, a));\n if (t === undefined) return null;\n const [x, y, z] = this.corners(t);\n return { t, c: x !== a && x !== b ? x : y !== a && y !== b ? y : z };\n }\n\n /** Flip edge `a→b` of the triangle `(a, b, p)` while the triangle across it disagrees. */\n legalize(a: number, b: number, p: number): void {\n const stack: [number, number, number][] = [[a, b, p]];\n while (stack.length > 0) {\n const [u, v, w] = stack.pop()!;\n const mine = this.owner.get(this.key(u, v));\n const other = this.across(u, v);\n if (mine === undefined || !other || !inCircle(this.V, u, v, w, other.c)) continue;\n const q = other.c;\n if (orient(this.V, u, q, w) <= 0 || orient(this.V, q, v, w) <= 0) continue;\n this.remove(mine);\n this.remove(other.t);\n this.add(u, q, w);\n this.add(q, v, w);\n stack.push([u, q, w], [q, v, w]);\n }\n }\n\n /** Whether triangle `t` holds `p`, and on which edge if on one: -1 outside, 3 strictly inside. */\n private holds(t: number, p: number): number {\n const V = this.V;\n const [a, b, c] = this.corners(t);\n const area = orient(V, a, b, c);\n const ws = [orient(V, b, c, p), orient(V, c, a, p), orient(V, a, b, p)];\n if (ws.some((w) => w < -1e-9 * area)) return -1;\n const flat = ws.findIndex((w) => w <= 1e-9 * area);\n return flat < 0 ? 3 : flat;\n }\n\n /** The triangle holding `p`: walked to from `from` across the edges `p` lies beyond, or\n * found by a scan when the walk leaves the region. */\n private locate(p: number, from: number): { t: number; on: number } | null {\n let t = from;\n for (let step = 0; t >= 0 && this.tris[3 * t] >= 0 && step < this.tris.length; step++) {\n const on = this.holds(t, p);\n if (on >= 0) return { t, on };\n const [a, b, c] = this.corners(t);\n const edge = [[b, c], [c, a], [a, b]].find(([u, v]) => orient(this.V, u, v, p) < 0)!;\n t = this.across(edge[0], edge[1])?.t ?? -1;\n }\n for (let s = 0; s < this.tris.length / 3; s++) {\n if (this.tris[3 * s] < 0) continue;\n const on = this.holds(s, p);\n if (on >= 0) return { t: s, on };\n }\n return null;\n }\n\n /** Split the triangle holding `p` (or the two sharing the edge it lies on). False when none holds it. */\n insert(p: number): boolean {\n const found = this.locate(p, this.last);\n if (!found) return false;\n const { t } = found;\n const [a, b, c] = this.corners(t);\n const flat = found.on === 3 ? -1 : found.on;\n if (flat < 0) {\n this.remove(t);\n this.add(a, b, p); this.add(b, c, p); this.add(c, a, p);\n this.legalize(a, b, p); this.legalize(b, c, p); this.legalize(c, a, p);\n return true;\n }\n // On edge u→v of this triangle, opposite corner w.\n const [u, v, w] = [[b, c, a], [c, a, b], [a, b, c]][flat];\n const other = this.across(u, v);\n this.remove(t);\n this.add(v, w, p); this.add(w, u, p);\n const rim: [number, number][] = [[v, w], [w, u]];\n if (other) {\n this.remove(other.t);\n this.add(u, other.c, p); this.add(other.c, v, p);\n rim.push([u, other.c], [other.c, v]);\n }\n for (const [x, y] of rim) this.legalize(x, y, p);\n return true;\n }\n}\n\n/**\n * `triangles` over `coords`, with the points from vertex `firstInner` on\n * inserted inside it and every triangle flipped toward Delaunay. A point no\n * triangle holds is left out of the mesh. Returns the new triangles.\n */\nexport function refineTriangulation(coords: number[], triangles: ArrayLike<number>, firstInner: number): number[] {\n const n = coords.length / 2;\n const mesh = new Triangulation(coords, n);\n for (let i = 0; i + 2 < triangles.length; i += 3) {\n const [a, b, c] = [triangles[i], triangles[i + 1], triangles[i + 2]];\n const o = orient(coords, a, b, c);\n if (o > 0) mesh.add(a, b, c);\n else if (o < 0) mesh.add(a, c, b);\n }\n const live = () => Array.from({ length: mesh.tris.length / 3 }, (_, t) => t).filter((t) => mesh.tris[3 * t] >= 0);\n for (const t of live()) {\n if (mesh.tris[3 * t] < 0) continue;\n const [a, b, c] = mesh.corners(t);\n mesh.legalize(a, b, c); mesh.legalize(b, c, a); mesh.legalize(c, a, b);\n }\n for (let p = firstInner; p < n; p++) mesh.insert(p);\n return live().flatMap((t) => mesh.corners(t));\n}\n","/**\n * The mesh a puppet warp deforms: the path's filled region triangulated with\n * its outline as the triangles' edges, so two parts of the shape share a\n * triangle only where the fill joins them. Interior points on an even lattice\n * keep the triangles near equilateral, and each pin gets a vertex of its own.\n */\nimport earcut from 'earcut';\nimport type { PolygonPath } from '../path';\nimport type { Point } from '../paths/cubicMath';\nimport { boundsOfPath } from '../paths/bounds';\nimport { pointInPolygon } from '../polyline';\nimport { flattenPolygon } from '../tessellate/tessellate';\nimport { resolveCrossings, type FlattenedContours } from '../tessellate/crossings';\nimport { nestRings } from '../tessellate/nesting';\nimport type { ArapMesh } from './arap';\nimport { refineTriangulation } from './refine';\n\n/** A puppet's mesh, and the vertex standing for each pin. */\nexport interface PuppetMesh extends ArapMesh {\n pinVertex: Int32Array;\n}\n\n/** Options for {@link puppetMesh}. */\nexport interface PuppetMeshOptions {\n /** Roughly how many vertices to spread over the region. Default 400. */\n vertices?: number;\n}\n\ninterface MeshPoint {\n x: number;\n y: number;\n pins: number[];\n}\n\n/** One filled piece: its outline, its holes, and the points inside it. */\ninterface Region {\n rings: MeshPoint[][];\n inner: MeshPoint[];\n}\n\nfunction ringsOf(path: PolygonPath, tolerance: number): { flat: FlattenedContours; filled: (w: number) => boolean } {\n const flat = flattenPolygon(path, tolerance);\n if (path.fillRule === 'evenodd') return { flat, filled: (w) => w % 2 !== 0 };\n const crossed = resolveCrossings(flat);\n const nonzero = (w: number) => w !== 0;\n if (crossed) return { flat: crossed, filled: nonzero };\n const simple = nestRings(flat).every((r) => Math.abs(r.winding) <= 1);\n return { flat: simple ? flat : resolveCrossings(flat, true)!, filled: nonzero };\n}\n\n/** The ring from vertex `start` to `end` of `coords`, with no edge longer than `h`. */\nfunction resample(coords: number[], start: number, end: number, h: number): MeshPoint[] {\n const out: MeshPoint[] = [];\n for (let i = start; i < end; i++) {\n const j = i + 1 === end ? start : i + 1;\n const ax = coords[2 * i], ay = coords[2 * i + 1];\n const steps = Math.max(1, Math.ceil(Math.hypot(coords[2 * j] - ax, coords[2 * j + 1] - ay) / h));\n for (let k = 0; k < steps; k++) {\n const t = k / steps;\n out.push({ x: ax + (coords[2 * j] - ax) * t, y: ay + (coords[2 * j + 1] - ay) * t, pins: [] });\n }\n }\n return out.filter((p, i) => {\n const q = out[(i + 1) % out.length];\n return out.length < 2 || p.x !== q.x || p.y !== q.y;\n });\n}\n\nfunction regionsOf(path: PolygonPath, tolerance: number, h: number): { regions: Region[]; area: number } {\n const { flat, filled } = ringsOf(path, tolerance);\n const rings = nestRings(flat);\n const regions = new Map<number, Region>();\n let area = 0;\n rings.forEach((r, i) => {\n if (r.area === 0 || !filled(r.winding)) return;\n if (r.parent >= 0 && filled(rings[r.parent].winding)) return;\n regions.set(i, { rings: [resample(flat.coords, r.start, r.end, h)], inner: [] });\n area += Math.abs(r.area);\n });\n rings.forEach((r) => {\n const outer = r.area !== 0 && !filled(r.winding) ? regions.get(r.parent) : undefined;\n if (!outer) return;\n outer.rings.push(resample(flat.coords, r.start, r.end, h));\n area -= Math.abs(r.area);\n });\n return { regions: [...regions.values()], area };\n}\n\nconst flatRing = (ring: MeshPoint[]) => ring.flatMap((p) => [p.x, p.y]);\n\nfunction inside(region: Region, x: number, y: number, flats = region.rings.map(flatRing)): boolean {\n return flats.every((ring, i) => pointInPolygon(ring, x, y) === (i === 0));\n}\n\n/** The nearest point on any ring of `region` to `(x, y)`. */\nfunction nearestEdge(region: Region, x: number, y: number): { d: number; ring: number; edge: number; t: number } {\n let best = { d: Infinity, ring: 0, edge: 0, t: 0 };\n region.rings.forEach((ring, r) => ring.forEach((a, i) => {\n const b = ring[(i + 1) % ring.length];\n const dx = b.x - a.x, dy = b.y - a.y;\n const len2 = dx * dx + dy * dy;\n const t = len2 > 0 ? Math.max(0, Math.min(1, ((x - a.x) * dx + (y - a.y) * dy) / len2)) : 0;\n const d = Math.hypot(a.x + dx * t - x, a.y + dy * t - y);\n if (d < best.d) best = { d, ring: r, edge: i, t };\n }));\n return best;\n}\n\n/** Give pin `k` a vertex: on the outline where it is on or outside it, inside where it is inside. */\nfunction placePin(regions: Region[], pin: Point, k: number, h: number): void {\n const home = regions.find((r) => inside(r, pin.x, pin.y));\n const near = (home ? [home] : regions)\n .map((region) => ({ region, ...nearestEdge(region, pin.x, pin.y) }))\n .reduce((a, b) => (b.d < a.d ? b : a));\n const snap = 0.25 * h;\n if (home && near.d > snap) {\n const same = home.inner.find((p) => Math.hypot(p.x - pin.x, p.y - pin.y) < 1e-9 * h);\n if (same) same.pins.push(k);\n else home.inner.push({ x: pin.x, y: pin.y, pins: [k] });\n return;\n }\n const ring = near.region.rings[near.ring];\n const a = ring[near.edge], b = ring[(near.edge + 1) % ring.length];\n const at = { x: a.x + (b.x - a.x) * near.t, y: a.y + (b.y - a.y) * near.t };\n const da = Math.hypot(at.x - a.x, at.y - a.y), db = Math.hypot(at.x - b.x, at.y - b.y);\n if (Math.min(da, db) <= snap) (da <= db ? a : b).pins.push(k);\n else ring.splice(near.edge + 1, 0, { ...at, pins: [k] });\n}\n\n/** Whether any edge of `rings` passes within `r` of a point, through a grid of cells `r` wide. */\nfunction clearanceTest(rings: MeshPoint[][], r: number): (x: number, y: number) => boolean {\n const cells = new Map<string, [MeshPoint, MeshPoint][]>();\n const key = (i: number, j: number) => `${i},${j}`;\n for (const ring of rings) {\n ring.forEach((a, n) => {\n const b = ring[(n + 1) % ring.length];\n for (let i = Math.floor(Math.min(a.x, b.x) / r); i <= Math.floor(Math.max(a.x, b.x) / r); i++) {\n for (let j = Math.floor(Math.min(a.y, b.y) / r); j <= Math.floor(Math.max(a.y, b.y) / r); j++) {\n const k = key(i, j);\n const list = cells.get(k);\n if (list) list.push([a, b]);\n else cells.set(k, [[a, b]]);\n }\n }\n });\n }\n return (x, y) => {\n const ci = Math.floor(x / r), cj = Math.floor(y / r);\n for (let i = ci - 1; i <= ci + 1; i++) {\n for (let j = cj - 1; j <= cj + 1; j++) {\n for (const [a, b] of cells.get(key(i, j)) ?? []) {\n const dx = b.x - a.x, dy = b.y - a.y;\n const len2 = dx * dx + dy * dy;\n const t = len2 > 0 ? Math.max(0, Math.min(1, ((x - a.x) * dx + (y - a.y) * dy) / len2)) : 0;\n if (Math.hypot(a.x + dx * t - x, a.y + dy * t - y) < r) return true;\n }\n }\n }\n return false;\n };\n}\n\n/** Where the horizontal line at `y` crosses any of `rings`, sorted; a point on it is inside where an odd count lie left of it. */\nfunction crossingsAt(rings: MeshPoint[][], y: number): number[] {\n const xs: number[] = [];\n for (const ring of rings) {\n ring.forEach((a, n) => {\n const b = ring[(n + 1) % ring.length];\n if ((a.y > y) !== (b.y > y)) xs.push(a.x + ((y - a.y) * (b.x - a.x)) / (b.y - a.y));\n });\n }\n return xs.sort((p, q) => p - q);\n}\n\n/** Points of a triangular lattice of spacing `h` inside `region`, clear of its outline and its pins. */\nfunction fillLattice(region: Region, h: number): void {\n const outer = region.rings[0];\n let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n for (const p of outer) { x0 = Math.min(x0, p.x); y0 = Math.min(y0, p.y); x1 = Math.max(x1, p.x); y1 = Math.max(y1, p.y); }\n const pins = [...region.inner];\n const nearOutline = clearanceTest(region.rings, 0.5 * h);\n const rowH = h * Math.sqrt(3) / 2;\n for (let row = 0, y = y0 + rowH / 2; y < y1; row++, y += rowH) {\n const xs = crossingsAt(region.rings, y);\n let left = 0;\n for (let x = x0 + (row % 2 ? h / 2 : h / 4); x < x1; x += h) {\n while (left < xs.length && xs[left] < x) left++;\n if (left % 2 === 0 || nearOutline(x, y)) continue;\n if (pins.some((p) => Math.hypot(p.x - x, p.y - y) < 0.5 * h)) continue;\n region.inner.push({ x, y, pins: [] });\n }\n }\n}\n\n/**\n * The mesh a puppet with pins at `pins` deforms over `path`'s fill. A pin\n * inside the fill gets a vertex where it is; one on the outline, or off the\n * shape, gets the nearest point of the outline. Pins on one spot share a vertex.\n */\nexport function puppetMesh(path: PolygonPath, pins: readonly Point[], opts: PuppetMeshOptions = {}): PuppetMesh {\n const box = boundsOfPath(path);\n const size = Math.max(box.width, box.height);\n const empty = { vertices: new Float64Array(0), triangles: new Uint32Array(0), pinVertex: new Int32Array(pins.length).fill(-1) };\n if (!(size > 0)) return empty;\n const tolerance = size / 1000;\n const rough = regionsOf(path, tolerance, size);\n const h = Math.max(Math.sqrt(Math.max(rough.area, 0) / (opts.vertices ?? 400)), size / 400);\n const { regions } = regionsOf(path, tolerance, h);\n if (regions.length === 0) return empty;\n pins.forEach((p, k) => placePin(regions, p, k, h));\n const vertices: number[] = [];\n const triangles: number[] = [];\n const pinVertex = new Int32Array(pins.length).fill(-1);\n for (const region of regions) {\n fillLattice(region, h);\n const points = [...region.rings.flat(), ...region.inner];\n const holes: number[] = [];\n let at = 0;\n for (const ring of region.rings) { if (at > 0) holes.push(at); at += ring.length; }\n const offset = vertices.length / 2;\n const coords = points.flatMap((p) => [p.x, p.y]);\n const outline = earcut(coords.slice(0, 2 * at), holes.length > 0 ? holes : undefined);\n for (const t of refineTriangulation(coords, outline, at)) triangles.push(t + offset);\n points.forEach((p, i) => { for (const k of p.pins) pinVertex[k] = offset + i; });\n vertices.push(...coords);\n }\n return { vertices: Float64Array.from(vertices), triangles: Uint32Array.from(triangles), pinVertex };\n}\n","/**\n * Puppet deformation: pins placed on a shape and dragged, with everything\n * between them moved as rigidly as the pins allow. The shape's fill is\n * triangulated (`puppetMesh`) and deformed as-rigid-as-possible (`arap`), so\n * the pull of a pin travels through the shape: two limbs that nearly touch\n * share no triangle and move apart. A point is carried by a smooth\n * (Clough–Tocher) interpolation of the deformed mesh, so a bend has no kink\n * where two triangles meet.\n */\nimport type { PolygonPath } from '../path';\nimport type { Point } from '../paths/cubicMath';\nimport { createArapSolver, type ArapSolveOptions, type ArapSolver } from './arap';\nimport { cloughTocherMap, restFrames, type RestFrames } from './cloughTocher';\nimport { meshLocator, type MeshSpot } from './meshMap';\nimport { puppetMesh, type PuppetMesh } from './puppetMesh';\n\n/** A pin: where it was placed on the unwarped shape, and where it is now. */\nexport interface PuppetPin {\n from: Point;\n to: Point;\n}\n\n/** What a pin set costs to set up once: the mesh, its factored solve, and its point lookup. */\ninterface Rig {\n key: string;\n mesh: PuppetMesh;\n frames: RestFrames;\n solver: ArapSolver;\n locate: (x: number, y: number) => MeshSpot | null;\n spots: Map<number, Map<number, MeshSpot | null>>;\n remembered: number;\n}\n\nconst rigs = new WeakMap<PolygonPath, Rig>();\n\nfunction rigFor(source: PolygonPath, pins: readonly PuppetPin[]): Rig {\n const key = pins.map((p) => `${p.from.x},${p.from.y}`).join(';');\n const held = rigs.get(source);\n if (held?.key === key) return held;\n const mesh = puppetMesh(source, pins.map((p) => p.from));\n const pinned = [...new Set(Array.from(mesh.pinVertex).filter((v) => v >= 0))];\n const rig: Rig = { key, mesh, frames: restFrames(mesh), solver: createArapSolver(mesh, pinned), locate: meshLocator(mesh), spots: new Map(), remembered: 0 };\n rigs.set(source, rig);\n return rig;\n}\n\n/**\n * The map `pins` make of `source`'s fill: smooth across the deformed mesh,\n * through every pin, and carried on past the outline for a point off the\n * shape. The mesh and its solve are set up once per source and pin set, so\n * moving pins only re-solves. No pins, or none moved, is the identity, and\n * one pin moves the whole shape with it.\n */\nexport function puppetMap(source: PolygonPath, pins: readonly PuppetPin[]): (p: Point) => Point {\n if (pins.every((p) => p.to.x === p.from.x && p.to.y === p.from.y)) return (p) => ({ x: p.x, y: p.y });\n const rig = rigFor(source, pins);\n const at = solveRig(rig, pins);\n if (!at) {\n const dx = pins[0].to.x - pins[0].from.x, dy = pins[0].to.y - pins[0].from.y;\n return (p) => ({ x: p.x + dx, y: p.y + dy });\n }\n const place = cloughTocherMap(rig.mesh, rig.frames, at);\n return (p) => {\n const spot = spotOf(rig, p);\n return spot ? place(spot) : { x: p.x, y: p.y };\n };\n}\n\n/** The rig's vertices under `pins`, or null when no pin landed on the mesh. */\nfunction solveRig(rig: Rig, pins: readonly PuppetPin[], opts?: ArapSolveOptions): Float64Array | null {\n const targets: number[] = [];\n const seen = new Set<number>();\n pins.forEach((pin, k) => {\n const v = rig.mesh.pinVertex[k];\n if (v < 0 || seen.has(v)) return;\n seen.add(v);\n // A pin off the outline holds the outline point it snapped to, carried by its own drag.\n targets.push(pin.to.x + rig.mesh.vertices[2 * v] - pin.from.x, pin.to.y + rig.mesh.vertices[2 * v + 1] - pin.from.y);\n });\n return targets.length === 0 ? null : rig.solver.solve(targets, opts);\n}\n\n/**\n * The mesh `puppetMap` deforms for `pins` and where its vertices land, solved\n * with `opts` — its `trace` reports every stage of the solve, and its round\n * caps bound it. With the default options the vertices are the ones\n * `puppetMap` places points by. Null with no pins, or when none landed on the\n * mesh (then `puppetMap` moves the shape with the first pin).\n */\nexport function puppetSolve(\n source: PolygonPath,\n pins: readonly PuppetPin[],\n opts?: ArapSolveOptions,\n): { mesh: PuppetMesh; vertices: Float64Array } | null {\n if (pins.length === 0) return null;\n const rig = rigFor(source, pins);\n const vertices = solveRig(rig, pins, opts);\n return vertices ? { mesh: rig.mesh, vertices } : null;\n}\n\n/** How many points a rig remembers the spot of before starting over. */\nconst SPOT_CAP = 1 << 16;\n\n/** Where `p` sits in the rig's mesh. A drag maps the same samples of the path\n * every frame, so each is looked up once per pin set. */\nfunction spotOf(rig: Rig, p: Point): MeshSpot | null {\n let row = rig.spots.get(p.x);\n const hit = row?.get(p.y);\n if (hit !== undefined) return hit;\n const spot = rig.locate(p.x, p.y);\n if (++rig.remembered > SPOT_CAP) { rig.spots.clear(); rig.remembered = 1; row = undefined; }\n if (!row) { row = new Map(); rig.spots.set(p.x, row); }\n row.set(p.y, spot);\n return spot;\n}\n\n/**\n * The point `map` sends to `target`, found by stepping from `guess` by the\n * miss until it is within `tolerance` — for a map that stays close to rigid,\n * as a puppet's does, a few steps suffice. Returns the best point found.\n */\nexport function unwarpPoint(\n map: (p: Point) => Point,\n target: Point,\n guess: Point = target,\n tolerance = 1e-3,\n): Point {\n let p = { x: guess.x, y: guess.y };\n for (let k = 0; k < 50; k++) {\n const at = map(p);\n const ex = target.x - at.x, ey = target.y - at.y;\n if (Math.hypot(ex, ey) <= tolerance) break;\n p = { x: p.x + ex, y: p.y + ey };\n }\n return p;\n}\n","import type { PolygonPath } from '../path';\nimport { anchorsToPath, pathToAnchors, type PenAnchor } from '../paths/anchors';\nimport { cubicPointAt, type Point } from '../paths/cubicMath';\nimport { fitPointRun, keepCorner } from '../paths/fitRun';\n\n/** Options for {@link warpPath}. */\nexport interface WarpPathOptions {\n /** How far, in output units, the refitted curves may stray from the warped\n * original. Default 0.5. */\n tolerance?: number;\n}\n\nconst MIN_SAMPLES = 8;\nconst MAX_SAMPLES = 64;\n/** How far along a segment, as a curve parameter, its end tangent is read. */\nconst TANGENT_STEP = 1e-3;\n\n/**\n * `path` carried through `map`, point by point, and refitted as cubics within\n * `tolerance` of the warped curve. Every anchor stays an anchor, at the point\n * it maps to, so the result edits like the original; a segment the map keeps\n * straight stays a straight segment, and one it bends gains anchors only where\n * one cubic cannot follow it. Fill rules carry over.\n */\nexport function warpPath(\n path: PolygonPath,\n map: (p: Point) => Point,\n opts: WarpPathOptions = {},\n): PolygonPath {\n const tol = Math.max(opts.tolerance ?? 0.5, 1e-6);\n const { anchors, closed } = pathToAnchors(path);\n const out: PenAnchor[][] = anchors.map((sub, s) => warpSubpath(sub, closed[s], map, tol));\n return anchorsToPath(out, closed, path);\n}\n\nfunction warpSubpath(sub: PenAnchor[], closed: boolean, map: (p: Point) => Point, tol: number): PenAnchor[] {\n const n = sub.length;\n if (n === 0) return [];\n const out: PenAnchor[] = [];\n const segments = closed && n > 1 ? n : n - 1;\n if (segments === 0) return [map(sub[0])];\n for (let i = 0; i < segments; i++) {\n const a = sub[i];\n const b = sub[(i + 1) % n];\n const at = segmentAt(a, b);\n const count = sampleCount(a, b, tol);\n const pts: Point[] = [];\n for (let k = 0; k <= count; k++) pts.push(map(at(k / count)));\n const start = pts[0];\n const end = pts[pts.length - 1];\n const tStart = unit(sub2(map(at(TANGENT_STEP)), start));\n const tEnd = unit(sub2(map(at(1 - TANGENT_STEP)), end));\n const run = dedupe(pts);\n const closing = closed && i === segments - 1;\n if (run.length < 2) {\n if (out.length === 0) out.push({ x: start.x, y: start.y });\n if (!closing) { out.push({ x: end.x, y: end.y }); keepCorner(out[out.length - 1], b); }\n continue;\n }\n fitPointRun(run, tStart, tEnd, tol, out, closing);\n if (!closing) keepCorner(out[out.length - 1], b);\n }\n keepCorner(out[0], sub[0]);\n return out;\n}\n\n/** The segment from `a` to `b` as a function of its curve parameter. */\nfunction segmentAt(a: PenAnchor, b: PenAnchor): (t: number) => Point {\n if (!a.outHandle && !b.inHandle) return (t) => ({ x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t });\n const c1 = a.outHandle ?? a;\n const c2 = b.inHandle ?? b;\n return (t) => cubicPointAt(a, c1, c2, b, t);\n}\n\n/** Samples enough to resolve a bend on the scale of the tolerance, within bounds. */\nfunction sampleCount(a: PenAnchor, b: PenAnchor, tol: number): number {\n const c1 = a.outHandle ?? a;\n const c2 = b.inHandle ?? b;\n const len = Math.hypot(c1.x - a.x, c1.y - a.y) + Math.hypot(c2.x - c1.x, c2.y - c1.y) + Math.hypot(b.x - c2.x, b.y - c2.y);\n return Math.min(MAX_SAMPLES, Math.max(MIN_SAMPLES, Math.ceil(len / (8 * tol))));\n}\n\nfunction dedupe(pts: Point[]): Point[] {\n return pts.filter((p, i) => i === 0 || p.x !== pts[i - 1].x || p.y !== pts[i - 1].y);\n}\n\nconst sub2 = (p: Point, q: Point): Point => ({ x: p.x - q.x, y: p.y - q.y });\nfunction unit(p: Point): Point {\n const len = Math.hypot(p.x, p.y);\n return len === 0 ? { x: 0, y: 0 } : { x: p.x / len, y: p.y / len };\n}\n","/**\n * A warp as data: what a shape was warped by, held beside the shape so the\n * warp can be edited again later. Each kind names its controls in the same\n * space as the path it warps.\n */\nimport type { PolygonPath } from '../path';\nimport type { Point } from '../paths/cubicMath';\nimport { meshGridFrom, meshGridOver, bicubicMesh, coonsMesh, type MeshGrid } from './mesh';\nimport { puppetMap, type PuppetPin } from './puppet';\nimport { bilinearQuad, projectiveQuad, type Quad, type UvMap } from './quad';\nimport { warpPath } from './warpPath';\n\n/** An axis-aligned box: the area a distort or an envelope was laid over. */\nexport interface WarpBox {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** How a distort maps its box onto its corners. `free` is bilinear, and bends\n * straight lines; `perspective` is projective, and keeps them straight. */\nexport type DistortMode = 'free' | 'perspective';\n\n/** How an envelope interpolates its mesh. See `bicubicMesh` and `coonsMesh`. */\nexport type EnvelopeMapping = 'bicubic' | 'coons';\n\n/** The box's four corners, each dragged on its own. */\nexport interface DistortWarp {\n kind: 'distort';\n mode: DistortMode;\n box: WarpBox;\n /** Where the box's top-left, top-right, bottom-right and bottom-left went. */\n corners: Quad;\n}\n\n/** A grid of control points laid over the box. */\nexport interface EnvelopeWarp {\n kind: 'envelope';\n mapping: EnvelopeMapping;\n box: WarpBox;\n mesh: MeshGrid;\n}\n\n/** Pins on the shape, each dragged on its own. */\nexport interface PuppetWarp {\n kind: 'puppet';\n pins: readonly PuppetPin[];\n}\n\n/** Any of the warps a path can hold. */\nexport type PathWarp = DistortWarp | EnvelopeWarp | PuppetWarp;\n\n/** A distort over `box` that leaves it where it is. */\nexport function distortOver(box: WarpBox, mode: DistortMode = 'free'): DistortWarp {\n const { x, y, width: w, height: h } = box;\n return {\n kind: 'distort',\n mode,\n box: { ...box },\n corners: [{ x, y }, { x: x + w, y }, { x: x + w, y: y + h }, { x, y: y + h }],\n };\n}\n\n/** An envelope of `rows` × `cols` patches over `box` that leaves it where it is. */\nexport function envelopeOver(\n box: WarpBox,\n rows: number,\n cols: number,\n mapping: EnvelopeMapping = 'bicubic',\n): EnvelopeWarp {\n return { kind: 'envelope', mapping, box: { ...box }, mesh: meshGridOver(box, rows, cols) };\n}\n\n/** `warp` with a mesh of `rows` × `cols` patches, placed where the current\n * mesh carries an even grid, so the shape changes as little as a coarser or\n * finer grid allows. */\nexport function resizeEnvelope(warp: EnvelopeWarp, rows: number, cols: number): EnvelopeWarp {\n if (warp.mesh.rows === rows && warp.mesh.cols === cols) return warp;\n return { ...warp, mesh: meshGridFrom(envelopeUvMap(warp), rows, cols) };\n}\n\nfunction envelopeUvMap(warp: EnvelopeWarp): UvMap {\n return warp.mapping === 'coons' ? coonsMesh(warp.mesh) : bicubicMesh(warp.mesh);\n}\n\nfunction boxUv(box: WarpBox, uv: UvMap): (p: Point) => Point {\n const sx = box.width === 0 ? 0 : 1 / box.width;\n const sy = box.height === 0 ? 0 : 1 / box.height;\n return (p) => uv((p.x - box.x) * sx, (p.y - box.y) * sy);\n}\n\n/**\n * Where `warp`, laid over `source`, sends each point of the plane. A\n * perspective distort whose corners no longer make a convex quad has no\n * projective map, and falls back to the bilinear one until they do. Only a\n * puppet reads `source`: its pins pull through the shape's fill.\n */\nexport function pathWarpMap(warp: PathWarp, source: PolygonPath): (p: Point) => Point {\n switch (warp.kind) {\n case 'distort': {\n const uv = (warp.mode === 'perspective' ? projectiveQuad(warp.corners) : null) ?? bilinearQuad(warp.corners);\n return boxUv(warp.box, uv);\n }\n case 'envelope':\n return boxUv(warp.box, envelopeUvMap(warp));\n case 'puppet':\n return puppetMap(source, warp.pins);\n }\n}\n\n/** `source` warped by `warp`, refitted within `tolerance` (`warpPath`). */\nexport function applyPathWarp(source: PolygonPath, warp: PathWarp, tolerance = 0.5): PolygonPath {\n return warpPath(source, pathWarpMap(warp, source), { tolerance });\n}\n\n/** The points a user drags to change `warp`: a distort's corners, an\n * envelope's mesh points, a puppet's pins where they are now. */\nexport function warpControls(warp: PathWarp): readonly Point[] {\n switch (warp.kind) {\n case 'distort': return warp.corners;\n case 'envelope': return warp.mesh.points;\n case 'puppet': return warp.pins.map((p) => p.to);\n }\n}\n\n/** `warp` with control `index` (as {@link warpControls} counts them) at `to`. */\nexport function moveWarpControl(warp: PathWarp, index: number, to: Point): PathWarp {\n const at = { x: to.x, y: to.y };\n switch (warp.kind) {\n case 'distort': {\n const corners = [...warp.corners] as [Point, Point, Point, Point];\n if (index < 0 || index > 3) return warp;\n corners[index] = at;\n return { ...warp, corners };\n }\n case 'envelope': {\n if (index < 0 || index >= warp.mesh.points.length) return warp;\n const points = [...warp.mesh.points];\n points[index] = at;\n return { ...warp, mesh: { ...warp.mesh, points } };\n }\n case 'puppet': {\n if (index < 0 || index >= warp.pins.length) return warp;\n return { ...warp, pins: warp.pins.map((p, i) => (i === index ? { from: p.from, to: at } : p)) };\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/warp/quad.ts","../../src/warp/mesh.ts","../../src/warp/profileCholesky.ts","../../src/warp/arapSystem.ts","../../src/warp/lbfgs.ts","../../src/warp/injective.ts","../../src/warp/arapPiece.ts","../../src/warp/arap.ts","../../src/warp/cloughTocher.ts","../../src/warp/meshMap.ts","../../src/warp/refine.ts","../../src/warp/puppetMesh.ts","../../src/warp/puppet.ts","../../src/warp/warpPath.ts","../../src/warp/pathWarp.ts"],"names":["dot","restFrames","x","y","a","b"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Maps from the unit square onto a quadrilateral: what a box becomes when its\n * four corners are dragged apart independently.\n */\nimport type { Point } from '../paths/cubicMath';\n\n/** Four corners, in the order the unit square's land on them: (0,0), (1,0),\n * (1,1), (0,1) — a box's top-left, top-right, bottom-right, bottom-left. */\nexport type Quad = readonly [Point, Point, Point, Point];\n\n/** A map from unit-square coordinates to the plane. */\nexport type UvMap = (u: number, v: number) => Point;\n\n/**\n * The bilinear map onto `q`: each corner weighted by its share of the square.\n * Lines of constant `u` or `v` stay straight; any other line bends.\n */\nexport function bilinearQuad(q: Quad): UvMap {\n const [a, b, c, d] = q;\n return (u, v) => {\n const w00 = (1 - u) * (1 - v);\n const w10 = u * (1 - v);\n const w11 = u * v;\n const w01 = (1 - u) * v;\n return {\n x: w00 * a.x + w10 * b.x + w11 * c.x + w01 * d.x,\n y: w00 * a.y + w10 * b.y + w11 * c.y + w01 * d.y,\n };\n };\n}\n\n/**\n * The projective map taking the unit square onto `q`, as `[a, b, c, d, e, f,\n * g, h]`: `x = (a·u + b·v + c) / w` and `y = (d·u + e·v + f) / w`, where\n * `w = g·u + h·v + 1`. Null when `q` is not strictly convex, since no\n * projective map then sends the square's inside onto the quad's.\n */\nexport function squareToQuadHomography(q: Quad): readonly number[] | null {\n if (!isConvex(q)) return null;\n const [p0, p1, p2, p3] = q;\n const sx = p0.x - p1.x + p2.x - p3.x;\n const sy = p0.y - p1.y + p2.y - p3.y;\n const dx1 = p1.x - p2.x;\n const dx2 = p3.x - p2.x;\n const dy1 = p1.y - p2.y;\n const dy2 = p3.y - p2.y;\n const den = dx1 * dy2 - dx2 * dy1;\n if (den === 0) return null;\n const g = (sx * dy2 - dx2 * sy) / den;\n const h = (dx1 * sy - sx * dy1) / den;\n return [\n p1.x - p0.x + g * p1.x, p3.x - p0.x + h * p3.x, p0.x,\n p1.y - p0.y + g * p1.y, p3.y - p0.y + h * p3.y, p0.y,\n g, h,\n ];\n}\n\n/**\n * The projective map onto `q`: straight lines stay straight, and the box's far\n * side foreshortens the way a plane seen at an angle does. Null where\n * {@link squareToQuadHomography} is.\n */\nexport function projectiveQuad(q: Quad): UvMap | null {\n const m = squareToQuadHomography(q);\n if (!m) return null;\n const [a, b, c, d, e, f, g, h] = m;\n return (u, v) => {\n const w = g * u + h * v + 1;\n return { x: (a * u + b * v + c) / w, y: (d * u + e * v + f) / w };\n };\n}\n\n/** Whether every turn around `q` goes the same way, none of them straight. */\nfunction isConvex(q: Quad): boolean {\n let sign = 0;\n for (let i = 0; i < 4; i++) {\n const a = q[i];\n const b = q[(i + 1) % 4];\n const c = q[(i + 2) % 4];\n const cross = (b.x - a.x) * (c.y - b.y) - (b.y - a.y) * (c.x - b.x);\n if (cross === 0) return false;\n if (sign === 0) sign = Math.sign(cross);\n else if (Math.sign(cross) !== sign) return false;\n }\n return true;\n}\n","/**\n * Maps from the unit square through a grid of control points: an envelope\n * mesh. The grid's points are interpolated, so a grid laid evenly over a box\n * maps the box onto itself.\n */\nimport type { Point } from '../paths/cubicMath';\nimport type { UvMap } from './quad';\n\n/** A grid of `rows` × `cols` patches: `(rows + 1) × (cols + 1)` points, row by\n * row from the top. */\nexport interface MeshGrid {\n rows: number;\n cols: number;\n points: readonly Point[];\n}\n\n/** An even grid of `rows` × `cols` patches over the box. */\nexport function meshGridOver(\n box: { x: number; y: number; width: number; height: number },\n rows: number,\n cols: number,\n): MeshGrid {\n return meshGridFrom((u, v) => ({ x: box.x + u * box.width, y: box.y + v * box.height }), rows, cols);\n}\n\n/** A grid of `rows` × `cols` patches whose points are where `map` sends an\n * even grid over the unit square — a mesh resampled at a new resolution. */\nexport function meshGridFrom(map: UvMap, rows: number, cols: number): MeshGrid {\n const r = Math.max(1, Math.round(rows));\n const c = Math.max(1, Math.round(cols));\n const points: Point[] = [];\n for (let i = 0; i <= r; i++) {\n for (let j = 0; j <= c; j++) points.push(map(j / c, i / r));\n }\n return { rows: r, cols: c, points };\n}\n\n/** The grid point at row `i`, column `j`, extended past the edges along the\n * line through the last two, so the spline through the edge runs straight. */\nfunction gridPoint(grid: MeshGrid, i: number, j: number): Point {\n if (i < 0) return extend(gridPoint(grid, 0, j), gridPoint(grid, 1, j));\n if (i > grid.rows) return extend(gridPoint(grid, grid.rows, j), gridPoint(grid, grid.rows - 1, j));\n if (j < 0) return extend(gridPoint(grid, i, 0), gridPoint(grid, i, 1));\n if (j > grid.cols) return extend(gridPoint(grid, i, grid.cols), gridPoint(grid, i, grid.cols - 1));\n return grid.points[i * (grid.cols + 1) + j];\n}\n\nconst extend = (edge: Point, inner: Point): Point => ({ x: 2 * edge.x - inner.x, y: 2 * edge.y - inner.y });\n\n/** The uniform Catmull-Rom spline through four values, between the middle two. */\nfunction catmullRom(p0: number, p1: number, p2: number, p3: number, t: number): number {\n const t2 = t * t;\n return 0.5 * (2 * p1 + (p2 - p0) * t + (2 * p0 - 5 * p1 + 4 * p2 - p3) * t2 + (3 * p1 - p0 - 3 * p2 + p3) * t2 * t);\n}\n\nfunction catmullRomPoint(p: readonly Point[], t: number): Point {\n return {\n x: catmullRom(p[0].x, p[1].x, p[2].x, p[3].x, t),\n y: catmullRom(p[0].y, p[1].y, p[2].y, p[3].y, t),\n };\n}\n\n/** Which patch `u` (or `v`) falls in out of `n`, and where in it. */\nfunction cellOf(s: number, n: number): [number, number] {\n const k = Math.min(n - 1, Math.max(0, Math.floor(s * n)));\n return [k, s * n - k];\n}\n\n/**\n * The smooth surface through every grid point: a Catmull-Rom spline along each\n * row, and another down the columns through those. Bending one point bends its\n * neighborhood smoothly, across patch edges included.\n */\nexport function bicubicMesh(grid: MeshGrid): UvMap {\n return (u, v) => {\n const [j, s] = cellOf(u, grid.cols);\n const [i, t] = cellOf(v, grid.rows);\n const across: Point[] = [];\n for (let di = -1; di <= 2; di++) {\n across.push(catmullRomPoint([-1, 0, 1, 2].map((dj) => gridPoint(grid, i + di, j + dj)), s));\n }\n return catmullRomPoint(across, t);\n };\n}\n\n/**\n * One Coons patch per grid cell: the cell's four edges are the splines through\n * the grid lines, and its inside is blended from those edges alone. Edges\n * match the bicubic surface; the inside follows them more literally, without\n * the bicubic surface's pull from points beyond the cell.\n */\nexport function coonsMesh(grid: MeshGrid): UvMap {\n const row = (i: number, j: number, s: number) =>\n catmullRomPoint([-1, 0, 1, 2].map((dj) => gridPoint(grid, i, j + dj)), s);\n const col = (i: number, j: number, t: number) =>\n catmullRomPoint([-1, 0, 1, 2].map((di) => gridPoint(grid, i + di, j)), t);\n return (u, v) => {\n const [j, s] = cellOf(u, grid.cols);\n const [i, t] = cellOf(v, grid.rows);\n const top = row(i, j, s);\n const bottom = row(i + 1, j, s);\n const left = col(i, j, t);\n const right = col(i, j + 1, t);\n const p00 = gridPoint(grid, i, j);\n const p10 = gridPoint(grid, i, j + 1);\n const p01 = gridPoint(grid, i + 1, j);\n const p11 = gridPoint(grid, i + 1, j + 1);\n const blend = (k: 'x' | 'y') =>\n (1 - t) * top[k] + t * bottom[k] + (1 - s) * left[k] + s * right[k]\n - ((1 - s) * (1 - t) * p00[k] + s * (1 - t) * p10[k] + (1 - s) * t * p01[k] + s * t * p11[k]);\n return { x: blend('x'), y: blend('y') };\n };\n}\n","/**\n * Sparse symmetric positive-definite solves for mesh systems: the unknowns\n * reordered by reverse Cuthill–McKee so each row's nonzeros sit close to the\n * diagonal, then a Cholesky factor stored by profile (each row from its first\n * nonzero to the diagonal). Factoring costs the sum of the squared row widths\n * and a solve the profile's size, which for a mesh of n vertices is about\n * n·√n — small enough to factor once and re-solve every frame.\n */\n\n/** A symmetric matrix under assembly: `rows[i]` maps a column `j <= i` to its entry. */\nexport type SymmetricRows = Map<number, number>[];\n\n/** `n` empty rows. */\nexport function symmetricRows(n: number): SymmetricRows {\n return Array.from({ length: n }, () => new Map<number, number>());\n}\n\n/** Add `v` at `(i, j)` and, implicitly, `(j, i)`. */\nexport function addSymmetric(rows: SymmetricRows, i: number, j: number, v: number): void {\n const [r, c] = i >= j ? [i, j] : [j, i];\n const row = rows[r];\n row.set(c, (row.get(c) ?? 0) + v);\n}\n\n/** A factored matrix. `solve` returns `x` with `A x = b`. */\nexport interface Factored {\n solve(b: ArrayLike<number>): Float64Array;\n /** Two systems at once, `b` and the result interleaved `x, y`: one pass over the factor for both. */\n solvePair(b: ArrayLike<number>): Float64Array;\n}\n\n/** Reverse Cuthill–McKee over the matrix's graph: `order[k]` is the old index placed at `k`. */\nfunction reverseCuthillMcKee(rows: SymmetricRows): Int32Array {\n const n = rows.length;\n const adj: number[][] = Array.from({ length: n }, () => []);\n rows.forEach((row, i) => row.forEach((_, j) => {\n if (j !== i) { adj[i].push(j); adj[j].push(i); }\n }));\n const degree = adj.map((a) => a.length);\n const seen = new Uint8Array(n);\n const order: number[] = [];\n const byDegree = [...Array(n).keys()].sort((a, b) => degree[a] - degree[b]);\n for (const root of byDegree) {\n if (seen[root]) continue;\n seen[root] = 1;\n const queue = [root];\n for (let head = 0; head < queue.length; head++) {\n const v = queue[head];\n order.push(v);\n const next = adj[v].filter((w) => !seen[w]).sort((a, b) => degree[a] - degree[b]);\n for (const w of next) { seen[w] = 1; queue.push(w); }\n }\n }\n return Int32Array.from(order.reverse());\n}\n\n/**\n * Factor the symmetric positive-definite matrix `rows`. Null when it is not\n * positive definite — a system with too few constraints to fix its solution.\n */\nexport function factorSymmetric(rows: SymmetricRows): Factored | null {\n const n = rows.length;\n const order = reverseCuthillMcKee(rows);\n const at = new Int32Array(n);\n order.forEach((old, k) => { at[old] = k; });\n // Profile: row k holds columns first[k]..k, at offset start[k].\n const first = Int32Array.from({ length: n }, (_, k) => k);\n rows.forEach((row, i) => row.forEach((_, j) => {\n const a = at[i], b = at[j];\n const r = Math.max(a, b), c = Math.min(a, b);\n if (c < first[r]) first[r] = c;\n }));\n const start = new Int32Array(n + 1);\n for (let k = 0; k < n; k++) start[k + 1] = start[k] + (k - first[k] + 1);\n const L = new Float64Array(start[n]);\n rows.forEach((row, i) => row.forEach((v, j) => {\n const a = at[i], b = at[j];\n const r = Math.max(a, b), c = Math.min(a, b);\n L[start[r] + c - first[r]] += v;\n }));\n for (let i = 0; i < n; i++) {\n const fi = first[i], si = start[i];\n for (let j = fi; j <= i; j++) {\n const fj = first[j], sj = start[j];\n let sum = L[si + j - fi];\n for (let k = Math.max(fi, fj); k < j; k++) sum -= L[si + k - fi] * L[sj + k - fj];\n if (j === i) {\n if (!(sum > 0)) return null;\n L[si + i - fi] = Math.sqrt(sum);\n } else {\n L[si + j - fi] = sum / L[sj + j - fj];\n }\n }\n }\n return {\n solve(b) {\n const y = new Float64Array(n);\n for (let k = 0; k < n; k++) y[k] = b[order[k]];\n for (let i = 0; i < n; i++) {\n const fi = first[i], si = start[i];\n let sum = y[i];\n for (let k = fi; k < i; k++) sum -= L[si + k - fi] * y[k];\n y[i] = sum / L[si + i - fi];\n }\n for (let i = n - 1; i >= 0; i--) {\n const fi = first[i], si = start[i];\n y[i] /= L[si + i - fi];\n const yi = y[i];\n for (let k = fi; k < i; k++) y[k] -= L[si + k - fi] * yi;\n }\n const x = new Float64Array(n);\n for (let k = 0; k < n; k++) x[order[k]] = y[k];\n return x;\n },\n solvePair(b) {\n const y = new Float64Array(2 * n);\n for (let k = 0; k < n; k++) { y[2 * k] = b[2 * order[k]]; y[2 * k + 1] = b[2 * order[k] + 1]; }\n for (let i = 0; i < n; i++) {\n const fi = first[i], si = start[i];\n let sx = y[2 * i], sy = y[2 * i + 1];\n for (let k = fi; k < i; k++) { const l = L[si + k - fi]; sx -= l * y[2 * k]; sy -= l * y[2 * k + 1]; }\n const d = L[si + i - fi];\n y[2 * i] = sx / d; y[2 * i + 1] = sy / d;\n }\n for (let i = n - 1; i >= 0; i--) {\n const fi = first[i], si = start[i];\n const d = L[si + i - fi];\n const yx = (y[2 * i] /= d), yy = (y[2 * i + 1] /= d);\n for (let k = fi; k < i; k++) { const l = L[si + k - fi]; y[2 * k] -= l * yx; y[2 * k + 1] -= l * yy; }\n }\n const x = new Float64Array(2 * n);\n for (let k = 0; k < n; k++) { x[2 * order[k]] = y[2 * k]; x[2 * order[k] + 1] = y[2 * k + 1]; }\n return x;\n },\n };\n}\n","/**\n * The two linear systems an as-rigid-as-possible solve uses, assembled over\n * one piece of a mesh and split into free and pinned unknowns so that each is\n * factored once per pin set.\n */\nimport { addSymmetric, factorSymmetric, symmetricRows, type Factored, type SymmetricRows } from './profileCholesky';\n\n/** A linear system split into its free and pinned unknowns. */\nexport interface Split {\n factored: Factored;\n /** For each free unknown, the pinned unknowns it couples to and by how much. */\n coupling: { at: Int32Array; by: Float64Array }[];\n}\n\n/** `full` split by `freeIndex`, an unknown's index among the free ones or -1 when pinned; null when singular. */\nexport function split(full: SymmetricRows, freeIndex: Int32Array): Split | null {\n const nFree = freeIndex.reduce((n, f) => (f >= 0 ? n + 1 : n), 0);\n const rows = symmetricRows(nFree);\n const coupling: { at: number[]; by: number[] }[] = Array.from({ length: nFree }, () => ({ at: [], by: [] }));\n full.forEach((row, i) => row.forEach((v, j) => {\n const fi = freeIndex[i] >= 0, fj = freeIndex[j] >= 0;\n if (fi && fj) addSymmetric(rows, freeIndex[i], freeIndex[j], v);\n else if (fi) { coupling[freeIndex[i]].at.push(j); coupling[freeIndex[i]].by.push(v); }\n else if (fj) { coupling[freeIndex[j]].at.push(i); coupling[freeIndex[j]].by.push(v); }\n }));\n const factored = factorSymmetric(rows);\n if (!factored) return null;\n return { factored, coupling: coupling.map((c) => ({ at: Int32Array.from(c.at), by: Float64Array.from(c.by) })) };\n}\n\n/** The free unknowns of `s` given the right side `b` (consumed) and each pinned unknown's value. */\nexport function solveSplit(s: Split, fixedValue: (u: number) => number, b: Float64Array): Float64Array {\n for (let f = 0; f < s.coupling.length; f++) {\n const { at, by } = s.coupling[f];\n for (let k = 0; k < at.length; k++) b[f] -= by[k] * fixedValue(at[k]);\n }\n return s.factored.solve(b);\n}\n\n/**\n * The similarity step's energy over `n` local vertices at `rest`, triangles\n * `tris` as local triples: each triangle vertex kept where its opposite edge,\n * turned and scaled, puts it. Unknowns are interleaved `x, y`.\n */\nexport function similarityEnergy(rest: Float64Array, tris: Int32Array, n: number): SymmetricRows {\n const rows = symmetricRows(2 * n);\n const coef = new Float64Array(6);\n const idx = new Int32Array(6);\n for (let t = 0; t < tris.length; t += 3) {\n for (let e = 0; e < 3; e++) {\n const a = tris[t + e], b = tris[t + (e + 1) % 3], c = tris[t + (e + 2) % 3];\n const dx = rest[2 * b] - rest[2 * a], dy = rest[2 * b + 1] - rest[2 * a + 1];\n const ex = rest[2 * c] - rest[2 * a], ey = rest[2 * c + 1] - rest[2 * a + 1];\n const d2 = dx * dx + dy * dy;\n if (d2 === 0) continue;\n const x = (ex * dx + ey * dy) / d2;\n const y = (ey * dx - ex * dy) / d2;\n idx.set([2 * a, 2 * a + 1, 2 * b, 2 * b + 1, 2 * c, 2 * c + 1]);\n // The miss in x, then in y, as coefficients on (ax, ay, bx, by, cx, cy).\n for (const r of [[-(1 - x), -y, -x, y, 1, 0], [y, -(1 - x), -y, -x, 0, 1]]) {\n coef.set(r);\n for (let i = 0; i < 6; i++) {\n for (let j = 0; j <= i; j++) if (coef[i] !== 0 && coef[j] !== 0) addSymmetric(rows, idx[i], idx[j], coef[i] * coef[j]);\n }\n }\n }\n }\n return rows;\n}\n\n/** The rigid step's energy: every triangle edge kept as its fitted copy has it, one coordinate at a time. */\nexport function edgeEnergy(tris: Int32Array, n: number): SymmetricRows {\n const rows = symmetricRows(n);\n for (let t = 0; t < tris.length; t += 3) {\n for (let e = 0; e < 3; e++) {\n const i = tris[t + e], j = tris[t + (e + 1) % 3];\n addSymmetric(rows, i, i, 1);\n addSymmetric(rows, j, j, 1);\n addSymmetric(rows, i, j, -1);\n }\n }\n return rows;\n}\n","/**\n * Limited-memory BFGS directions (Nocedal, 1980): the last few steps and the\n * change in gradient each made, turned into a direction that bends the\n * preconditioned gradient by the curvature they saw.\n */\n\n/** The most steps remembered. */\nconst DEPTH = 6;\n\n/** The steps a descent has remembered, in a ring, and what it needs to remember the next. */\nexport interface StepMemory {\n steps: Float64Array[];\n turns: Float64Array[];\n /** Each turn carried through the preconditioner. */\n bentTurns: Float64Array[];\n rho: Float64Array;\n /** How many are held, and where the newest is. */\n count: number;\n newest: number;\n /** The gradient where the last step started, and that step; null after a reset. */\n lastGrad: Float64Array | null;\n lastStep: Float64Array | null;\n /** The last gradient `descent` read, carried through the preconditioner. */\n lastBent: Float64Array | null;\n}\n\nexport function stepMemory(): StepMemory {\n return { steps: [], turns: [], bentTurns: [], rho: new Float64Array(DEPTH), count: 0, newest: -1, lastGrad: null, lastStep: null, lastBent: null };\n}\n\nexport function forget(m: StepMemory): void {\n m.count = 0; m.newest = -1;\n m.lastGrad = null; m.lastStep = null;\n}\n\nexport function dot(a: Float64Array, b: Float64Array): number {\n let s = 0;\n for (let i = 0; i < a.length; i++) s += a[i] * b[i];\n return s;\n}\n\n/**\n * Fold in the step that ended where gradient `g` was read, `bent` being `g`\n * through the preconditioner; a step that saw no positive curvature is dropped.\n */\nfunction remember(m: StepMemory, g: Float64Array, bent: Float64Array): void {\n const { lastGrad, lastStep, lastBent } = m;\n if (!lastGrad || !lastStep || !lastBent) return;\n const slot = (m.newest + 1) % DEPTH;\n if (m.steps.length <= slot || m.steps[slot].length !== g.length) {\n m.steps[slot] = new Float64Array(g.length);\n m.turns[slot] = new Float64Array(g.length);\n m.bentTurns[slot] = new Float64Array(g.length);\n }\n const s = m.steps[slot], y = m.turns[slot], py = m.bentTurns[slot];\n let sy = 0;\n for (let i = 0; i < g.length; i++) {\n s[i] = lastStep[i];\n y[i] = g[i] - lastGrad[i];\n py[i] = bent[i] - lastBent[i];\n sy += y[i] * s[i];\n }\n if (!(sy > 1e-12)) return;\n m.rho[slot] = 1 / sy;\n m.newest = slot;\n m.count = Math.min(DEPTH, m.count + 1);\n}\n\n/**\n * The descent direction at gradient `g`: `precondition` (an approximate\n * inverse Hessian, linear, applied to a copy it may keep) carried through the\n * remembered steps by the two-loop recursion. Folds the step that led here in\n * first. `precondition` runs once, on `g`: each remembered turn is kept\n * through it too, so the recursion's middle step is a sum. With `scaled`,\n * the preconditioner is first scaled to the curvature the newest step saw\n * along it (`s·y / y·P y`).\n */\nexport function descent(\n m: StepMemory, g: Float64Array, precondition: (q: Float64Array) => Float64Array, scaled = false,\n): Float64Array {\n const r = precondition(Float64Array.from(g));\n remember(m, g, r);\n m.lastBent = Float64Array.from(r);\n const q = Float64Array.from(g);\n const n = q.length;\n const alpha = new Float64Array(m.count);\n for (let k = 0; k < m.count; k++) {\n const slot = (m.newest - k + DEPTH) % DEPTH;\n const s = m.steps[slot], y = m.turns[slot], py = m.bentTurns[slot];\n const a = (alpha[k] = m.rho[slot] * dot(s, q));\n for (let j = 0; j < n; j++) { q[j] -= a * y[j]; r[j] -= a * py[j]; }\n }\n if (scaled && m.count > 0) {\n const scale = 1 / (m.rho[m.newest] * dot(m.turns[m.newest], m.bentTurns[m.newest]));\n for (let j = 0; j < n; j++) r[j] *= scale;\n }\n for (let k = m.count - 1; k >= 0; k--) {\n const slot = (m.newest - k + DEPTH) % DEPTH;\n const s = m.steps[slot], y = m.turns[slot];\n const c = alpha[k] - m.rho[slot] * dot(y, r);\n for (let j = 0; j < n; j++) r[j] += c * s[j];\n }\n for (let j = 0; j < n; j++) r[j] = -r[j];\n return r;\n}\n","/**\n * The injective pass of an as-rigid-as-possible solve, for a result that left\n * triangles turned over. It descends on the untangling energy of Garanzha et\n * al. (\"Foldover-free maps in 50 lines of code\", 2021): a distortion measure\n * whose denominator is a softened area, finite for a turned-over triangle while\n * the softening `eps` is above zero and growing without bound as a triangle\n * flattens once it reaches zero. `eps` shrinks round by round as the turned\n * triangles right themselves; once none is left, the pass holds it at zero and\n * a line search that never lets a triangle flatten keeps the map injective.\n * Each step is the energy's gradient carried through the rigid step's edge\n * system, already factored (the quadratic proxy of Kovalsky, Galun and Lipman,\n * 2016), and bent by the curvature the last few steps saw (`lbfgs`), with the\n * pins held where they are, so a round costs about what a local/global round\n * does and the pins land exactly.\n */\nimport type { Piece } from './arapPiece';\nimport { descent, dot, forget, type StepMemory } from './lbfgs';\n\n/** Each rest triangle's inverse edge matrix, four entries per triangle, its area, and its winding (+1, -1, or 0 when flat). */\nexport interface RestFrames {\n inv: Float64Array;\n area: Float64Array;\n side: Int8Array;\n}\n\nexport function restFrames(rest: Float64Array, tris: Int32Array): RestFrames {\n const nt = tris.length / 3;\n const inv = new Float64Array(4 * nt), area = new Float64Array(nt), side = new Int8Array(nt);\n for (let t = 0; t < nt; t++) {\n const a = tris[3 * t], b = tris[3 * t + 1], c = tris[3 * t + 2];\n const ux = rest[2 * b] - rest[2 * a], uy = rest[2 * b + 1] - rest[2 * a + 1];\n const vx = rest[2 * c] - rest[2 * a], vy = rest[2 * c + 1] - rest[2 * a + 1];\n const det = ux * vy - uy * vx;\n if (det === 0) continue;\n inv.set([vy / det, -vx / det, -uy / det, ux / det], 4 * t);\n area[t] = Math.abs(det) / 2;\n side[t] = Math.sign(det);\n }\n return { inv, area, side };\n}\n\n/** The share of the way to the nearest flattening a step may go. */\nconst FLIP_MARGIN = 0.8;\nconst ARMIJO = 1e-4;\n/** Weight of the area term against the shape term. */\nconst AREA = 1;\n\n/** Triangle `t`'s Jacobian at `pos`, as `[j11, j12, j21, j22]`, or null when it has no area at rest. */\nfunction jacobian(piece: Piece, pos: Float64Array, t: number, J: Float64Array): boolean {\n const { tris, frames } = piece;\n if (frames.area[t] === 0) return false;\n const a = tris[3 * t], b = tris[3 * t + 1], c = tris[3 * t + 2];\n const ux = pos[2 * b] - pos[2 * a], uy = pos[2 * b + 1] - pos[2 * a + 1];\n const vx = pos[2 * c] - pos[2 * a], vy = pos[2 * c + 1] - pos[2 * a + 1];\n const m = frames.inv;\n const i = 4 * t;\n J[0] = ux * m[i] + vx * m[i + 2]; J[1] = ux * m[i + 1] + vx * m[i + 3];\n J[2] = uy * m[i] + vy * m[i + 2]; J[3] = uy * m[i + 1] + vy * m[i + 3];\n return true;\n}\n\n/** How far along `d` from `pos` the first triangle flattens, or Infinity when none does. */\nexport function flipBound(piece: Piece, pos: Float64Array, d: Float64Array): number {\n const { tris, frames } = piece;\n let bound = Infinity;\n for (let t = 0; t < tris.length; t += 3) {\n const a = tris[t], b = tris[t + 1], c = tris[t + 2];\n const side = frames.side[t / 3];\n if (side === 0) continue;\n const ux = pos[2 * b] - pos[2 * a], uy = pos[2 * b + 1] - pos[2 * a + 1];\n const vx = pos[2 * c] - pos[2 * a], vy = pos[2 * c + 1] - pos[2 * a + 1];\n const dux = d[2 * b] - d[2 * a], duy = d[2 * b + 1] - d[2 * a + 1];\n const dvx = d[2 * c] - d[2 * a], dvy = d[2 * c + 1] - d[2 * a + 1];\n // side * det(u + s du, v + s dv) = c0 + c1 s + c2 s²\n const c0 = side * (ux * vy - uy * vx);\n const c1 = side * (ux * dvy - uy * dvx + dux * vy - duy * vx);\n const c2 = side * (dux * dvy - duy * dvx);\n if (c0 <= 0) return 0;\n bound = Math.min(bound, smallestPositiveRoot(c0, c1, c2));\n }\n return bound;\n}\n\nfunction smallestPositiveRoot(c0: number, c1: number, c2: number): number {\n if (Math.abs(c2) < 1e-14 * (Math.abs(c1) + Math.abs(c0))) return c1 < 0 ? -c0 / c1 : Infinity;\n const disc = c1 * c1 - 4 * c2 * c0;\n if (disc < 0) return Infinity;\n const q = -0.5 * (c1 + Math.sign(c1 || 1) * Math.sqrt(disc));\n const r1 = q / c2, r2 = c0 / q;\n let least = Infinity;\n if (r1 > 0 && r1 < least) least = r1;\n if (r2 > 0 && r2 < least) least = r2;\n return least;\n}\n\n/** The softened area: `d` itself well above `eps`, small and positive below zero. */\nconst chi = (d: number, eps: number) => (d + Math.sqrt(eps * eps + d * d)) / 2;\n\n/**\n * Each triangle's share of the untangling energy before the softened area\n * divides it, and its Jacobian determinant: enough to read the energy again\n * at another softening, and the least area, without another pass.\n */\nexport interface EnergyTerms {\n shape: Float64Array;\n det: Float64Array;\n}\n\nexport function energyTerms(piece: Piece): EnergyTerms {\n const n = piece.frames.area.length;\n return { shape: new Float64Array(n), det: new Float64Array(n).fill(Infinity) };\n}\n\n/**\n * The untangling energy at `pos`; at `eps` 0, infinite once a triangle has\n * turned over or flattened. With `terms`, each triangle's terms are recorded\n * there too; an infinite energy leaves them partly written.\n */\nexport function untangleEnergy(piece: Piece, pos: Float64Array, eps: number, terms?: EnergyTerms): number {\n const { tris, frames: { area, inv: m } } = piece;\n let E = 0;\n for (let t = 0; t < area.length; t++) {\n if (area[t] === 0) continue;\n const a = tris[3 * t], b = tris[3 * t + 1], cc = tris[3 * t + 2], i = 4 * t;\n const ux = pos[2 * b] - pos[2 * a], uy = pos[2 * b + 1] - pos[2 * a + 1];\n const vx = pos[2 * cc] - pos[2 * a], vy = pos[2 * cc + 1] - pos[2 * a + 1];\n const j0 = ux * m[i] + vx * m[i + 2], j1 = ux * m[i + 1] + vx * m[i + 3];\n const j2 = uy * m[i] + vy * m[i + 2], j3 = uy * m[i + 1] + vy * m[i + 3];\n const d = j0 * j3 - j1 * j2;\n const c = chi(d, eps);\n if (!(c > 0)) return Infinity;\n const shape = area[t] * (j0 * j0 + j1 * j1 + j2 * j2 + j3 * j3 + AREA * (d * d + 1));\n if (terms) { terms.shape[t] = shape; terms.det[t] = d; }\n E += shape / c;\n }\n return E;\n}\n\n/** The energy `terms` were recorded for, read at softening `eps`. */\nexport function energyAt(terms: EnergyTerms, eps: number): number {\n let E = 0;\n for (let t = 0; t < terms.shape.length; t++) if (terms.shape[t] > 0) E += terms.shape[t] / chi(terms.det[t], eps);\n return E;\n}\n\n/** The untangling energy of the piece at rest, or moved rigidly: the least it can take at `eps` 0. */\nexport function restEnergy(piece: Piece): number {\n let E = 0;\n for (const a of piece.frames.area) E += a * (2 + 2 * AREA);\n return E;\n}\n\n/** The smallest determinant among `terms`. */\nexport function leastOf(terms: EnergyTerms): number {\n let least = Infinity;\n for (let t = 0; t < terms.det.length; t++) if (terms.det[t] < least) least = terms.det[t];\n return least;\n}\n\n/** The smallest Jacobian determinant over the piece's triangles at `pos`: below zero where one has turned over. */\nexport function leastArea(piece: Piece, pos: Float64Array): number {\n const J = new Float64Array(4);\n let least = Infinity;\n for (let t = 0; t < piece.frames.area.length; t++) {\n if (jacobian(piece, pos, t, J)) least = Math.min(least, J[0] * J[3] - J[1] * J[2]);\n }\n return least;\n}\n\nfunction gradient(piece: Piece, pos: Float64Array, eps: number): Float64Array {\n const { tris, frames: { area, inv: m } } = piece;\n const g = new Float64Array(pos.length);\n for (let t = 0; t < area.length; t++) {\n if (area[t] === 0) continue;\n const a = tris[3 * t], b = tris[3 * t + 1], cc = tris[3 * t + 2], i = 4 * t;\n const ux = pos[2 * b] - pos[2 * a], uy = pos[2 * b + 1] - pos[2 * a + 1];\n const vx = pos[2 * cc] - pos[2 * a], vy = pos[2 * cc + 1] - pos[2 * a + 1];\n const j0 = ux * m[i] + vx * m[i + 2], j1 = ux * m[i + 1] + vx * m[i + 3];\n const j2 = uy * m[i] + vy * m[i + 2], j3 = uy * m[i + 1] + vy * m[i + 3];\n const d = j0 * j3 - j1 * j2;\n const root = Math.sqrt(eps * eps + d * d);\n const c = (d + root) / 2;\n const A = area[t];\n const top = j0 * j0 + j1 * j1 + j2 * j2 + j3 * j3 + AREA * (d * d + 1);\n const dc = root === 0 ? 0.5 : (1 + d / root) / 2;\n // dE/dJ = (2 J + 2 AREA d cof J) / c - top dc cof J / c², cof J being d's own gradient.\n const s = (2 * A) / c, r = A * ((2 * AREA * d) / c - (top * dc) / (c * c));\n const g0 = s * j0 + r * j3, g1 = s * j1 - r * j2, g2 = s * j2 - r * j1, g3 = s * j3 + r * j0;\n const gux = g0 * m[i] + g1 * m[i + 1], gvx = g0 * m[i + 2] + g1 * m[i + 3];\n const guy = g2 * m[i] + g3 * m[i + 1], gvy = g2 * m[i + 2] + g3 * m[i + 3];\n g[2 * b] += gux; g[2 * b + 1] += guy; g[2 * cc] += gvx; g[2 * cc + 1] += gvy;\n g[2 * a] -= gux + gvx; g[2 * a + 1] -= guy + gvy;\n }\n return g;\n}\n\n/** Whether any triangle at `pos` has turned over or flattened against its rest orientation. */\nexport function turnedOver(piece: Piece, pos: Float64Array): boolean {\n return flipBound(piece, pos, new Float64Array(pos.length)) === 0;\n}\n\n/** The softening to start untangling `pos` with. */\nexport function startingEps(piece: Piece, pos: Float64Array): number {\n return Math.max(1e-3, 2 * Math.abs(Math.min(0, leastArea(piece, pos))));\n}\n\n/** The least share a round shrinks the softening by while a triangle is turned over, and once none is. */\nconst SHRINK_TURNED = 0.2;\nconst SHRINK_CLEAR = 0.05;\n\n/**\n * The softening for the next round, after a round took the energy from\n * `before` to `after` (both at `eps`) and left `least` the smallest\n * determinant: small enough that it keeps pressing a\n * turned triangle towards positive area, never below zero, and zero once\n * every triangle has some. It shrinks fast while a triangle is turned over and\n * slowly after: a softening dropped soon after the last one rights itself\n * leaves the descent stepping short of some nearly flat triangle.\n */\nexport function nextEps(least: number, eps: number, before: number, after: number): number {\n const sigma = Math.max(1 - after / before, least > 0 ? SHRINK_CLEAR : SHRINK_TURNED);\n const mu = (1 - sigma) * chi(least, eps);\n return least < mu ? 2 * Math.sqrt(mu * (mu - least)) : 0;\n}\n\n/**\n * One round of descent from `pos` at softening `eps`, the pins held, along\n * the limited-memory BFGS direction `memory` builds over the edge system:\n * the preconditioned gradient alone crawls, taking each round a step a\n * barely squeezed triangle allows and no farther. At `eps` 0 the step stops\n * short of flattening any triangle. Returns the new positions, their energy\n * at `eps` and its terms, and the farthest any vertex moved.\n */\nexport function untangleRound(\n piece: Piece, pos: Float64Array, eps: number, energy: number, memory: StepMemory,\n): { pos: Float64Array; energy: number; terms: EnergyTerms; moved: number } {\n const { pinOf, freeOf, step2 } = piece;\n const terms = energyTerms(piece);\n const g = gradient(piece, pos, eps);\n const nf = step2.coupling.length;\n const gf = new Float64Array(2 * nf);\n for (let i = 0; i < pinOf.length; i++) {\n const f = freeOf[i];\n if (f >= 0) { gf[2 * f] = g[2 * i]; gf[2 * f + 1] = g[2 * i + 1]; }\n }\n const precondition = (q: Float64Array) => step2.factored.solvePair(q);\n // At eps 0 the edge system alone overstates a step about twice over, and the line search halved nearly every one.\n let df = descent(memory, gf, precondition, eps === 0);\n let slope = dot(gf, df);\n if (!(slope < 0)) {\n forget(memory);\n df = memory.lastBent!.map((v) => -v);\n slope = dot(gf, df);\n }\n const d = new Float64Array(pos.length);\n for (let i = 0; i < pinOf.length; i++) {\n const f = freeOf[i];\n if (f >= 0) { d[2 * i] = df[2 * f]; d[2 * i + 1] = df[2 * f + 1]; }\n }\n let s = eps > 0 ? 1 : Math.min(1, FLIP_MARGIN * flipBound(piece, pos, d));\n const next = new Float64Array(pos.length);\n for (; s > 1e-12; s /= 2) {\n for (let i = 0; i < next.length; i++) next[i] = pos[i] + s * d[i];\n const e = untangleEnergy(piece, next, eps, terms);\n if (e <= energy + ARMIJO * s * slope) {\n let far = 0;\n for (let i = 0; i < d.length; i += 2) far = Math.max(far, d[i] * d[i] + d[i + 1] * d[i + 1]);\n const moved = s * Math.sqrt(far);\n memory.lastGrad = gf;\n memory.lastStep = df.map((v) => s * v);\n return { pos: next, energy: e, terms, moved };\n }\n }\n forget(memory);\n untangleEnergy(piece, pos, eps, terms);\n return { pos, energy, terms, moved: 0 };\n}\n","/**\n * One connected piece of an as-rigid-as-possible mesh holding at least two\n * pins, in its own local vertex numbering, with both systems factored. Its\n * positions are interleaved `x, y` in that numbering, pinned vertices included.\n */\nimport type { ArapMesh } from './arap';\nimport { edgeEnergy, similarityEnergy, solveSplit, split, type Split } from './arapSystem';\nimport { restFrames, type RestFrames } from './injective';\n\nexport interface Piece {\n /** Local vertex → mesh vertex. */\n verts: Int32Array;\n /** Rest positions, local. */\n rest: Float64Array;\n /** The larger side of its rest bounds. */\n size: number;\n /** Triangles as local vertex triples. */\n tris: Int32Array;\n /** Local vertex → pin index, or -1 when free. */\n pinOf: Int32Array;\n freeOf: Int32Array;\n step1: Split;\n step2: Split;\n frames: RestFrames;\n}\n\nexport function buildPiece(mesh: ArapMesh, verts: number[], tris: number[], pinAt: Map<number, number>, local: Int32Array): Piece | null {\n const n = verts.length;\n verts.forEach((v, i) => { local[v] = i; });\n const rest = new Float64Array(2 * n);\n verts.forEach((v, i) => { rest[2 * i] = mesh.vertices[2 * v]; rest[2 * i + 1] = mesh.vertices[2 * v + 1]; });\n let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n for (let i = 0; i < 2 * n; i += 2) {\n x0 = Math.min(x0, rest[i]); x1 = Math.max(x1, rest[i]); y0 = Math.min(y0, rest[i + 1]); y1 = Math.max(y1, rest[i + 1]);\n }\n const T = mesh.triangles;\n const lt = new Int32Array(3 * tris.length);\n tris.forEach((t, k) => { for (let c = 0; c < 3; c++) lt[3 * k + c] = local[T[3 * t + c]]; });\n const pinOf = Int32Array.from(verts, (v) => pinAt.get(v) ?? -1);\n const freeOf = new Int32Array(n).fill(-1);\n let nf = 0;\n for (let i = 0; i < n; i++) if (pinOf[i] < 0) freeOf[i] = nf++;\n const free2 = Int32Array.from({ length: 2 * n }, (_, u) => (freeOf[u >> 1] < 0 ? -1 : 2 * freeOf[u >> 1] + (u & 1)));\n const step1 = split(similarityEnergy(rest, lt, n), free2);\n const step2 = split(edgeEnergy(lt, n), freeOf);\n if (!step1 || !step2) return null;\n return { verts: Int32Array.from(verts), rest, size: Math.max(x1 - x0, y1 - y0), tris: lt, pinOf, freeOf, step1, step2, frames: restFrames(rest, lt) };\n}\n\n/** The similarity step: the shape keeping each triangle closest to a turned and scaled copy of itself. */\nexport function similaritySolve(piece: Piece, targets: ArrayLike<number>): Float64Array {\n const { pinOf, freeOf, step1 } = piece;\n const x = solveSplit(step1, (u) => targets[2 * pinOf[u >> 1] + (u & 1)], new Float64Array(step1.coupling.length));\n const pos = new Float64Array(2 * pinOf.length);\n for (let i = 0; i < pinOf.length; i++) {\n for (let c = 0; c < 2; c++) pos[2 * i + c] = pinOf[i] >= 0 ? targets[2 * pinOf[i] + c] : x[2 * freeOf[i] + c];\n }\n return pos;\n}\n\n/**\n * One local/global round from `pos`: fit a turned, unscaled copy of each rest\n * triangle to it, then find the vertices that best agree with every copy.\n * Returns the new positions and the rigidity energy `pos` had against the fit.\n */\nexport function rigidRound(piece: Piece, targets: ArrayLike<number>, pos: Float64Array): { pos: Float64Array; energy: number } {\n const { rest, tris, pinOf, freeOf, step2 } = piece;\n const nf = step2.coupling.length;\n const bx = new Float64Array(nf), by = new Float64Array(nf);\n let energy = 0;\n for (let t = 0; t < tris.length; t += 3) {\n let dot = 0, cross = 0, sq = 0;\n for (let e = 0; e < 3; e++) {\n const i = tris[t + e], j = tris[t + (e + 1) % 3];\n const px = rest[2 * i] - rest[2 * j], py = rest[2 * i + 1] - rest[2 * j + 1];\n const qx = pos[2 * i] - pos[2 * j], qy = pos[2 * i + 1] - pos[2 * j + 1];\n dot += px * qx + py * qy;\n cross += px * qy - py * qx;\n sq += px * px + py * py + qx * qx + qy * qy;\n }\n const len = Math.hypot(dot, cross);\n energy += sq - 2 * len;\n const cos = len === 0 ? 1 : dot / len, sin = len === 0 ? 0 : cross / len;\n for (let e = 0; e < 3; e++) {\n const i = tris[t + e], j = tris[t + (e + 1) % 3];\n const ex = rest[2 * i] - rest[2 * j], ey = rest[2 * i + 1] - rest[2 * j + 1];\n const fx = cos * ex - sin * ey, fy = sin * ex + cos * ey;\n if (freeOf[i] >= 0) { bx[freeOf[i]] += fx; by[freeOf[i]] += fy; }\n if (freeOf[j] >= 0) { bx[freeOf[j]] -= fx; by[freeOf[j]] -= fy; }\n }\n }\n const x = solveSplit(step2, (u) => targets[2 * pinOf[u]], bx);\n const y = solveSplit(step2, (u) => targets[2 * pinOf[u] + 1], by);\n const out = new Float64Array(pos.length);\n for (let i = 0; i < pinOf.length; i++) {\n const p = pinOf[i];\n out[2 * i] = p >= 0 ? targets[2 * p] : x[freeOf[i]];\n out[2 * i + 1] = p >= 0 ? targets[2 * p + 1] : y[freeOf[i]];\n }\n return { pos: out, energy };\n}\n\n/** Copy a piece's positions into the whole mesh's. */\nexport function placePiece(piece: Piece, pos: Float64Array, out: Float64Array): void {\n piece.verts.forEach((v, i) => { out[2 * v] = pos[2 * i]; out[2 * v + 1] = pos[2 * i + 1]; });\n}\n","/**\n * As-rigid-as-possible deformation of a triangle mesh with pinned vertices.\n * It starts from Igarashi, Moscovich and Hughes's two linear steps (2005): the\n * shape keeping each triangle closest to a turned and scaled copy of itself,\n * then the vertices best agreeing with an unscaled copy of each rest triangle\n * fitted to it. Rounds of the local/global method (Liu et al., 2008) follow,\n * each refitting the copies to the last result and solving again, which takes\n * out more of the stretch and squash the first step left. None of these stops\n * a hard pull from turning triangles over, which runs the outline backwards\n * through the fold; when the rounds leave any, an injective pass (`injective`)\n * rights them with the pins held. Every system depends only on the mesh and\n * which vertices are pinned, so each is factored once per pin set and only\n * re-solved as the pins move.\n */\nimport { buildPiece, placePiece, rigidRound, similaritySolve, type Piece } from './arapPiece';\nimport { energyAt, leastOf, nextEps, restEnergy, startingEps, turnedOver, untangleEnergy, untangleRound } from './injective';\nimport { stepMemory } from './lbfgs';\n\n/** A triangle mesh at rest: interleaved `x, y` vertices and vertex-index triples. */\nexport interface ArapMesh {\n vertices: Float64Array;\n triangles: Uint32Array;\n}\n\n/**\n * A stage of a solve: `similarity` is the first linear step, `rigid` the\n * second, `local-global` each round after them, and `injective` each round\n * of the pass that runs when those leave a triangle turned over. That pass's\n * last step is the result: its pins set exactly, or the local/global result\n * again when the pins cannot be set without a fold.\n */\nexport type ArapStage = 'similarity' | 'rigid' | 'local-global' | 'injective';\n\n/** A solve's state after one stage: every vertex's position, interleaved `x, y`. */\nexport interface ArapStep {\n stage: ArapStage;\n /** Which round of its stage, from 1. */\n round: number;\n vertices: Float64Array;\n}\n\n/** Options for {@link ArapSolver.solve}. */\nexport interface ArapSolveOptions {\n /** The most local/global rounds to run after the two linear steps; 0\n * returns their result alone. Rounds stop early once the mesh settles.\n * Default {@link ARAP_ROUNDS}. */\n iterations?: number;\n /** The most rounds of the injective pass; 0 skips it. Default\n * {@link ARAP_INJECTIVE_ROUNDS}. */\n injectiveIterations?: number;\n /** Called with the state after each stage, in order; the last call carries\n * the result. A step's `vertices` is the caller's to keep. */\n trace?: (step: ArapStep) => void;\n}\n\n/** A factored deformation; `solve` takes each pinned vertex's target, as\n * interleaved `x, y` in pin order, and returns every vertex's position. */\nexport interface ArapSolver {\n solve(targets: ArrayLike<number>, opts?: ArapSolveOptions): Float64Array;\n}\n\n/** The default most local/global rounds per solve. */\nexport const ARAP_ROUNDS = 5;\n/** The default most injective rounds per solve. */\nexport const ARAP_INJECTIVE_ROUNDS = 100;\n/** A round moving no vertex farther than this share of the piece's size ends the rounds. */\nconst SETTLED = 1e-4;\n/** An injective round taking off less than this share of the energy above a rigid motion's has settled. */\nconst SETTLED_ENERGY = 3e-3;\n/** Settled injective rounds in a row that end the pass: one short step of a\n * limited-memory descent is often followed by a long one. */\nconst CALM_ROUNDS = 2;\n\n/** The mesh's connected pieces: vertex lists and triangle lists. */\nfunction piecesOf(mesh: ArapMesh): { verts: number[]; tris: number[] }[] {\n const n = mesh.vertices.length >> 1;\n const parent = Int32Array.from({ length: n }, (_, i) => i);\n const find = (i: number): number => {\n while (parent[i] !== i) { parent[i] = parent[parent[i]]; i = parent[i]; }\n return i;\n };\n const T = mesh.triangles;\n for (let t = 0; t + 2 < T.length; t += 3) {\n parent[find(T[t + 1])] = find(T[t]);\n parent[find(T[t + 2])] = find(T[t]);\n }\n const byRoot = new Map<number, { verts: number[]; tris: number[] }>();\n const used = new Uint8Array(n);\n for (let t = 0; t + 2 < T.length; t += 3) {\n const r = find(T[t]);\n let p = byRoot.get(r);\n if (!p) { p = { verts: [], tris: [] }; byRoot.set(r, p); }\n p.tris.push(t / 3);\n for (let k = 0; k < 3; k++) if (!used[T[t + k]]) { used[T[t + k]] = 1; p.verts.push(T[t + k]); }\n }\n return [...byRoot.values()];\n}\n\n/** The farthest any vertex moved between `a` and `b`. */\nfunction largestMove(a: Float64Array, b: Float64Array): number {\n let m = 0;\n for (let i = 0; i < a.length; i += 2) m = Math.max(m, Math.hypot(b[i] - a[i], b[i + 1] - a[i + 1]));\n return m;\n}\n\n/** The rigid motion best carrying `from` points onto `to` points. */\nfunction rigidFit(from: readonly number[], to: ArrayLike<number>): (x: number, y: number) => [number, number] {\n const k = from.length >> 1;\n let pcx = 0, pcy = 0, qcx = 0, qcy = 0;\n for (let i = 0; i < k; i++) { pcx += from[2 * i]; pcy += from[2 * i + 1]; qcx += to[2 * i]; qcy += to[2 * i + 1]; }\n pcx /= k; pcy /= k; qcx /= k; qcy /= k;\n let dot = 0, cross = 0;\n for (let i = 0; i < k; i++) {\n const px = from[2 * i] - pcx, py = from[2 * i + 1] - pcy;\n const qx = to[2 * i] - qcx, qy = to[2 * i + 1] - qcy;\n dot += px * qx + py * qy; cross += px * qy - py * qx;\n }\n const len = Math.hypot(dot, cross);\n const cos = len === 0 ? 1 : dot / len, sin = len === 0 ? 0 : cross / len;\n return (x, y) => [cos * (x - pcx) - sin * (y - pcy) + qcx, sin * (x - pcx) + cos * (y - pcy) + qcy];\n}\n\n/**\n * Factor the deformation of `mesh` with vertices `pinned` held. A piece of\n * the mesh holding two pins or more deforms as rigidly as they allow; one\n * holding a single pin moves with it; one holding none moves rigidly with the\n * pins as a whole.\n */\nexport function createArapSolver(mesh: ArapMesh, pinned: readonly number[]): ArapSolver {\n const n = mesh.vertices.length >> 1;\n const pinAt = new Map<number, number>();\n pinned.forEach((v, k) => { if (!pinAt.has(v)) pinAt.set(v, k); });\n const local = new Int32Array(n);\n const pinFrom = pinned.flatMap((v) => [mesh.vertices[2 * v], mesh.vertices[2 * v + 1]]);\n const solved: Piece[] = [];\n const carried: { verts: number[]; pin: number }[] = [];\n for (const p of piecesOf(mesh)) {\n const pins = [...new Set(p.verts.filter((v) => pinAt.has(v)).map((v) => pinAt.get(v)!))];\n const piece = pins.length >= 2 ? buildPiece(mesh, p.verts, p.tris, pinAt, local) : null;\n if (piece) solved.push(piece);\n else carried.push({ verts: p.verts, pin: pins.length === 1 ? pins[0] : -1 });\n }\n return {\n solve(targets, opts = {}) {\n const out = Float64Array.from(mesh.vertices);\n const whole = carried.some((c) => c.pin < 0) && pinned.length > 0 ? rigidFit(pinFrom, targets) : null;\n for (const { verts, pin } of carried) {\n for (const v of verts) {\n const x = mesh.vertices[2 * v], y = mesh.vertices[2 * v + 1];\n if (pin >= 0) {\n out[2 * v] = x + targets[2 * pin] - pinFrom[2 * pin];\n out[2 * v + 1] = y + targets[2 * pin + 1] - pinFrom[2 * pin + 1];\n } else if (whole) {\n [out[2 * v], out[2 * v + 1]] = whole(x, y);\n }\n }\n }\n const { trace } = opts;\n const report = (stage: ArapStage, round: number) => trace?.({ stage, round, vertices: Float64Array.from(out) });\n const pos = solved.map((piece) => similaritySolve(piece, targets));\n solved.forEach((piece, k) => placePiece(piece, pos[k], out));\n report('similarity', 1);\n solved.forEach((piece, k) => { pos[k] = rigidRound(piece, targets, pos[k]).pos; placePiece(piece, pos[k], out); });\n report('rigid', 1);\n const rounds = Math.max(0, Math.floor(opts.iterations ?? ARAP_ROUNDS));\n const live = solved.map(() => true);\n for (let r = 1; r <= rounds && live.some(Boolean); r++) {\n solved.forEach((piece, k) => {\n if (!live[k]) return;\n const next = rigidRound(piece, targets, pos[k]).pos;\n live[k] = largestMove(pos[k], next) > SETTLED * piece.size;\n pos[k] = next;\n placePiece(piece, next, out);\n });\n report('local-global', r);\n }\n const injective = Math.max(0, Math.floor(opts.injectiveIterations ?? ARAP_INJECTIVE_ROUNDS));\n const tangled = solved.map((piece, k) => injective > 0 && turnedOver(piece, pos[k]));\n if (tangled.some(Boolean)) {\n const state = solved.map((piece, k) => {\n const eps = tangled[k] ? startingEps(piece, pos[k]) : 0;\n return { pos: pos[k], eps, energy: tangled[k] ? untangleEnergy(piece, pos[k], eps) : 0, live: tangled[k], memory: stepMemory(), calm: 0, rest: restEnergy(piece) };\n });\n let r = 1;\n for (; r <= injective && state.some((s) => s.live); r++) {\n solved.forEach((piece, k) => {\n const s = state[k];\n if (!s.live) return;\n const step = untangleRound(piece, s.pos, s.eps, s.energy, s.memory);\n const settled = step.moved <= SETTLED * piece.size || s.energy - step.energy <= SETTLED_ENERGY * (step.energy - s.rest);\n s.pos = step.pos;\n if (s.eps > 0) {\n s.eps = nextEps(leastOf(step.terms), s.eps, s.energy, step.energy);\n s.energy = energyAt(step.terms, s.eps);\n } else {\n s.energy = step.energy;\n s.calm = settled ? s.calm + 1 : 0;\n s.live = s.calm < CALM_ROUNDS;\n }\n placePiece(piece, s.pos, out);\n });\n report('injective', r);\n }\n // A piece still tangled when the rounds run out keeps the local/global result.\n let fell = false;\n solved.forEach((piece, k) => {\n if (!tangled[k] || !turnedOver(piece, state[k].pos)) return;\n placePiece(piece, pos[k], out);\n fell = true;\n });\n if (fell) report('injective', r);\n }\n return out;\n },\n };\n}\n","/**\n * A smooth map through a deformed triangle mesh: the Clough–Tocher\n * interpolant (Farin's reduced form). Each triangle is split at its centroid\n * into three cubic pieces built from the vertices' positions and derivatives,\n * and the derivative across every edge, between triangles and inside one, is\n * the same on both sides. Only the triangle holding a point is read, so a\n * point costs what one cubic costs.\n */\nimport type { ArapMesh } from './arap';\nimport type { MeshSpot } from './meshMap';\n\n/** What the interpolant needs of a mesh at rest, set up once per mesh: each\n * triangle's inverse edge matrix and area. */\nexport interface RestFrames {\n inverse: Float64Array;\n area: Float64Array;\n}\n\nexport function restFrames(mesh: ArapMesh): RestFrames {\n const V = mesh.vertices, T = mesh.triangles;\n const nt = T.length / 3;\n const inverse = new Float64Array(4 * nt);\n const area = new Float64Array(nt);\n for (let t = 0; t < nt; t++) {\n const a = T[3 * t], b = T[3 * t + 1], c = T[3 * t + 2];\n const ux = V[2 * b] - V[2 * a], uy = V[2 * b + 1] - V[2 * a + 1];\n const vx = V[2 * c] - V[2 * a], vy = V[2 * c + 1] - V[2 * a + 1];\n const det = ux * vy - uy * vx;\n if (det === 0) continue;\n inverse.set([vy / det, -vx / det, -uy / det, ux / det], 4 * t);\n area[t] = Math.abs(det) / 2;\n }\n return { inverse, area };\n}\n\n/** Each vertex's derivative under the deformation `at`: the area-weighted\n * mean of its triangles' affine derivatives, row-major 2×2. */\nfunction vertexDerivatives(mesh: ArapMesh, frames: RestFrames, at: Float64Array): Float64Array {\n const T = mesh.triangles;\n const nv = mesh.vertices.length / 2;\n const J = new Float64Array(4 * nv);\n const weight = new Float64Array(nv);\n for (let t = 0; t < T.length / 3; t++) {\n const w = frames.area[t];\n if (w === 0) continue;\n const a = T[3 * t], b = T[3 * t + 1], c = T[3 * t + 2];\n const ux = at[2 * b] - at[2 * a], uy = at[2 * b + 1] - at[2 * a + 1];\n const vx = at[2 * c] - at[2 * a], vy = at[2 * c + 1] - at[2 * a + 1];\n const i = frames.inverse;\n const m0 = ux * i[4 * t] + vx * i[4 * t + 2], m1 = ux * i[4 * t + 1] + vx * i[4 * t + 3];\n const m2 = uy * i[4 * t] + vy * i[4 * t + 2], m3 = uy * i[4 * t + 1] + vy * i[4 * t + 3];\n for (const v of [a, b, c]) {\n J[4 * v] += w * m0; J[4 * v + 1] += w * m1; J[4 * v + 2] += w * m2; J[4 * v + 3] += w * m3;\n weight[v] += w;\n }\n }\n for (let v = 0; v < nv; v++) {\n if (weight[v] === 0) { J[4 * v] = 1; J[4 * v + 3] = 1; continue; }\n for (let k = 0; k < 4; k++) J[4 * v + k] /= weight[v];\n }\n return J;\n}\n\n/*\n * A triangle's Bézier ordinates, 19 points. For corner i: its position F+i,\n * its ordinate toward the centroid S+i and the next one in, I+i. Toward the\n * corner after it, N+i, and the one before, P+i. M+k sits on the edge opposite\n * corner k, and C is the centroid.\n */\nconst F = 0, S = 3, I = 6, N = 9, P = 12, M = 15, C = 18;\nconst ORDINATES = 19;\n\nfunction buildOrdinates(V: Float64Array, T: Uint32Array, at: Float64Array, J: Float64Array, t: number, out: Float64Array): void {\n const vx = [0, 0, 0], vy = [0, 0, 0], v = [0, 0, 0];\n for (let k = 0; k < 3; k++) { v[k] = T[3 * t + k]; vx[k] = V[2 * v[k]]; vy[k] = V[2 * v[k] + 1]; }\n const sx = (vx[0] + vx[1] + vx[2]) / 3, sy = (vy[0] + vy[1] + vy[2]) / 3;\n const set = (o: number, x: number, y: number) => { out[2 * o] = x; out[2 * o + 1] = y; };\n const x = (o: number) => out[2 * o], y = (o: number) => out[2 * o + 1];\n // Corner k's tangent plane, a third of the way to (px, py).\n const toward = (o: number, k: number, px: number, py: number) => {\n const dx = (px - vx[k]) / 3, dy = (py - vy[k]) / 3, j = 4 * v[k];\n set(o, at[2 * v[k]] + J[j] * dx + J[j + 1] * dy, at[2 * v[k] + 1] + J[j + 2] * dx + J[j + 3] * dy);\n };\n for (let k = 0; k < 3; k++) {\n const n = (k + 1) % 3, p = (k + 2) % 3;\n set(F + k, at[2 * v[k]], at[2 * v[k] + 1]);\n toward(S + k, k, sx, sy);\n toward(N + k, k, vx[n], vy[n]);\n toward(P + k, k, vx[p], vy[p]);\n }\n // The edge ordinate that makes the derivative along the edge's normal linear\n // along the edge: then both triangles beside it agree on it.\n for (let k = 0; k < 3; k++) {\n const a = (k + 1) % 3, b = (k + 2) % 3;\n const ex = vx[b] - vx[a], ey = vy[b] - vy[a];\n const lb = ((sx - vx[a]) * ex + (sy - vy[a]) * ey) / (ex * ex + ey * ey), la = 1 - lb;\n const mid = (c: (o: number) => number) => la * c(N + a) + lb * c(P + b)\n + 0.5 * (c(S + a) - la * c(F + a) - lb * c(N + a) + c(S + b) - la * c(P + b) - lb * c(F + b));\n set(M + k, mid(x), mid(y));\n }\n for (let k = 0; k < 3; k++) {\n // The ordinate beside corner k's on the spoke to the centroid, between the two edges that meet at k.\n const e1 = M + (k + 1) % 3, e2 = M + (k + 2) % 3;\n set(I + k, (x(S + k) + x(e1) + x(e2)) / 3, (y(S + k) + y(e1) + y(e2)) / 3);\n }\n set(C, (x(I) + x(I + 1) + x(I + 2)) / 3, (y(I) + y(I + 1) + y(I + 2)) / 3);\n}\n\n/** For the piece beside the edge opposite each corner, where each of its ten ordinates sits, in term order. */\nconst PIECES = [0, 1, 2].map((k) => {\n const a = (k + 1) % 3, b = (k + 2) % 3;\n return Int32Array.from([F + a, F + b, C, N + a, P + b, S + a, I + a, S + b, I + b, M + k], (o) => 2 * o);\n});\n\n/**\n * The cubic piece's value at weights `w` (on corners 0, 1, 2) inside the\n * triangle, plus its derivative along the weight step `d` where one is given.\n */\nfunction evaluate(o: Float64Array, base: number, w: readonly number[], d: readonly number[] = [0, 0, 0]): { x: number; y: number } {\n const k = w[0] <= w[1] && w[0] <= w[2] ? 0 : w[1] <= w[2] ? 1 : 2;\n const a = (k + 1) % 3, b = (k + 2) % 3;\n const u = w[a] - w[k], v = w[b] - w[k], s = 3 * w[k];\n const du = d[a] - d[k], dv = d[b] - d[k], ds = 3 * d[k];\n const c0 = u * u * u + 3 * u * u * du;\n const c1 = v * v * v + 3 * v * v * dv;\n const c2 = s * s * s + 3 * s * s * ds;\n const c3 = 3 * (u * u * v + 2 * u * v * du + u * u * dv);\n const c4 = 3 * (u * v * v + v * v * du + 2 * u * v * dv);\n const c5 = 3 * (u * u * s + 2 * u * s * du + u * u * ds);\n const c6 = 3 * (u * s * s + s * s * du + 2 * u * s * ds);\n const c7 = 3 * (v * v * s + 2 * v * s * dv + v * v * ds);\n const c8 = 3 * (v * s * s + s * s * dv + 2 * v * s * ds);\n const c9 = 6 * (u * v * s + v * s * du + u * s * dv + u * v * ds);\n const q = PIECES[k];\n const sum = (c: number) =>\n c0 * o[base + q[0] + c] + c1 * o[base + q[1] + c] + c2 * o[base + q[2] + c] + c3 * o[base + q[3] + c]\n + c4 * o[base + q[4] + c] + c5 * o[base + q[5] + c] + c6 * o[base + q[6] + c] + c7 * o[base + q[7] + c]\n + c8 * o[base + q[8] + c] + c9 * o[base + q[9] + c];\n return { x: sum(0), y: sum(1) };\n}\n\n/**\n * The smooth map carrying `mesh` onto its vertices placed at `at`, read at a\n * point's spot. A spot outside its triangle, a point off the mesh, takes the\n * value and derivative at the nearest weights inside it and steps on from\n * there in a straight line, so the map runs on smoothly past the outline\n * without the cubic's growth far from it. Each triangle's\n * ordinates are built the first time a point lands in it.\n */\nexport function cloughTocherMap(mesh: ArapMesh, frames: RestFrames, at: Float64Array): (spot: MeshSpot) => { x: number; y: number } {\n const V = mesh.vertices, T = mesh.triangles;\n const J = vertexDerivatives(mesh, frames, at);\n const ordinates = new Float64Array(2 * ORDINATES * (T.length / 3));\n const built = new Uint8Array(T.length / 3);\n return (spot) => {\n const t = spot.tri;\n if (!built[t]) { buildOrdinates(V, T, at, J, t, ordinates.subarray(2 * ORDINATES * t, 2 * ORDINATES * (t + 1))); built[t] = 1; }\n const base = 2 * ORDINATES * t;\n const w = [spot.w0, spot.w1, spot.w2];\n if (w[0] >= 0 && w[1] >= 0 && w[2] >= 0) return evaluate(ordinates, base, w);\n const clamped = w.map((v) => Math.max(0, v));\n const sum = clamped[0] + clamped[1] + clamped[2];\n const near = clamped.map((v) => v / sum);\n return evaluate(ordinates, base, near, w.map((v, i) => v - near[i]));\n };\n}\n","/**\n * A point's place in a triangle mesh, as the triangle holding it and its\n * barycentric weights there, so the point can follow the triangle when the\n * mesh deforms. A point outside every triangle takes the nearest one's\n * weights, extended past its edge.\n */\nimport type { ArapMesh } from './arap';\n\n/** A triangle and a point's weights on its three corners. */\nexport interface MeshSpot {\n tri: number;\n w0: number;\n w1: number;\n w2: number;\n}\n\nconst EPS = 1e-9;\n\nfunction weights(V: Float64Array, T: Uint32Array, t: number, x: number, y: number): MeshSpot | null {\n const a = T[3 * t], b = T[3 * t + 1], c = T[3 * t + 2];\n const ax = V[2 * a], ay = V[2 * a + 1];\n const bx = V[2 * b] - ax, by = V[2 * b + 1] - ay;\n const cx = V[2 * c] - ax, cy = V[2 * c + 1] - ay;\n const det = bx * cy - by * cx;\n if (det === 0) return null;\n const px = x - ax, py = y - ay;\n const w1 = (px * cy - py * cx) / det;\n const w2 = (bx * py - by * px) / det;\n return { tri: t, w0: 1 - w1 - w2, w1, w2 };\n}\n\n/** How far outside its triangle a spot lies, in weight terms; 0 inside. */\nconst outside = (s: MeshSpot) => Math.max(0, -s.w0, -s.w1, -s.w2);\n\n/** A lookup of the spot each point of the plane takes in `mesh`, through a bucket grid. */\nexport function meshLocator(mesh: ArapMesh): (x: number, y: number) => MeshSpot | null {\n const V = mesh.vertices, T = mesh.triangles;\n const nt = T.length / 3;\n if (nt === 0) return () => null;\n let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n for (let i = 0; i < V.length; i += 2) {\n x0 = Math.min(x0, V[i]); x1 = Math.max(x1, V[i]); y0 = Math.min(y0, V[i + 1]); y1 = Math.max(y1, V[i + 1]);\n }\n const side = Math.max(1, Math.ceil(Math.sqrt(nt)));\n const cw = (x1 - x0) / side || 1, ch = (y1 - y0) / side || 1;\n const cell = (v: number, o: number, s: number) => Math.min(side - 1, Math.max(0, Math.floor((v - o) / s)));\n const buckets: number[][] = Array.from({ length: side * side }, () => []);\n for (let t = 0; t < nt; t++) {\n let tx0 = Infinity, ty0 = Infinity, tx1 = -Infinity, ty1 = -Infinity;\n for (let k = 0; k < 3; k++) {\n const v = T[3 * t + k];\n tx0 = Math.min(tx0, V[2 * v]); tx1 = Math.max(tx1, V[2 * v]);\n ty0 = Math.min(ty0, V[2 * v + 1]); ty1 = Math.max(ty1, V[2 * v + 1]);\n }\n for (let i = cell(tx0, x0, cw); i <= cell(tx1, x0, cw); i++) {\n for (let j = cell(ty0, y0, ch); j <= cell(ty1, y0, ch); j++) buckets[j * side + i].push(t);\n }\n }\n return (x, y) => {\n const ci = cell(x, x0, cw), cj = cell(y, y0, ch);\n let best: MeshSpot | null = null;\n let bestOut = Infinity;\n // Widen the search ring by ring until a triangle holds the point, or the\n // nearest found cannot be beaten by a farther ring.\n for (let r = 0; r < side; r++) {\n for (let i = ci - r; i <= ci + r; i++) {\n for (let j = cj - r; j <= cj + r; j++) {\n if (i < 0 || j < 0 || i >= side || j >= side) continue;\n if (Math.max(Math.abs(i - ci), Math.abs(j - cj)) !== r) continue;\n for (const t of buckets[j * side + i]) {\n const s = weights(V, T, t, x, y);\n if (!s) continue;\n const o = outside(s);\n if (o <= EPS) return s;\n if (o < bestOut) { bestOut = o; best = s; }\n }\n }\n }\n if (best && r >= 1) return best;\n }\n return best;\n };\n}\n\n/** Where `spot` lands on the mesh's vertices placed at `at`. */\nexport function placeSpot(T: Uint32Array, at: Float64Array, s: MeshSpot): { x: number; y: number } {\n const a = T[3 * s.tri], b = T[3 * s.tri + 1], c = T[3 * s.tri + 2];\n return {\n x: s.w0 * at[2 * a] + s.w1 * at[2 * b] + s.w2 * at[2 * c],\n y: s.w0 * at[2 * a + 1] + s.w1 * at[2 * b + 1] + s.w2 * at[2 * c + 1],\n };\n}\n","/**\n * Points added inside a triangulated region, and its triangles flipped toward\n * Delaunay (Lawson's flips): each added point splits the triangle holding it,\n * and an edge two triangles share is flipped while the far corner of one lies\n * inside the other's circumcircle. An edge only one triangle has — the\n * region's outline — is never flipped, so the triangles stay inside it.\n */\n\n/** Twice the signed area of `(a, b, c)`; positive when counter-clockwise. */\nfunction orient(V: number[], a: number, b: number, c: number): number {\n return (V[2 * b] - V[2 * a]) * (V[2 * c + 1] - V[2 * a + 1]) - (V[2 * b + 1] - V[2 * a + 1]) * (V[2 * c] - V[2 * a]);\n}\n\n/** Whether `d` lies inside the circle through counter-clockwise `(a, b, c)`. */\nfunction inCircle(V: number[], a: number, b: number, c: number, d: number): boolean {\n const ax = V[2 * a] - V[2 * d], ay = V[2 * a + 1] - V[2 * d + 1];\n const bx = V[2 * b] - V[2 * d], by = V[2 * b + 1] - V[2 * d + 1];\n const cx = V[2 * c] - V[2 * d], cy = V[2 * c + 1] - V[2 * d + 1];\n const det = (ax * ax + ay * ay) * (bx * cy - cx * by) - (bx * bx + by * by) * (ax * cy - cx * ay)\n + (cx * cx + cy * cy) * (ax * by - bx * ay);\n return det > 1e-12 * (ax * ax + ay * ay + bx * bx + by * by + cx * cx + cy * cy) ** 2;\n}\n\nclass Triangulation {\n readonly tris: number[] = [];\n /** Directed edge `a→b` to the triangle having it, counter-clockwise. */\n private readonly owner = new Map<number, number>();\n private readonly free: number[] = [];\n /** The triangle made last, where the next point's search starts. */\n private last = 0;\n\n constructor(private readonly V: number[], private readonly stride: number) {}\n\n private key(a: number, b: number): number { return a * this.stride + b; }\n\n add(a: number, b: number, c: number): number {\n const t = this.free.pop() ?? this.tris.length / 3;\n this.last = t;\n this.tris[3 * t] = a; this.tris[3 * t + 1] = b; this.tris[3 * t + 2] = c;\n this.owner.set(this.key(a, b), t); this.owner.set(this.key(b, c), t); this.owner.set(this.key(c, a), t);\n return t;\n }\n\n remove(t: number): void {\n const [a, b, c] = this.corners(t);\n for (const [u, v] of [[a, b], [b, c], [c, a]]) if (this.owner.get(this.key(u, v)) === t) this.owner.delete(this.key(u, v));\n this.tris[3 * t] = -1;\n this.free.push(t);\n }\n\n corners(t: number): [number, number, number] {\n return [this.tris[3 * t], this.tris[3 * t + 1], this.tris[3 * t + 2]];\n }\n\n /** The triangle across edge `a→b` and its corner off that edge, if any. */\n across(a: number, b: number): { t: number; c: number } | null {\n const t = this.owner.get(this.key(b, a));\n if (t === undefined) return null;\n const [x, y, z] = this.corners(t);\n return { t, c: x !== a && x !== b ? x : y !== a && y !== b ? y : z };\n }\n\n /** Flip edge `a→b` of the triangle `(a, b, p)` while the triangle across it disagrees. */\n legalize(a: number, b: number, p: number): void {\n const stack: [number, number, number][] = [[a, b, p]];\n while (stack.length > 0) {\n const [u, v, w] = stack.pop()!;\n const mine = this.owner.get(this.key(u, v));\n const other = this.across(u, v);\n if (mine === undefined || !other || !inCircle(this.V, u, v, w, other.c)) continue;\n const q = other.c;\n if (orient(this.V, u, q, w) <= 0 || orient(this.V, q, v, w) <= 0) continue;\n this.remove(mine);\n this.remove(other.t);\n this.add(u, q, w);\n this.add(q, v, w);\n stack.push([u, q, w], [q, v, w]);\n }\n }\n\n /** Whether triangle `t` holds `p`, and on which edge if on one: -1 outside, 3 strictly inside. */\n private holds(t: number, p: number): number {\n const V = this.V;\n const [a, b, c] = this.corners(t);\n const area = orient(V, a, b, c);\n const ws = [orient(V, b, c, p), orient(V, c, a, p), orient(V, a, b, p)];\n if (ws.some((w) => w < -1e-9 * area)) return -1;\n const flat = ws.findIndex((w) => w <= 1e-9 * area);\n return flat < 0 ? 3 : flat;\n }\n\n /** The triangle holding `p`: walked to from `from` across the edges `p` lies beyond, or\n * found by a scan when the walk leaves the region. */\n private locate(p: number, from: number): { t: number; on: number } | null {\n let t = from;\n for (let step = 0; t >= 0 && this.tris[3 * t] >= 0 && step < this.tris.length; step++) {\n const on = this.holds(t, p);\n if (on >= 0) return { t, on };\n const [a, b, c] = this.corners(t);\n const edge = [[b, c], [c, a], [a, b]].find(([u, v]) => orient(this.V, u, v, p) < 0)!;\n t = this.across(edge[0], edge[1])?.t ?? -1;\n }\n for (let s = 0; s < this.tris.length / 3; s++) {\n if (this.tris[3 * s] < 0) continue;\n const on = this.holds(s, p);\n if (on >= 0) return { t: s, on };\n }\n return null;\n }\n\n /** Split the triangle holding `p` (or the two sharing the edge it lies on). False when none holds it. */\n insert(p: number): boolean {\n const found = this.locate(p, this.last);\n if (!found) return false;\n const { t } = found;\n const [a, b, c] = this.corners(t);\n const flat = found.on === 3 ? -1 : found.on;\n if (flat < 0) {\n this.remove(t);\n this.add(a, b, p); this.add(b, c, p); this.add(c, a, p);\n this.legalize(a, b, p); this.legalize(b, c, p); this.legalize(c, a, p);\n return true;\n }\n // On edge u→v of this triangle, opposite corner w.\n const [u, v, w] = [[b, c, a], [c, a, b], [a, b, c]][flat];\n const other = this.across(u, v);\n this.remove(t);\n this.add(v, w, p); this.add(w, u, p);\n const rim: [number, number][] = [[v, w], [w, u]];\n if (other) {\n this.remove(other.t);\n this.add(u, other.c, p); this.add(other.c, v, p);\n rim.push([u, other.c], [other.c, v]);\n }\n for (const [x, y] of rim) this.legalize(x, y, p);\n return true;\n }\n}\n\n/**\n * `triangles` over `coords`, with the points from vertex `firstInner` on\n * inserted inside it and every triangle flipped toward Delaunay. A point no\n * triangle holds is left out of the mesh. Returns the new triangles.\n */\nexport function refineTriangulation(coords: number[], triangles: ArrayLike<number>, firstInner: number): number[] {\n const n = coords.length / 2;\n const mesh = new Triangulation(coords, n);\n for (let i = 0; i + 2 < triangles.length; i += 3) {\n const [a, b, c] = [triangles[i], triangles[i + 1], triangles[i + 2]];\n const o = orient(coords, a, b, c);\n if (o > 0) mesh.add(a, b, c);\n else if (o < 0) mesh.add(a, c, b);\n }\n const live = () => Array.from({ length: mesh.tris.length / 3 }, (_, t) => t).filter((t) => mesh.tris[3 * t] >= 0);\n for (const t of live()) {\n if (mesh.tris[3 * t] < 0) continue;\n const [a, b, c] = mesh.corners(t);\n mesh.legalize(a, b, c); mesh.legalize(b, c, a); mesh.legalize(c, a, b);\n }\n for (let p = firstInner; p < n; p++) mesh.insert(p);\n return live().flatMap((t) => mesh.corners(t));\n}\n","/**\n * The mesh a puppet warp deforms: the path's filled region triangulated with\n * its outline as the triangles' edges, so two parts of the shape share a\n * triangle only where the fill joins them. Interior points on an even lattice\n * keep the triangles near equilateral, and each pin gets a vertex of its own.\n */\nimport earcut from 'earcut';\nimport type { PolygonPath } from '../path';\nimport type { Point } from '../paths/cubicMath';\nimport { boundsOfPath } from '../paths/bounds';\nimport { pointInPolygon } from '../polyline';\nimport { flattenPolygon } from '../tessellate/tessellate';\nimport { resolveCrossings, type FlattenedContours } from '../tessellate/crossings';\nimport { nestRings } from '../tessellate/nesting';\nimport type { ArapMesh } from './arap';\nimport { refineTriangulation } from './refine';\nimport { addOrigin } from '../paths/pathOrigin';\n\n/** A puppet's mesh, and the vertex standing for each pin. */\nexport interface PuppetMesh extends ArapMesh {\n pinVertex: Int32Array;\n}\n\n/** Options for {@link puppetMesh}. */\nexport interface PuppetMeshOptions {\n /** Roughly how many vertices to spread over the region. Default 400. */\n vertices?: number;\n}\n\ninterface MeshPoint {\n x: number;\n y: number;\n pins: number[];\n}\n\n/** One filled piece: its outline, its holes, and the points inside it. */\ninterface Region {\n rings: MeshPoint[][];\n inner: MeshPoint[];\n}\n\nfunction ringsOf(path: PolygonPath, tolerance: number): { flat: FlattenedContours; filled: (w: number) => boolean } {\n const flat = flattenPolygon(path, tolerance);\n addOrigin(path, flat.coords);\n if (path.fillRule === 'evenodd') return { flat, filled: (w) => w % 2 !== 0 };\n const crossed = resolveCrossings(flat);\n const nonzero = (w: number) => w !== 0;\n if (crossed) return { flat: crossed, filled: nonzero };\n const simple = nestRings(flat).every((r) => Math.abs(r.winding) <= 1);\n return { flat: simple ? flat : resolveCrossings(flat, true)!, filled: nonzero };\n}\n\n/** The ring from vertex `start` to `end` of `coords`, with no edge longer than `h`. */\nfunction resample(coords: number[], start: number, end: number, h: number): MeshPoint[] {\n const out: MeshPoint[] = [];\n for (let i = start; i < end; i++) {\n const j = i + 1 === end ? start : i + 1;\n const ax = coords[2 * i], ay = coords[2 * i + 1];\n const steps = Math.max(1, Math.ceil(Math.hypot(coords[2 * j] - ax, coords[2 * j + 1] - ay) / h));\n for (let k = 0; k < steps; k++) {\n const t = k / steps;\n out.push({ x: ax + (coords[2 * j] - ax) * t, y: ay + (coords[2 * j + 1] - ay) * t, pins: [] });\n }\n }\n return out.filter((p, i) => {\n const q = out[(i + 1) % out.length];\n return out.length < 2 || p.x !== q.x || p.y !== q.y;\n });\n}\n\nfunction regionsOf(path: PolygonPath, tolerance: number, h: number): { regions: Region[]; area: number } {\n const { flat, filled } = ringsOf(path, tolerance);\n const rings = nestRings(flat);\n const regions = new Map<number, Region>();\n let area = 0;\n rings.forEach((r, i) => {\n if (r.area === 0 || !filled(r.winding)) return;\n if (r.parent >= 0 && filled(rings[r.parent].winding)) return;\n regions.set(i, { rings: [resample(flat.coords, r.start, r.end, h)], inner: [] });\n area += Math.abs(r.area);\n });\n rings.forEach((r) => {\n const outer = r.area !== 0 && !filled(r.winding) ? regions.get(r.parent) : undefined;\n if (!outer) return;\n outer.rings.push(resample(flat.coords, r.start, r.end, h));\n area -= Math.abs(r.area);\n });\n return { regions: [...regions.values()], area };\n}\n\nconst flatRing = (ring: MeshPoint[]) => ring.flatMap((p) => [p.x, p.y]);\n\nfunction inside(region: Region, x: number, y: number, flats = region.rings.map(flatRing)): boolean {\n return flats.every((ring, i) => pointInPolygon(ring, x, y) === (i === 0));\n}\n\n/** The nearest point on any ring of `region` to `(x, y)`. */\nfunction nearestEdge(region: Region, x: number, y: number): { d: number; ring: number; edge: number; t: number } {\n let best = { d: Infinity, ring: 0, edge: 0, t: 0 };\n region.rings.forEach((ring, r) => ring.forEach((a, i) => {\n const b = ring[(i + 1) % ring.length];\n const dx = b.x - a.x, dy = b.y - a.y;\n const len2 = dx * dx + dy * dy;\n const t = len2 > 0 ? Math.max(0, Math.min(1, ((x - a.x) * dx + (y - a.y) * dy) / len2)) : 0;\n const d = Math.hypot(a.x + dx * t - x, a.y + dy * t - y);\n if (d < best.d) best = { d, ring: r, edge: i, t };\n }));\n return best;\n}\n\n/** Give pin `k` a vertex: on the outline where it is on or outside it, inside where it is inside. */\nfunction placePin(regions: Region[], pin: Point, k: number, h: number): void {\n const home = regions.find((r) => inside(r, pin.x, pin.y));\n const near = (home ? [home] : regions)\n .map((region) => ({ region, ...nearestEdge(region, pin.x, pin.y) }))\n .reduce((a, b) => (b.d < a.d ? b : a));\n const snap = 0.25 * h;\n if (home && near.d > snap) {\n const same = home.inner.find((p) => Math.hypot(p.x - pin.x, p.y - pin.y) < 1e-9 * h);\n if (same) same.pins.push(k);\n else home.inner.push({ x: pin.x, y: pin.y, pins: [k] });\n return;\n }\n const ring = near.region.rings[near.ring];\n const a = ring[near.edge], b = ring[(near.edge + 1) % ring.length];\n const at = { x: a.x + (b.x - a.x) * near.t, y: a.y + (b.y - a.y) * near.t };\n const da = Math.hypot(at.x - a.x, at.y - a.y), db = Math.hypot(at.x - b.x, at.y - b.y);\n if (Math.min(da, db) <= snap) (da <= db ? a : b).pins.push(k);\n else ring.splice(near.edge + 1, 0, { ...at, pins: [k] });\n}\n\n/** Whether any edge of `rings` passes within `r` of a point, through a grid of cells `r` wide. */\nfunction clearanceTest(rings: MeshPoint[][], r: number): (x: number, y: number) => boolean {\n const cells = new Map<string, [MeshPoint, MeshPoint][]>();\n const key = (i: number, j: number) => `${i},${j}`;\n for (const ring of rings) {\n ring.forEach((a, n) => {\n const b = ring[(n + 1) % ring.length];\n for (let i = Math.floor(Math.min(a.x, b.x) / r); i <= Math.floor(Math.max(a.x, b.x) / r); i++) {\n for (let j = Math.floor(Math.min(a.y, b.y) / r); j <= Math.floor(Math.max(a.y, b.y) / r); j++) {\n const k = key(i, j);\n const list = cells.get(k);\n if (list) list.push([a, b]);\n else cells.set(k, [[a, b]]);\n }\n }\n });\n }\n return (x, y) => {\n const ci = Math.floor(x / r), cj = Math.floor(y / r);\n for (let i = ci - 1; i <= ci + 1; i++) {\n for (let j = cj - 1; j <= cj + 1; j++) {\n for (const [a, b] of cells.get(key(i, j)) ?? []) {\n const dx = b.x - a.x, dy = b.y - a.y;\n const len2 = dx * dx + dy * dy;\n const t = len2 > 0 ? Math.max(0, Math.min(1, ((x - a.x) * dx + (y - a.y) * dy) / len2)) : 0;\n if (Math.hypot(a.x + dx * t - x, a.y + dy * t - y) < r) return true;\n }\n }\n }\n return false;\n };\n}\n\n/** Where the horizontal line at `y` crosses any of `rings`, sorted; a point on it is inside where an odd count lie left of it. */\nfunction crossingsAt(rings: MeshPoint[][], y: number): number[] {\n const xs: number[] = [];\n for (const ring of rings) {\n ring.forEach((a, n) => {\n const b = ring[(n + 1) % ring.length];\n if ((a.y > y) !== (b.y > y)) xs.push(a.x + ((y - a.y) * (b.x - a.x)) / (b.y - a.y));\n });\n }\n return xs.sort((p, q) => p - q);\n}\n\n/** Points of a triangular lattice of spacing `h` inside `region`, clear of its outline and its pins. */\nfunction fillLattice(region: Region, h: number): void {\n const outer = region.rings[0];\n let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n for (const p of outer) { x0 = Math.min(x0, p.x); y0 = Math.min(y0, p.y); x1 = Math.max(x1, p.x); y1 = Math.max(y1, p.y); }\n const pins = [...region.inner];\n const nearOutline = clearanceTest(region.rings, 0.5 * h);\n const rowH = h * Math.sqrt(3) / 2;\n for (let row = 0, y = y0 + rowH / 2; y < y1; row++, y += rowH) {\n const xs = crossingsAt(region.rings, y);\n let left = 0;\n for (let x = x0 + (row % 2 ? h / 2 : h / 4); x < x1; x += h) {\n while (left < xs.length && xs[left] < x) left++;\n if (left % 2 === 0 || nearOutline(x, y)) continue;\n if (pins.some((p) => Math.hypot(p.x - x, p.y - y) < 0.5 * h)) continue;\n region.inner.push({ x, y, pins: [] });\n }\n }\n}\n\n/**\n * The mesh a puppet with pins at `pins` deforms over `path`'s fill. A pin\n * inside the fill gets a vertex where it is; one on the outline, or off the\n * shape, gets the nearest point of the outline. Pins on one spot share a vertex.\n */\nexport function puppetMesh(path: PolygonPath, pins: readonly Point[], opts: PuppetMeshOptions = {}): PuppetMesh {\n const box = boundsOfPath(path);\n const size = Math.max(box.width, box.height);\n const empty = { vertices: new Float64Array(0), triangles: new Uint32Array(0), pinVertex: new Int32Array(pins.length).fill(-1) };\n if (!(size > 0)) return empty;\n const tolerance = size / 1000;\n const rough = regionsOf(path, tolerance, size);\n const h = Math.max(Math.sqrt(Math.max(rough.area, 0) / (opts.vertices ?? 400)), size / 400);\n const { regions } = regionsOf(path, tolerance, h);\n if (regions.length === 0) return empty;\n pins.forEach((p, k) => placePin(regions, p, k, h));\n const vertices: number[] = [];\n const triangles: number[] = [];\n const pinVertex = new Int32Array(pins.length).fill(-1);\n for (const region of regions) {\n fillLattice(region, h);\n const points = [...region.rings.flat(), ...region.inner];\n const holes: number[] = [];\n let at = 0;\n for (const ring of region.rings) { if (at > 0) holes.push(at); at += ring.length; }\n const offset = vertices.length / 2;\n const coords = points.flatMap((p) => [p.x, p.y]);\n const outline = earcut(coords.slice(0, 2 * at), holes.length > 0 ? holes : undefined);\n for (const t of refineTriangulation(coords, outline, at)) triangles.push(t + offset);\n points.forEach((p, i) => { for (const k of p.pins) pinVertex[k] = offset + i; });\n vertices.push(...coords);\n }\n return { vertices: Float64Array.from(vertices), triangles: Uint32Array.from(triangles), pinVertex };\n}\n","/**\n * Puppet deformation: pins placed on a shape and dragged, with everything\n * between them moved as rigidly as the pins allow. The shape's fill is\n * triangulated (`puppetMesh`) and deformed as-rigid-as-possible (`arap`), so\n * the pull of a pin travels through the shape: two limbs that nearly touch\n * share no triangle and move apart. A point is carried by a smooth\n * (Clough–Tocher) interpolation of the deformed mesh, so a bend has no kink\n * where two triangles meet.\n */\nimport type { PolygonPath } from '../path';\nimport type { Point } from '../paths/cubicMath';\nimport { createArapSolver, type ArapSolveOptions, type ArapSolver } from './arap';\nimport { cloughTocherMap, restFrames, type RestFrames } from './cloughTocher';\nimport { meshLocator, type MeshSpot } from './meshMap';\nimport { puppetMesh, type PuppetMesh } from './puppetMesh';\n\n/** A pin: where it was placed on the unwarped shape, and where it is now. */\nexport interface PuppetPin {\n from: Point;\n to: Point;\n}\n\n/** What a pin set costs to set up once: the mesh, its factored solve, and its point lookup. */\ninterface Rig {\n key: string;\n mesh: PuppetMesh;\n frames: RestFrames;\n solver: ArapSolver;\n locate: (x: number, y: number) => MeshSpot | null;\n spots: Map<number, Map<number, MeshSpot | null>>;\n remembered: number;\n}\n\nconst rigs = new WeakMap<PolygonPath, Rig>();\n\nfunction rigFor(source: PolygonPath, pins: readonly PuppetPin[]): Rig {\n const key = pins.map((p) => `${p.from.x},${p.from.y}`).join(';');\n const held = rigs.get(source);\n if (held?.key === key) return held;\n const mesh = puppetMesh(source, pins.map((p) => p.from));\n const pinned = [...new Set(Array.from(mesh.pinVertex).filter((v) => v >= 0))];\n const rig: Rig = { key, mesh, frames: restFrames(mesh), solver: createArapSolver(mesh, pinned), locate: meshLocator(mesh), spots: new Map(), remembered: 0 };\n rigs.set(source, rig);\n return rig;\n}\n\n/**\n * The map `pins` make of `source`'s fill: smooth across the deformed mesh,\n * through every pin, and carried on past the outline for a point off the\n * shape. The mesh and its solve are set up once per source and pin set, so\n * moving pins only re-solves. No pins, or none moved, is the identity, and\n * one pin moves the whole shape with it.\n */\nexport function puppetMap(source: PolygonPath, pins: readonly PuppetPin[]): (p: Point) => Point {\n if (pins.every((p) => p.to.x === p.from.x && p.to.y === p.from.y)) return (p) => ({ x: p.x, y: p.y });\n const rig = rigFor(source, pins);\n const at = solveRig(rig, pins);\n if (!at) {\n const dx = pins[0].to.x - pins[0].from.x, dy = pins[0].to.y - pins[0].from.y;\n return (p) => ({ x: p.x + dx, y: p.y + dy });\n }\n const place = cloughTocherMap(rig.mesh, rig.frames, at);\n return (p) => {\n const spot = spotOf(rig, p);\n return spot ? place(spot) : { x: p.x, y: p.y };\n };\n}\n\n/** The rig's vertices under `pins`, or null when no pin landed on the mesh. */\nfunction solveRig(rig: Rig, pins: readonly PuppetPin[], opts?: ArapSolveOptions): Float64Array | null {\n const targets: number[] = [];\n const seen = new Set<number>();\n pins.forEach((pin, k) => {\n const v = rig.mesh.pinVertex[k];\n if (v < 0 || seen.has(v)) return;\n seen.add(v);\n // A pin off the outline holds the outline point it snapped to, carried by its own drag.\n targets.push(pin.to.x + rig.mesh.vertices[2 * v] - pin.from.x, pin.to.y + rig.mesh.vertices[2 * v + 1] - pin.from.y);\n });\n return targets.length === 0 ? null : rig.solver.solve(targets, opts);\n}\n\n/**\n * The mesh `puppetMap` deforms for `pins` and where its vertices land, solved\n * with `opts` — its `trace` reports every stage of the solve, and its round\n * caps bound it. With the default options the vertices are the ones\n * `puppetMap` places points by. Null with no pins, or when none landed on the\n * mesh (then `puppetMap` moves the shape with the first pin).\n */\nexport function puppetSolve(\n source: PolygonPath,\n pins: readonly PuppetPin[],\n opts?: ArapSolveOptions,\n): { mesh: PuppetMesh; vertices: Float64Array } | null {\n if (pins.length === 0) return null;\n const rig = rigFor(source, pins);\n const vertices = solveRig(rig, pins, opts);\n return vertices ? { mesh: rig.mesh, vertices } : null;\n}\n\n/** How many points a rig remembers the spot of before starting over. */\nconst SPOT_CAP = 1 << 16;\n\n/** Where `p` sits in the rig's mesh. A drag maps the same samples of the path\n * every frame, so each is looked up once per pin set. */\nfunction spotOf(rig: Rig, p: Point): MeshSpot | null {\n let row = rig.spots.get(p.x);\n const hit = row?.get(p.y);\n if (hit !== undefined) return hit;\n const spot = rig.locate(p.x, p.y);\n if (++rig.remembered > SPOT_CAP) { rig.spots.clear(); rig.remembered = 1; row = undefined; }\n if (!row) { row = new Map(); rig.spots.set(p.x, row); }\n row.set(p.y, spot);\n return spot;\n}\n\n/**\n * The point `map` sends to `target`, found by stepping from `guess` by the\n * miss until it is within `tolerance` — for a map that stays close to rigid,\n * as a puppet's does, a few steps suffice. Returns the best point found.\n */\nexport function unwarpPoint(\n map: (p: Point) => Point,\n target: Point,\n guess: Point = target,\n tolerance = 1e-3,\n): Point {\n let p = { x: guess.x, y: guess.y };\n for (let k = 0; k < 50; k++) {\n const at = map(p);\n const ex = target.x - at.x, ey = target.y - at.y;\n if (Math.hypot(ex, ey) <= tolerance) break;\n p = { x: p.x + ex, y: p.y + ey };\n }\n return p;\n}\n","import type { PolygonPath } from '../path';\nimport { anchorsToPath, pathToAnchors, type PenAnchor } from '../paths/anchors';\nimport { cubicPointAt, type Point } from '../paths/cubicMath';\nimport { fitPointRun, keepCorner } from '../paths/fitRun';\nimport { nearestOnLine } from '../nearest';\n\n/** Options for {@link warpPath}. */\nexport interface WarpPathOptions {\n /** How far, in output units, the refitted curves may stray from the warped\n * original. Default 0.5. */\n tolerance?: number;\n}\n\nconst MIN_SAMPLES = 8;\nconst MAX_SAMPLES = 64;\n/** How far the warped curve may stray from the chord between two samples, as a share of the tolerance. */\nconst FLATNESS = 0.25;\n/** Most times a span between two even samples is halved where the warp bends it. */\nconst MAX_HALVINGS = 6;\n/** How far along a segment, as a curve parameter, its end tangent is read. */\nconst TANGENT_STEP = 1e-3;\n\n/**\n * `path` carried through `map`, point by point, and refitted as cubics within\n * `tolerance` of the warped curve. Every anchor stays an anchor, at the point\n * it maps to, so the result edits like the original; a segment the map keeps\n * straight stays a straight segment, and one it bends gains anchors only where\n * one cubic cannot follow it. Fill rules carry over.\n */\nexport function warpPath(\n path: PolygonPath,\n map: (p: Point) => Point,\n opts: WarpPathOptions = {},\n): PolygonPath {\n const tol = Math.max(opts.tolerance ?? 0.5, 1e-6);\n const { anchors, closed } = pathToAnchors(path);\n const out: PenAnchor[][] = anchors.map((sub, s) => warpSubpath(sub, closed[s], map, tol));\n return anchorsToPath(out, closed, path);\n}\n\nfunction warpSubpath(sub: PenAnchor[], closed: boolean, map: (p: Point) => Point, tol: number): PenAnchor[] {\n const n = sub.length;\n if (n === 0) return [];\n const out: PenAnchor[] = [];\n const segments = closed && n > 1 ? n : n - 1;\n if (segments === 0) return [map(sub[0])];\n for (let i = 0; i < segments; i++) {\n const a = sub[i];\n const b = sub[(i + 1) % n];\n const at = segmentAt(a, b);\n const count = sampleCount(a, b, tol);\n const pts = sampleWarped((t) => map(at(t)), count, tol);\n const start = pts[0];\n const end = pts[pts.length - 1];\n const tStart = unit(sub2(map(at(TANGENT_STEP)), start));\n const tEnd = unit(sub2(map(at(1 - TANGENT_STEP)), end));\n const run = dedupe(pts);\n const closing = closed && i === segments - 1;\n if (run.length < 2) {\n if (out.length === 0) out.push({ x: start.x, y: start.y });\n if (!closing) { out.push({ x: end.x, y: end.y }); keepCorner(out[out.length - 1], b); }\n continue;\n }\n fitPointRun(run, tStart, tEnd, tol, out, closing);\n if (!closing) keepCorner(out[out.length - 1], b);\n }\n keepCorner(out[0], sub[0]);\n return out;\n}\n\n/** The segment from `a` to `b` as a function of its curve parameter. */\nfunction segmentAt(a: PenAnchor, b: PenAnchor): (t: number) => Point {\n if (!a.outHandle && !b.inHandle) return (t) => ({ x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t });\n const c1 = a.outHandle ?? a;\n const c2 = b.inHandle ?? b;\n return (t) => cubicPointAt(a, c1, c2, b, t);\n}\n\n/** Samples enough to resolve a bend on the scale of the tolerance, within bounds. */\nfunction sampleCount(a: PenAnchor, b: PenAnchor, tol: number): number {\n const c1 = a.outHandle ?? a;\n const c2 = b.inHandle ?? b;\n const len = Math.hypot(c1.x - a.x, c1.y - a.y) + Math.hypot(c2.x - c1.x, c2.y - c1.y) + Math.hypot(b.x - c2.x, b.y - c2.y);\n return Math.min(MAX_SAMPLES, Math.max(MIN_SAMPLES, Math.ceil(len / (8 * tol))));\n}\n\n/**\n * The warped curve sampled `count` times evenly in its parameter, then halved\n * wherever it strays from the chord between two samples by more than a share\n * of `tol`: a warp can bend a stretch the even samples step straight over,\n * and the refit reads the curve only through them.\n */\nfunction sampleWarped(curve: (t: number) => Point, count: number, tol: number): Point[] {\n const flat = FLATNESS * tol;\n const out: Point[] = [curve(0)];\n const span = (t0: number, p0: Point, t1: number, p1: Point, depth: number) => {\n const tm = (t0 + t1) / 2;\n const pm = curve(tm);\n if (depth < MAX_HALVINGS && fromChord(pm, p0, p1) > flat) {\n span(t0, p0, tm, pm, depth + 1);\n span(tm, pm, t1, p1, depth + 1);\n } else {\n out.push(p1);\n }\n };\n for (let k = 0; k < count; k++) span(k / count, out[out.length - 1], (k + 1) / count, curve((k + 1) / count), 0);\n return out;\n}\n\n/** How far `p` lies from the segment `a`–`b`. */\nfunction fromChord(p: Point, a: Point, b: Point): number {\n return nearestOnLine(p.x, p.y, a.x, a.y, b.x, b.y).dist;\n}\n\nfunction dedupe(pts: Point[]): Point[] {\n return pts.filter((p, i) => i === 0 || p.x !== pts[i - 1].x || p.y !== pts[i - 1].y);\n}\n\nconst sub2 = (p: Point, q: Point): Point => ({ x: p.x - q.x, y: p.y - q.y });\nfunction unit(p: Point): Point {\n const len = Math.hypot(p.x, p.y);\n return len === 0 ? { x: 0, y: 0 } : { x: p.x / len, y: p.y / len };\n}\n","/**\n * A warp as data: what a shape was warped by, held beside the shape so the\n * warp can be edited again later. Each kind names its controls in the same\n * space as the path it warps.\n */\nimport type { PolygonPath } from '../path';\nimport type { Point } from '../paths/cubicMath';\nimport { meshGridFrom, meshGridOver, bicubicMesh, coonsMesh, type MeshGrid } from './mesh';\nimport { puppetMap, type PuppetPin } from './puppet';\nimport { bilinearQuad, projectiveQuad, type Quad, type UvMap } from './quad';\nimport { warpPath } from './warpPath';\n\n/** An axis-aligned box: the area a distort or an envelope was laid over. */\nexport interface WarpBox {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** How a distort maps its box onto its corners. `free` is bilinear, and bends\n * straight lines; `perspective` is projective, and keeps them straight. */\nexport type DistortMode = 'free' | 'perspective';\n\n/** How an envelope interpolates its mesh. See `bicubicMesh` and `coonsMesh`. */\nexport type EnvelopeMapping = 'bicubic' | 'coons';\n\n/** The box's four corners, each dragged on its own. */\nexport interface DistortWarp {\n kind: 'distort';\n mode: DistortMode;\n box: WarpBox;\n /** Where the box's top-left, top-right, bottom-right and bottom-left went. */\n corners: Quad;\n}\n\n/** A grid of control points laid over the box. */\nexport interface EnvelopeWarp {\n kind: 'envelope';\n mapping: EnvelopeMapping;\n box: WarpBox;\n mesh: MeshGrid;\n}\n\n/** Pins on the shape, each dragged on its own. */\nexport interface PuppetWarp {\n kind: 'puppet';\n pins: readonly PuppetPin[];\n}\n\n/** Any of the warps a path can hold. */\nexport type PathWarp = DistortWarp | EnvelopeWarp | PuppetWarp;\n\n/** A distort over `box` that leaves it where it is. */\nexport function distortOver(box: WarpBox, mode: DistortMode = 'free'): DistortWarp {\n const { x, y, width: w, height: h } = box;\n return {\n kind: 'distort',\n mode,\n box: { ...box },\n corners: [{ x, y }, { x: x + w, y }, { x: x + w, y: y + h }, { x, y: y + h }],\n };\n}\n\n/** An envelope of `rows` × `cols` patches over `box` that leaves it where it is. */\nexport function envelopeOver(\n box: WarpBox,\n rows: number,\n cols: number,\n mapping: EnvelopeMapping = 'bicubic',\n): EnvelopeWarp {\n return { kind: 'envelope', mapping, box: { ...box }, mesh: meshGridOver(box, rows, cols) };\n}\n\n/** `warp` with a mesh of `rows` × `cols` patches, placed where the current\n * mesh carries an even grid, so the shape changes as little as a coarser or\n * finer grid allows. */\nexport function resizeEnvelope(warp: EnvelopeWarp, rows: number, cols: number): EnvelopeWarp {\n if (warp.mesh.rows === rows && warp.mesh.cols === cols) return warp;\n return { ...warp, mesh: meshGridFrom(envelopeUvMap(warp), rows, cols) };\n}\n\nfunction envelopeUvMap(warp: EnvelopeWarp): UvMap {\n return warp.mapping === 'coons' ? coonsMesh(warp.mesh) : bicubicMesh(warp.mesh);\n}\n\nfunction boxUv(box: WarpBox, uv: UvMap): (p: Point) => Point {\n const sx = box.width === 0 ? 0 : 1 / box.width;\n const sy = box.height === 0 ? 0 : 1 / box.height;\n return (p) => uv((p.x - box.x) * sx, (p.y - box.y) * sy);\n}\n\n/**\n * Where `warp`, laid over `source`, sends each point of the plane. A\n * perspective distort whose corners no longer make a convex quad has no\n * projective map, and falls back to the bilinear one until they do. Only a\n * puppet reads `source`: its pins pull through the shape's fill.\n */\nexport function pathWarpMap(warp: PathWarp, source: PolygonPath): (p: Point) => Point {\n switch (warp.kind) {\n case 'distort': {\n const uv = (warp.mode === 'perspective' ? projectiveQuad(warp.corners) : null) ?? bilinearQuad(warp.corners);\n return boxUv(warp.box, uv);\n }\n case 'envelope':\n return boxUv(warp.box, envelopeUvMap(warp));\n case 'puppet':\n return puppetMap(source, warp.pins);\n }\n}\n\n/** `source` warped by `warp`, refitted within `tolerance` (`warpPath`). */\nexport function applyPathWarp(source: PolygonPath, warp: PathWarp, tolerance = 0.5): PolygonPath {\n return warpPath(source, pathWarpMap(warp, source), { tolerance });\n}\n\n/** The points a user drags to change `warp`: a distort's corners, an\n * envelope's mesh points, a puppet's pins where they are now. */\nexport function warpControls(warp: PathWarp): readonly Point[] {\n switch (warp.kind) {\n case 'distort': return warp.corners;\n case 'envelope': return warp.mesh.points;\n case 'puppet': return warp.pins.map((p) => p.to);\n }\n}\n\n/** `warp` with control `index` (as {@link warpControls} counts them) at `to`. */\nexport function moveWarpControl(warp: PathWarp, index: number, to: Point): PathWarp {\n const at = { x: to.x, y: to.y };\n switch (warp.kind) {\n case 'distort': {\n const corners = [...warp.corners] as [Point, Point, Point, Point];\n if (index < 0 || index > 3) return warp;\n corners[index] = at;\n return { ...warp, corners };\n }\n case 'envelope': {\n if (index < 0 || index >= warp.mesh.points.length) return warp;\n const points = [...warp.mesh.points];\n points[index] = at;\n return { ...warp, mesh: { ...warp.mesh, points } };\n }\n case 'puppet': {\n if (index < 0 || index >= warp.pins.length) return warp;\n return { ...warp, pins: warp.pins.map((p, i) => (i === index ? { from: p.from, to: at } : p)) };\n }\n }\n}\n"]}
|