@weasel-js/geom 1.13.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bvh/bvhTree.ts","../src/bvh/bvhQuery.ts","../src/bvh/bvh.ts"],"names":["grow"],"mappings":"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","file":"chunk-XXNK4N7Z.js","sourcesContent":["/** Storage and topology for `createBvh`: flat typed arrays for nodes and\n * items, the top-down build, and the leaf split an insert triggers. */\n\nexport const LEAF_SIZE = 4;\n\n/** Node and item storage. A node with `left[n] === -1` is a leaf holding\n * `leafCount[n]` item indices at `leafItems[n * LEAF_SIZE]`; `count[n]` is\n * the number of items under `n`. */\nexport class BvhTree<K> {\n readonly dim: number;\n root = -1;\n nodeBox: Float64Array;\n left: Int32Array;\n right: Int32Array;\n parent: Int32Array;\n leafCount: Int32Array;\n leafItems: Int32Array;\n count: Int32Array;\n private nodeCap = 0;\n private nodeTop = 0;\n private freeNodes: number[] = [];\n\n itemBox: Float64Array;\n /** Twice each item's box center, `[item * dim + axis]`: what a build splits on. */\n itemCentroid2: Float64Array;\n itemLeaf: Int32Array;\n keys: (K | undefined)[] = [];\n private itemCap = 0;\n private itemTop = 0;\n private freeItems: number[] = [];\n\n constructor(dim: number) {\n this.dim = dim;\n this.nodeBox = new Float64Array(0);\n this.left = this.right = this.parent = this.leafCount = this.leafItems = this.count = new Int32Array(0);\n this.itemBox = new Float64Array(0);\n this.itemCentroid2 = new Float64Array(0);\n this.itemLeaf = new Int32Array(0);\n this.growNodes(16);\n this.growItems(16);\n }\n\n private growNodes(cap: number): void {\n const s = 2 * this.dim;\n this.nodeBox = grow(this.nodeBox, cap * s);\n this.left = grow(this.left, cap);\n this.right = grow(this.right, cap);\n this.parent = grow(this.parent, cap);\n this.leafCount = grow(this.leafCount, cap);\n this.leafItems = grow(this.leafItems, cap * LEAF_SIZE);\n this.count = grow(this.count, cap);\n this.nodeCap = cap;\n }\n\n private growItems(cap: number): void {\n this.itemBox = grow(this.itemBox, cap * 2 * this.dim);\n this.itemCentroid2 = grow(this.itemCentroid2, cap * this.dim);\n this.itemLeaf = grow(this.itemLeaf, cap);\n this.itemCap = cap;\n }\n\n allocNode(parent: number): number {\n let n = this.freeNodes.pop();\n if (n === undefined) {\n if (this.nodeTop === this.nodeCap) this.growNodes(this.nodeCap * 2);\n n = this.nodeTop++;\n }\n this.left[n] = -1;\n this.right[n] = -1;\n this.parent[n] = parent;\n this.leafCount[n] = 0;\n return n;\n }\n\n freeNode(n: number): void {\n this.freeNodes.push(n);\n }\n\n allocItem(key: K, box: ArrayLike<number>): number {\n let i = this.freeItems.pop();\n if (i === undefined) {\n if (this.itemTop === this.itemCap) this.growItems(this.itemCap * 2);\n i = this.itemTop++;\n }\n this.keys[i] = key;\n this.writeItemBox(i, box);\n return i;\n }\n\n freeItem(i: number): void {\n this.keys[i] = undefined;\n this.itemLeaf[i] = -1;\n this.freeItems.push(i);\n }\n\n writeItemBox(i: number, box: ArrayLike<number>): void {\n const d = this.dim;\n const s = 2 * d;\n for (let j = 0; j < s; j++) this.itemBox[i * s + j] = box[j];\n for (let a = 0; a < d; a++) this.itemCentroid2[i * d + a] = box[a] + box[d + a];\n }\n\n /** Recompute `n`'s box and count from its children or items. */\n computeBox(n: number): void {\n const d = this.dim;\n const s = 2 * d;\n const nb = this.nodeBox;\n const o = n * s;\n for (let j = 0; j < d; j++) { nb[o + j] = Infinity; nb[o + d + j] = -Infinity; }\n if (this.left[n] !== -1) {\n unionInto(nb, o, nb, this.left[n] * s, d);\n unionInto(nb, o, nb, this.right[n] * s, d);\n this.count[n] = this.count[this.left[n]] + this.count[this.right[n]];\n return;\n }\n this.count[n] = this.leafCount[n];\n const base = n * LEAF_SIZE;\n for (let k = 0; k < this.leafCount[n]; k++) unionInto(nb, o, this.itemBox, this.leafItems[base + k] * s, d);\n }\n\n refitUp(n: number): void {\n for (; n !== -1; n = this.parent[n]) this.computeBox(n);\n }\n\n /** Discard the topology and rebuild it top-down over every live item. */\n build(): void {\n this.freeNodes = [];\n this.nodeTop = 0;\n this.root = -1;\n const live: number[] = [];\n for (let i = 0; i < this.itemTop; i++) if (this.itemLeaf[i] !== -1) live.push(i);\n if (live.length === 0) return;\n if (this.nodeCap < 2 * live.length) this.growNodes(2 * live.length);\n const idx = Int32Array.from(live);\n this.root = this.buildRange(idx, 0, idx.length, -1);\n }\n\n /** Rebuild the subtree under `n` balanced, in its place. */\n rebuildSubtree(n: number): void {\n const p = this.parent[n];\n const wasLeft = p !== -1 && this.left[p] === n;\n const items = new Int32Array(this.count[n]);\n const nodes = [n];\n let m = 0;\n while (nodes.length > 0) {\n const c = nodes.pop()!;\n if (this.left[c] !== -1) nodes.push(this.left[c], this.right[c]);\n else for (let k = 0; k < this.leafCount[c]; k++) items[m++] = this.leafItems[c * LEAF_SIZE + k];\n this.freeNode(c);\n }\n const r = this.buildRange(items, 0, m, p);\n if (p === -1) this.root = r;\n else if (wasLeft) this.left[p] = r;\n else this.right[p] = r;\n }\n\n /** `key` is scratch the length of `idx`, for `select`. */\n private buildRange(idx: Int32Array, lo: number, hi: number, parent: number, key = new Float64Array(idx.length)): number {\n const n = this.allocNode(parent);\n if (hi - lo <= LEAF_SIZE) {\n for (let k = lo; k < hi; k++) this.placeInLeaf(n, idx[k]);\n } else {\n const mid = (lo + hi) >> 1;\n this.select(idx, key, lo, hi, mid, this.longestCentroidAxis(idx, lo, hi));\n const l = this.buildRange(idx, lo, mid, n, key);\n const r = this.buildRange(idx, mid, hi, n, key);\n this.left[n] = l;\n this.right[n] = r;\n }\n this.computeBox(n);\n return n;\n }\n\n placeInLeaf(n: number, item: number): void {\n this.leafItems[n * LEAF_SIZE + this.leafCount[n]++] = item;\n this.itemLeaf[item] = n;\n }\n\n /** Turn a full leaf into an internal node over two leaves, the full set\n * plus `extra` split at the median of their longest centroid axis. */\n splitLeaf(n: number, extra: number): void {\n const base = n * LEAF_SIZE;\n const idx = new Int32Array(LEAF_SIZE + 1);\n for (let k = 0; k < LEAF_SIZE; k++) idx[k] = this.leafItems[base + k];\n idx[LEAF_SIZE] = extra;\n const mid = idx.length >> 1;\n this.select(idx, new Float64Array(idx.length), 0, idx.length, mid, this.longestCentroidAxis(idx, 0, idx.length));\n this.leafCount[n] = 0;\n const l = this.allocNode(n);\n const r = this.allocNode(n);\n for (let k = 0; k < mid; k++) this.placeInLeaf(l, idx[k]);\n for (let k = mid; k < idx.length; k++) this.placeInLeaf(r, idx[k]);\n this.left[n] = l;\n this.right[n] = r;\n this.computeBox(l);\n this.computeBox(r);\n }\n\n private longestCentroidAxis(idx: Int32Array, lo: number, hi: number): number {\n const d = this.dim;\n const cent = this.itemCentroid2;\n let best = 0;\n let bestExt = -1;\n for (let a = 0; a < this.dim; a++) {\n let mn = Infinity;\n let mx = -Infinity;\n for (let k = lo; k < hi; k++) {\n const c = cent[idx[k] * d + a];\n if (c < mn) mn = c;\n if (c > mx) mx = c;\n }\n if (mx - mn > bestExt) { bestExt = mx - mn; best = a; }\n }\n return best;\n }\n\n /** Quickselect: reorder `idx[lo, hi)` so `idx[k]` holds the item whose\n * centroid on `axis` ranks k, with smaller ones before it. The centroids\n * are copied into `key` beside `idx` and swapped with it, so the scans read\n * memory in order. */\n private select(idx: Int32Array, key: Float64Array, lo: number, hi: number, k: number, axis: number): void {\n const d = this.dim;\n const cent = this.itemCentroid2;\n for (let m = lo; m < hi; m++) key[m] = cent[idx[m] * d + axis];\n let a = lo;\n let b = hi - 1;\n while (a < b) {\n const pivot = key[(a + b) >> 1];\n let i = a;\n let j = b;\n while (i <= j) {\n while (key[i] < pivot) i++;\n while (key[j] > pivot) j--;\n if (i <= j) {\n const t = idx[i]; idx[i] = idx[j]; idx[j] = t;\n const u = key[i]; key[i] = key[j]; key[j] = u;\n i++;\n j--;\n }\n }\n if (k <= j) b = j;\n else if (k >= i) a = i;\n else return;\n }\n }\n}\n\nfunction grow<T extends Float64Array | Int32Array>(arr: T, len: number): T {\n const next = new (arr.constructor as new (n: number) => T)(len);\n next.set(arr);\n return next;\n}\n\n/** Grow the box at `dst[o]` to cover the box at `src[so]`. */\nexport function unionInto(dst: Float64Array, o: number, src: ArrayLike<number>, so: number, d: number): void {\n for (let j = 0; j < d; j++) {\n if (src[so + j] < dst[o + j]) dst[o + j] = src[so + j];\n if (src[so + d + j] > dst[o + d + j]) dst[o + d + j] = src[so + d + j];\n }\n}\n","/** Traversals over a `BvhTree`. Each takes its buffers from a `Scratch`,\n * so a query allocates nothing unless a visit re-enters the tree. */\nimport { LEAF_SIZE, type BvhTree } from './bvhTree';\n\n/** A half-space bounded by a plane: a point `x` is inside when\n * `dot(normal, x) + offset >= 0`. */\nexport interface HalfSpace { normal: ArrayLike<number>; offset: number }\n\ntype Visit<K> = (key: K) => boolean | void;\n\n/** Reusable traversal buffers; a re-entrant query gets fresh ones. */\nexport class Scratch {\n stack = new Int32Array(64);\n heapT = new Float64Array(64);\n heapId = new Int32Array(64);\n private busy = false;\n\n take(): Scratch {\n if (this.busy) return new Scratch();\n this.busy = true;\n return this;\n }\n\n release(): void { this.busy = false; }\n\n stackAt(len: number): Int32Array {\n if (len >= this.stack.length) {\n const next = new Int32Array(this.stack.length * 2);\n next.set(this.stack);\n this.stack = next;\n }\n return this.stack;\n }\n\n ensureHeap(len: number): void {\n if (len < this.heapT.length) return;\n const t = new Float64Array(this.heapT.length * 2);\n const id = new Int32Array(this.heapId.length * 2);\n t.set(this.heapT);\n id.set(this.heapId);\n this.heapT = t;\n this.heapId = id;\n }\n}\n\n/** Push onto the min-heap of `size` entries in `sc`; returns the new size. */\nfunction heapPush(sc: Scratch, size: number, t: number, id: number): number {\n sc.ensureHeap(size + 1);\n const ht = sc.heapT;\n const hid = sc.heapId;\n let i = size;\n while (i > 0) {\n const p = (i - 1) >> 1;\n if (ht[p] <= t) break;\n ht[i] = ht[p]; hid[i] = hid[p];\n i = p;\n }\n ht[i] = t; hid[i] = id;\n return size + 1;\n}\n\n/** Drop the minimum of a heap of `size` entries. */\nfunction heapPop(sc: Scratch, size: number): void {\n const ht = sc.heapT;\n const hid = sc.heapId;\n const n = size - 1;\n const lastT = ht[n];\n const lastId = hid[n];\n let i = 0;\n for (;;) {\n let c = 2 * i + 1;\n if (c >= n) break;\n if (c + 1 < n && ht[c + 1] < ht[c]) c++;\n if (ht[c] >= lastT) break;\n ht[i] = ht[c]; hid[i] = hid[c];\n i = c;\n }\n ht[i] = lastT; hid[i] = lastId;\n}\n\n/** Closed-interval overlap of the box at `arr[o]` with the query box whose\n * mins sit at `q[qmin]` and maxes at `q[qmax]`. */\nfunction meets(arr: Float64Array, o: number, d: number, q: ArrayLike<number>, qmin: number, qmax: number): boolean {\n for (let j = 0; j < d; j++) if (arr[o + j] > q[qmax + j] || q[qmin + j] > arr[o + d + j]) return false;\n return true;\n}\n\n/** Visit every item whose box meets the query box `q[qmin..]`/`q[qmax..]`. */\nexport function queryOverlap<K>(tree: BvhTree<K>, pool: Scratch, q: ArrayLike<number>, qmin: number, qmax: number, visit: Visit<K>): void {\n if (tree.root === -1) return;\n const sc = pool.take();\n const d = tree.dim;\n const s = 2 * d;\n try {\n let stack = sc.stackAt(0);\n let sp = 0;\n stack[sp++] = tree.root;\n while (sp > 0) {\n const n = stack[--sp];\n if (!meets(tree.nodeBox, n * s, d, q, qmin, qmax)) continue;\n if (tree.left[n] === -1) {\n const base = n * LEAF_SIZE;\n for (let k = 0; k < tree.leafCount[n]; k++) {\n const it = tree.leafItems[base + k];\n if (meets(tree.itemBox, it * s, d, q, qmin, qmax) && visit(tree.keys[it] as K) === false) return;\n }\n continue;\n }\n stack = sc.stackAt(sp + 1);\n stack[sp++] = tree.left[n];\n stack[sp++] = tree.right[n];\n }\n } finally {\n sc.release();\n }\n}\n\n/** False when the box at `arr[o]` lies wholly outside some plane. */\nfunction notOutside(arr: Float64Array, o: number, d: number, planes: readonly HalfSpace[]): boolean {\n for (let p = 0; p < planes.length; p++) {\n const { normal, offset } = planes[p];\n let v = offset;\n for (let j = 0; j < d; j++) v += normal[j] * (normal[j] >= 0 ? arr[o + d + j] : arr[o + j]);\n if (v < 0) return false;\n }\n return true;\n}\n\nexport function queryHalfSpaces<K>(tree: BvhTree<K>, pool: Scratch, planes: readonly HalfSpace[], visit: Visit<K>): void {\n if (tree.root === -1) return;\n const sc = pool.take();\n const d = tree.dim;\n const s = 2 * d;\n try {\n let stack = sc.stackAt(0);\n let sp = 0;\n stack[sp++] = tree.root;\n while (sp > 0) {\n const n = stack[--sp];\n if (!notOutside(tree.nodeBox, n * s, d, planes)) continue;\n if (tree.left[n] === -1) {\n const base = n * LEAF_SIZE;\n for (let k = 0; k < tree.leafCount[n]; k++) {\n const it = tree.leafItems[base + k];\n if (notOutside(tree.itemBox, it * s, d, planes) && visit(tree.keys[it] as K) === false) return;\n }\n continue;\n }\n stack = sc.stackAt(sp + 1);\n stack[sp++] = tree.left[n];\n stack[sp++] = tree.right[n];\n }\n } finally {\n sc.release();\n }\n}\n\n/** Slab test: the ray's entry t into the box at `arr[o]`, clamped to\n * [0, tMax], or -1 when it misses. */\nfunction entry(arr: Float64Array, o: number, d: number, org: ArrayLike<number>, dir: ArrayLike<number>, tMax: number): number {\n let near = 0;\n let far = tMax;\n for (let j = 0; j < d; j++) {\n const lo = arr[o + j];\n const hi = arr[o + d + j];\n // Divides, as `intersectRayAabb` does: a reciprocal rounds differently\n // and can reject a ray grazing an edge that the exact test accepts.\n if (dir[j] === 0) {\n if (org[j] < lo || org[j] > hi) return -1;\n continue;\n }\n const t1 = (lo - org[j]) / dir[j];\n const t2 = (hi - org[j]) / dir[j];\n if (t1 < t2) { if (t1 > near) near = t1; if (t2 < far) far = t2; }\n else { if (t2 > near) near = t2; if (t1 < far) far = t1; }\n if (near > far) return -1;\n }\n return near;\n}\n\n/** Best-first over entry t: nodes and items share one min-heap, an item\n * stored as `-(index + 1)`, so items pop in nondecreasing t. */\nexport function raycast<K>(\n tree: BvhTree<K>, pool: Scratch, org: ArrayLike<number>, dir: ArrayLike<number>,\n visit: (key: K, t: number) => boolean | void, tMax: number,\n): void {\n if (tree.root === -1) return;\n const d = tree.dim;\n const s = 2 * d;\n const t0 = entry(tree.nodeBox, tree.root * s, d, org, dir, tMax);\n if (t0 < 0) return;\n const sc = pool.take();\n try {\n let size = heapPush(sc, 0, t0, tree.root);\n while (size > 0) {\n const t = sc.heapT[0];\n const id = sc.heapId[0];\n heapPop(sc, size--);\n if (id < 0) {\n if (visit(tree.keys[-id - 1] as K, t) === false) return;\n continue;\n }\n if (tree.left[id] === -1) {\n const base = id * LEAF_SIZE;\n for (let k = 0; k < tree.leafCount[id]; k++) {\n const it = tree.leafItems[base + k];\n const ti = entry(tree.itemBox, it * s, d, org, dir, tMax);\n if (ti >= 0) size = heapPush(sc, size, ti, -it - 1);\n }\n continue;\n }\n const l = tree.left[id];\n const r = tree.right[id];\n const tl = entry(tree.nodeBox, l * s, d, org, dir, tMax);\n if (tl >= 0) size = heapPush(sc, size, tl, l);\n const tr = entry(tree.nodeBox, r * s, d, org, dir, tMax);\n if (tr >= 0) size = heapPush(sc, size, tr, r);\n }\n } finally {\n sc.release();\n }\n}\n","/** A bounding volume hierarchy over axis-aligned boxes in any dimension: the\n * broad phase for point, box, ray and half-space picks. Boxes are closed,\n * so two that touch at an edge meet; callers apply their own exact test. */\nimport { LEAF_SIZE, BvhTree } from './bvhTree';\nimport { Scratch, queryHalfSpaces, queryOverlap, raycast, type HalfSpace } from './bvhQuery';\n\nexport type { HalfSpace };\n\n/** Box layout: [min_0..min_{d-1}, max_0..max_{d-1}]. */\nexport type BoxN = ArrayLike<number>;\n\n/** A bounding volume hierarchy keyed by `K`, made by {@link createBvh}. */\nexport interface Bvh<K> {\n readonly dim: number;\n readonly size: number;\n /** False (and not stored) when any coordinate is non-finite or min > max.\n * Inserting a key already present updates it. */\n insert(key: K, box: BoxN): boolean;\n /** False, keeping the old box, when the key is absent or the box invalid. */\n update(key: K, box: BoxN): boolean;\n remove(key: K): boolean;\n /** Tighten every node box after updates that only moved items in place. */\n refit(): void;\n /** Rebuild the hierarchy top-down from the current boxes. */\n rebuild(): void;\n /** visit returns false to stop. In every query, changing the tree from inside\n * a visit (insert, update, remove, refit, rebuild) is undefined. */\n queryBox(box: BoxN, visit: (key: K) => boolean | void): void;\n queryPoint(p: ArrayLike<number>, visit: (key: K) => boolean | void): void;\n /** Leaves in nondecreasing order of box entry distance t (t >= 0, t <= tMax). */\n raycast(origin: ArrayLike<number>, dir: ArrayLike<number>, visit: (key: K, t: number) => boolean | void, tMax?: number): void;\n /** Leaves whose box is not wholly outside any half-space (conservative). */\n queryHalfSpaces(planes: readonly HalfSpace[], visit: (key: K) => boolean | void): void;\n}\n\n/** Weight balance past which a subtree counts as lopsided. Below\n * `1/sqrt(2)`, so an unbalanced ancestor exists on any path deeper than\n * `depthLimit`: an item at depth h sits under at most `ALPHA^h * n` items. */\nconst ALPHA = 0.7;\n\n/** Deepest a leaf may sit after an insert. */\nfunction depthLimit(n: number): number {\n return 2 * Math.ceil(Math.log2(Math.max(n, 2)));\n}\n\n/** Leaf depth of a median-split build over `m` items. */\nfunction balancedHeight(m: number): number {\n let h = 0;\n for (; m > LEAF_SIZE; m = Math.ceil(m / 2)) h++;\n return h;\n}\n\nfunction validBox(box: BoxN, dim: number): boolean {\n if (box.length < 2 * dim) return false;\n for (let j = 0; j < dim; j++) {\n const lo = box[j];\n const hi = box[dim + j];\n if (!Number.isFinite(lo) || !Number.isFinite(hi) || lo > hi) return false;\n }\n return true;\n}\n\nclass BvhImpl<K> implements Bvh<K> {\n readonly dim: number;\n private readonly tree: BvhTree<K>;\n private readonly items = new Map<K, number>();\n private readonly scratch = new Scratch();\n /** Largest size since the last whole rebuild; shrinking to half of it rebuilds again. */\n private peakSize = 0;\n\n constructor(dim: number) {\n this.dim = dim;\n this.tree = new BvhTree<K>(dim);\n }\n\n get size(): number { return this.items.size; }\n\n /** Store without touching the topology; `rebuild` places them. */\n load(entries: Iterable<readonly [K, BoxN]>): void {\n for (const [key, box] of entries) {\n if (!validBox(box, this.dim)) continue;\n const old = this.items.get(key);\n if (old !== undefined) { this.tree.writeItemBox(old, box); continue; }\n const it = this.tree.allocItem(key, box);\n this.tree.itemLeaf[it] = 0; // marks it live for build()\n this.items.set(key, it);\n }\n }\n\n insert(key: K, box: BoxN): boolean {\n if (!validBox(box, this.dim)) return false;\n if (this.items.has(key)) return this.update(key, box);\n const it = this.tree.allocItem(key, box);\n this.items.set(key, it);\n if (this.items.size > this.peakSize) this.peakSize = this.items.size;\n this.place(it);\n return true;\n }\n\n update(key: K, box: BoxN): boolean {\n const it = this.items.get(key);\n if (it === undefined || !validBox(box, this.dim)) return false;\n const t = this.tree;\n const leaf = t.itemLeaf[it];\n if (this.leafHolds(leaf, box)) {\n t.writeItemBox(it, box);\n return true;\n }\n this.detach(it);\n t.writeItemBox(it, box);\n this.place(it);\n return true;\n }\n\n remove(key: K): boolean {\n const it = this.items.get(key);\n if (it === undefined) return false;\n this.detach(it);\n this.items.delete(key);\n this.tree.freeItem(it);\n if (this.items.size < this.peakSize >> 1) this.rebuild();\n return true;\n }\n\n refit(): void {\n const t = this.tree;\n if (t.root === -1) return;\n const sc = this.scratch.take();\n try {\n // Children land after their parent, so the reversed order is bottom-up.\n let order = sc.stackAt(0);\n order[0] = t.root;\n let len = 1;\n for (let i = 0; i < len; i++) {\n const n = order[i];\n if (t.left[n] === -1) continue;\n order = sc.stackAt(len + 1);\n order[len++] = t.left[n];\n order[len++] = t.right[n];\n }\n for (let i = len - 1; i >= 0; i--) t.computeBox(order[i]);\n } finally {\n sc.release();\n }\n }\n\n rebuild(): void {\n this.tree.build();\n this.peakSize = this.items.size;\n }\n\n /** Deepest leaf, counting the root as depth 0. */\n maxDepth(): number {\n const t = this.tree;\n if (t.root === -1) return 0;\n let deepest = 0;\n const stack: [number, number][] = [[t.root, 0]];\n while (stack.length > 0) {\n const [n, d] = stack.pop()!;\n if (t.left[n] === -1) deepest = Math.max(deepest, d);\n else stack.push([t.left[n], d + 1], [t.right[n], d + 1]);\n }\n return deepest;\n }\n\n queryBox(box: BoxN, visit: (key: K) => boolean | void): void {\n queryOverlap(this.tree, this.scratch, box, 0, this.dim, visit);\n }\n\n queryPoint(p: ArrayLike<number>, visit: (key: K) => boolean | void): void {\n queryOverlap(this.tree, this.scratch, p, 0, 0, visit);\n }\n\n raycast(origin: ArrayLike<number>, dir: ArrayLike<number>, visit: (key: K, t: number) => boolean | void, tMax = Infinity): void {\n raycast(this.tree, this.scratch, origin, dir, visit, tMax);\n }\n\n queryHalfSpaces(planes: readonly HalfSpace[], visit: (key: K) => boolean | void): void {\n queryHalfSpaces(this.tree, this.scratch, planes, visit);\n }\n\n private leafHolds(leaf: number, box: BoxN): boolean {\n const d = this.dim;\n const o = leaf * 2 * d;\n const nb = this.tree.nodeBox;\n for (let j = 0; j < d; j++) if (box[j] < nb[o + j] || box[d + j] > nb[o + d + j]) return false;\n return true;\n }\n\n /** Descend by least enlargement and add `it` to a leaf, splitting it when full. */\n private place(it: number): void {\n const t = this.tree;\n if (t.root === -1) {\n t.root = t.allocNode(-1);\n t.placeInLeaf(t.root, it);\n t.computeBox(t.root);\n return;\n }\n let n = t.root;\n let depth = 0;\n while (t.left[n] !== -1) {\n const l = t.left[n];\n const r = t.right[n];\n const el = this.enlargement(l, it);\n const er = this.enlargement(r, it);\n n = el < er || (el === er && t.count[l] <= t.count[r]) ? l : r;\n depth++;\n }\n if (t.leafCount[n] < LEAF_SIZE) t.placeInLeaf(n, it);\n else { t.splitLeaf(n, it); depth++; }\n t.refitUp(n);\n if (depth > depthLimit(this.items.size)) this.rebalance(t.itemLeaf[it], depth);\n }\n\n /** Least enlargement alone lets sorted or coincident inserts grow one\n * spine. Rebuild the lowest ancestor whose balanced rebuild brings this\n * leaf back within the limit, preferring a weight-unbalanced one. */\n private rebalance(leaf: number, depth: number): void {\n const t = this.tree;\n const limit = depthLimit(this.items.size);\n let fit = -1;\n for (let c = leaf, a = t.parent[leaf], d = depth - 1; a !== -1; c = a, a = t.parent[a], d--) {\n if (d + balancedHeight(t.count[a]) > limit) continue;\n if (t.count[c] > ALPHA * t.count[a]) { t.rebuildSubtree(a); return; }\n if (fit === -1) fit = a;\n }\n if (fit !== -1) t.rebuildSubtree(fit);\n else this.rebuild();\n }\n\n /** Margin (sum of extents) a node would gain by covering item `it`. Margin\n * rather than volume, so zero-extent boxes still rank. */\n private enlargement(n: number, it: number): number {\n const d = this.dim;\n const nb = this.tree.nodeBox;\n const ib = this.tree.itemBox;\n const o = n * 2 * d;\n const io = it * 2 * d;\n let grow = 0;\n for (let j = 0; j < d; j++) {\n const lo = Math.min(nb[o + j], ib[io + j]);\n const hi = Math.max(nb[o + d + j], ib[io + d + j]);\n grow += hi - lo - (nb[o + d + j] - nb[o + j]);\n }\n return grow;\n }\n\n /** Take `it` out of its leaf, collapsing the leaf into its sibling when it empties. */\n private detach(it: number): void {\n const t = this.tree;\n const leaf = t.itemLeaf[it];\n const base = leaf * LEAF_SIZE;\n const count = t.leafCount[leaf];\n for (let k = 0; k < count; k++) {\n if (t.leafItems[base + k] !== it) continue;\n t.leafItems[base + k] = t.leafItems[base + count - 1];\n break;\n }\n t.leafCount[leaf] = count - 1;\n t.itemLeaf[it] = -1;\n if (count > 1) { t.refitUp(leaf); return; }\n const p = t.parent[leaf];\n t.freeNode(leaf);\n if (p === -1) { t.root = -1; return; }\n const sib = t.left[p] === leaf ? t.right[p] : t.left[p];\n const g = t.parent[p];\n t.parent[sib] = g;\n if (g === -1) t.root = sib;\n else if (t.left[g] === p) t.left[g] = sib;\n else t.right[g] = sib;\n t.freeNode(p);\n t.refitUp(g);\n }\n}\n\n/** Deepest leaf of a tree `createBvh` made, root at depth 0. Tests use it;\n * the `./nd` barrel does not export it. */\nexport function bvhMaxDepth(bvh: Bvh<unknown>): number {\n return (bvh as BvhImpl<unknown>).maxDepth();\n}\n\n/** A BVH over `dim`-dimensional boxes, built top-down from `entries` when\n * given. Entries with an invalid box are skipped. */\nexport function createBvh<K>(dim: number, entries?: Iterable<readonly [K, BoxN]>): Bvh<K> {\n if (!Number.isInteger(dim) || dim < 1) throw new RangeError(`createBvh: dim must be a positive integer, got ${dim}`);\n const bvh = new BvhImpl<K>(dim);\n if (entries) {\n bvh.load(entries);\n bvh.rebuild();\n }\n return bvh;\n}\n"]}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { nearestOnLine } from './chunk-2N6OWA7E.js';
|
|
2
|
+
import { resolveCorners, fitCubicWithTangents } from './chunk-EURWZUNY.js';
|
|
3
|
+
import { forEachSegment, PATH_Z, PATH_Q, elevateQuadraticToCubic, cubicBounds, PATH_C, PATH_L, PATH_M } from './chunk-B3D6KWW3.js';
|
|
4
|
+
|
|
5
|
+
// src/paths/bounds.ts
|
|
6
|
+
function boundsOfPath(path) {
|
|
7
|
+
if (path.kind === "rect") return path;
|
|
8
|
+
const { commands, coords } = resolveCorners(path);
|
|
9
|
+
if (commands.length === 0) {
|
|
10
|
+
return { kind: "rect", x: 0, y: 0, width: 0, height: 0 };
|
|
11
|
+
}
|
|
12
|
+
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
13
|
+
let seen = false;
|
|
14
|
+
const include = (x, y) => {
|
|
15
|
+
if (x < minX) minX = x;
|
|
16
|
+
if (x > maxX) maxX = x;
|
|
17
|
+
if (y < minY) minY = y;
|
|
18
|
+
if (y > maxY) maxY = y;
|
|
19
|
+
seen = true;
|
|
20
|
+
};
|
|
21
|
+
forEachSegment(commands, coords, (cmd, ci, px, py) => {
|
|
22
|
+
switch (cmd) {
|
|
23
|
+
case PATH_M:
|
|
24
|
+
case PATH_L: {
|
|
25
|
+
include(coords[ci], coords[ci + 1]);
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
case PATH_C: {
|
|
29
|
+
const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(
|
|
30
|
+
px,
|
|
31
|
+
py,
|
|
32
|
+
coords[ci],
|
|
33
|
+
coords[ci + 1],
|
|
34
|
+
coords[ci + 2],
|
|
35
|
+
coords[ci + 3],
|
|
36
|
+
coords[ci + 4],
|
|
37
|
+
coords[ci + 5]
|
|
38
|
+
);
|
|
39
|
+
include(bMinX, bMinY);
|
|
40
|
+
include(bMaxX, bMaxY);
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
case PATH_Q: {
|
|
44
|
+
const qx2 = coords[ci + 2], qy2 = coords[ci + 3];
|
|
45
|
+
const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(px, py, coords[ci], coords[ci + 1], qx2, qy2);
|
|
46
|
+
const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(px, py, c1x, c1y, c2x, c2y, qx2, qy2);
|
|
47
|
+
include(bMinX, bMinY);
|
|
48
|
+
include(bMaxX, bMaxY);
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
case PATH_Z:
|
|
52
|
+
break;
|
|
53
|
+
default:
|
|
54
|
+
throw new Error(`boundsOfPath: unknown command ${cmd}`);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
if (!seen) return { kind: "rect", x: 0, y: 0, width: 0, height: 0 };
|
|
58
|
+
return {
|
|
59
|
+
kind: "rect",
|
|
60
|
+
x: minX + (path.origin?.x ?? 0),
|
|
61
|
+
y: minY + (path.origin?.y ?? 0),
|
|
62
|
+
width: maxX - minX,
|
|
63
|
+
height: maxY - minY
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// src/paths/fitHandles.ts
|
|
68
|
+
var GRID = [0.02, 0.1, 0.2, 0.3, 0.45, 0.6, 0.8, 1.05];
|
|
69
|
+
var MAX_STEPS = 60;
|
|
70
|
+
var SEARCH_FLAT = 48;
|
|
71
|
+
var TARGET = 0.9;
|
|
72
|
+
var SEARCH_REACH = 4;
|
|
73
|
+
var GIVE_UP = 2;
|
|
74
|
+
var CHECK_SAG = 1 / 16;
|
|
75
|
+
var MAX_CHECK_FLAT = 512;
|
|
76
|
+
function packRun(pts) {
|
|
77
|
+
const run = new Float64Array(2 * pts.length);
|
|
78
|
+
pts.forEach((p, i) => {
|
|
79
|
+
run[2 * i] = p.x;
|
|
80
|
+
run[2 * i + 1] = p.y;
|
|
81
|
+
});
|
|
82
|
+
return run;
|
|
83
|
+
}
|
|
84
|
+
function cubicWithin(run, a, cp1, cp2, e, tol) {
|
|
85
|
+
const bend = 6 * Math.max(Math.hypot(a.x - 2 * cp1.x + cp2.x, a.y - 2 * cp1.y + cp2.y), Math.hypot(cp1.x - 2 * cp2.x + e.x, cp1.y - 2 * cp2.y + e.y));
|
|
86
|
+
const n = Math.min(MAX_CHECK_FLAT, Math.max(8, Math.ceil(Math.sqrt(bend / (8 * CHECK_SAG * tol)))));
|
|
87
|
+
const sag = bend / (8 * n * n);
|
|
88
|
+
const bound = tol - sag;
|
|
89
|
+
if (bound <= 0) return false;
|
|
90
|
+
const flat = new Float64Array(2 * (n + 1));
|
|
91
|
+
flatten(a, cp1, cp2, e, flat);
|
|
92
|
+
return worstFromPolyline(run, flat, bound) <= bound && worstFromPolyline(flat, run, bound) <= bound;
|
|
93
|
+
}
|
|
94
|
+
function searchHandles(run, a, e, tStart, tEnd, tol, from) {
|
|
95
|
+
const chord = Math.hypot(e.x - a.x, e.y - a.y);
|
|
96
|
+
const at = (al2, be2) => ({
|
|
97
|
+
cp1: { x: a.x + al2 * tStart.x, y: a.y + al2 * tStart.y },
|
|
98
|
+
cp2: { x: e.x + be2 * tEnd.x, y: e.y + be2 * tEnd.y }
|
|
99
|
+
});
|
|
100
|
+
const flat = new Float64Array(2 * (SEARCH_FLAT + 1));
|
|
101
|
+
const spread = (al2, be2, bound) => {
|
|
102
|
+
const { cp1, cp2 } = at(al2, be2);
|
|
103
|
+
flatten(a, cp1, cp2, e, flat);
|
|
104
|
+
const out = worstFromPolyline(run, flat, bound);
|
|
105
|
+
return out > bound ? out : Math.max(out, worstFromPolyline(flat, run, bound));
|
|
106
|
+
};
|
|
107
|
+
const fromAl = Math.max(0, (from.cp1.x - a.x) * tStart.x + (from.cp1.y - a.y) * tStart.y);
|
|
108
|
+
const fromBe = Math.max(0, (from.cp2.x - e.x) * tEnd.x + (from.cp2.y - e.y) * tEnd.y);
|
|
109
|
+
let al = fromAl, be = fromBe, best = spread(al, be, Infinity);
|
|
110
|
+
if (best > SEARCH_REACH * tol) return null;
|
|
111
|
+
for (const fa of GRID) for (const fb of GRID) {
|
|
112
|
+
const d = spread(fa * chord, fb * chord, best);
|
|
113
|
+
if (d < best) {
|
|
114
|
+
best = d;
|
|
115
|
+
al = fa * chord;
|
|
116
|
+
be = fb * chord;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (best > GIVE_UP * tol) return null;
|
|
120
|
+
let step = chord * 0.05;
|
|
121
|
+
for (let i = 0; i < MAX_STEPS && best > TARGET * tol && step > tol / 32; i++) {
|
|
122
|
+
let moved = false;
|
|
123
|
+
for (const [da, db] of STEPS) {
|
|
124
|
+
const na = al + da * step, nb = be + db * step;
|
|
125
|
+
if (na < 0 || nb < 0) continue;
|
|
126
|
+
const d = spread(na, nb, best);
|
|
127
|
+
if (d < best) {
|
|
128
|
+
best = d;
|
|
129
|
+
al = na;
|
|
130
|
+
be = nb;
|
|
131
|
+
moved = true;
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (!moved) step /= 2;
|
|
136
|
+
}
|
|
137
|
+
return at(al, be);
|
|
138
|
+
}
|
|
139
|
+
var STEPS = [[1, 0], [-1, 0], [0, 1], [0, -1], [1, 1], [-1, -1], [1, -1], [-1, 1]];
|
|
140
|
+
function flatten(a, cp1, cp2, e, out) {
|
|
141
|
+
const n = out.length / 2 - 1;
|
|
142
|
+
const ax = e.x - a.x + 3 * (cp1.x - cp2.x), ay = e.y - a.y + 3 * (cp1.y - cp2.y);
|
|
143
|
+
const bx = 3 * (a.x - 2 * cp1.x + cp2.x), by = 3 * (a.y - 2 * cp1.y + cp2.y);
|
|
144
|
+
const cx = 3 * (cp1.x - a.x), cy = 3 * (cp1.y - a.y);
|
|
145
|
+
for (let k = 0; k <= n; k++) {
|
|
146
|
+
const t = k / n;
|
|
147
|
+
out[2 * k] = ((ax * t + bx) * t + cx) * t + a.x;
|
|
148
|
+
out[2 * k + 1] = ((ay * t + by) * t + cy) * t + a.y;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function worstFromPolyline(from, to, bound) {
|
|
152
|
+
const edges = to.length / 2 - 1;
|
|
153
|
+
const reach = Math.max(4, edges >> 2);
|
|
154
|
+
const limit = bound * bound;
|
|
155
|
+
let hint = 0, worst = 0;
|
|
156
|
+
for (let i = 2; i < from.length - 2; i += 2) {
|
|
157
|
+
const px = from[i], py = from[i + 1];
|
|
158
|
+
let near = Infinity, at = hint;
|
|
159
|
+
for (let j = hint, end = Math.min(edges, hint + reach); j < end; j++) {
|
|
160
|
+
const x0 = to[2 * j], y0 = to[2 * j + 1];
|
|
161
|
+
const dx = to[2 * j + 2] - x0, dy = to[2 * j + 3] - y0;
|
|
162
|
+
const len = dx * dx + dy * dy;
|
|
163
|
+
const s = len === 0 ? 0 : Math.min(1, Math.max(0, ((px - x0) * dx + (py - y0) * dy) / len));
|
|
164
|
+
const ex = x0 + s * dx - px, ey = y0 + s * dy - py;
|
|
165
|
+
const d = ex * ex + ey * ey;
|
|
166
|
+
if (d < near) {
|
|
167
|
+
near = d;
|
|
168
|
+
at = j;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
hint = at;
|
|
172
|
+
if (near > worst) {
|
|
173
|
+
worst = near;
|
|
174
|
+
if (worst > limit) break;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return Math.sqrt(worst);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// src/paths/fitRun.ts
|
|
181
|
+
function keepCorner(to, from) {
|
|
182
|
+
if (from.corner) to.corner = { ...from.corner };
|
|
183
|
+
}
|
|
184
|
+
function fitPointRun(pts, tStart, tEnd, tol, out, closing) {
|
|
185
|
+
if (out.length === 0) out.push({ x: pts[0].x, y: pts[0].y });
|
|
186
|
+
const segs = [];
|
|
187
|
+
fitGreedy(pts, tStart, tEnd, tol, segs);
|
|
188
|
+
segs.forEach((seg, i) => {
|
|
189
|
+
const prev = out[out.length - 1];
|
|
190
|
+
if (seg.c1) prev.outHandle = seg.c1;
|
|
191
|
+
const isLast = i === segs.length - 1;
|
|
192
|
+
if (closing && isLast) {
|
|
193
|
+
if (seg.c2) out[0].inHandle = seg.c2;
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
out.push(seg.c2 ? { x: seg.end.x, y: seg.end.y, inHandle: seg.c2 } : { x: seg.end.x, y: seg.end.y });
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
function fitGreedy(pts, tStart, tEnd, tol, out) {
|
|
200
|
+
let from = 0;
|
|
201
|
+
let tIn = tStart;
|
|
202
|
+
for (; ; ) {
|
|
203
|
+
const whole = fitOne(pts.slice(from), tIn, tEnd, tol);
|
|
204
|
+
if (whole) {
|
|
205
|
+
out.push(whole);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
let lo = from + 1, hi = pts.length - 1;
|
|
209
|
+
let piece = { end: pts[lo] };
|
|
210
|
+
while (hi - lo > 1) {
|
|
211
|
+
const mid = lo + hi >> 1;
|
|
212
|
+
const fit = fitOne(pts.slice(from, mid + 1), tIn, neg(tangentAt(pts, mid)), tol);
|
|
213
|
+
if (fit) {
|
|
214
|
+
lo = mid;
|
|
215
|
+
piece = fit;
|
|
216
|
+
} else hi = mid;
|
|
217
|
+
}
|
|
218
|
+
out.push(piece);
|
|
219
|
+
tIn = tangentAt(pts, lo);
|
|
220
|
+
from = lo;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
var tangentAt = (pts, k) => unit(sub2(pts[k + 1], pts[k - 1]));
|
|
224
|
+
function fitOne(pts, tStart, tEnd, tol) {
|
|
225
|
+
const a = pts[0];
|
|
226
|
+
const e = pts[pts.length - 1];
|
|
227
|
+
if (pts.length <= 2 || withinLine(pts, a, e, tol)) return { end: e };
|
|
228
|
+
const run = packRun(pts);
|
|
229
|
+
const { cp1, cp2 } = fitCubicWithTangents(pts, tStart, tEnd);
|
|
230
|
+
if (cubicWithin(run, a, cp1, cp2, e, tol)) return { c1: cp1, c2: cp2, end: e };
|
|
231
|
+
const found = searchHandles(run, a, e, tStart, tEnd, tol, { cp1, cp2 });
|
|
232
|
+
return found && cubicWithin(run, a, found.cp1, found.cp2, e, tol) ? { c1: found.cp1, c2: found.cp2, end: e } : null;
|
|
233
|
+
}
|
|
234
|
+
function withinLine(pts, a, e, tol) {
|
|
235
|
+
for (let i = 1; i < pts.length - 1; i++) {
|
|
236
|
+
if (nearestOnLine(pts[i].x, pts[i].y, a.x, a.y, e.x, e.y).dist > tol) return false;
|
|
237
|
+
}
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
var sub2 = (p, q) => ({ x: p.x - q.x, y: p.y - q.y });
|
|
241
|
+
var neg = (p) => ({ x: -p.x, y: -p.y });
|
|
242
|
+
function unit(p) {
|
|
243
|
+
const len = Math.hypot(p.x, p.y);
|
|
244
|
+
return len === 0 ? { x: 0, y: 0 } : { x: p.x / len, y: p.y / len };
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export { boundsOfPath, fitPointRun, keepCorner };
|
|
248
|
+
//# sourceMappingURL=chunk-ZOMUTU7J.js.map
|
|
249
|
+
//# sourceMappingURL=chunk-ZOMUTU7J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/paths/bounds.ts","../src/paths/fitHandles.ts","../src/paths/fitRun.ts"],"names":["al","be"],"mappings":"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","file":"chunk-ZOMUTU7J.js","sourcesContent":["import { cubicBounds, elevateQuadraticToCubic } from '../curve';\nimport { forEachSegment, PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { Path, RectPath } from '../path';\nimport { resolveCorners } from './corners';\n\n/**\n * AABB of a `Path`, returned as a `RectPath` for direct reuse with rect-fast-path machinery.\n * Control points are NOT included directly; they're used only to compute extrema that actually\n * lie on the curve. Corner shapes are bounded as they are drawn, expanded. Empty paths (no commands) return a zero-size rect anchored at the origin.\n */\nexport function boundsOfPath(path: Path): RectPath {\n if (path.kind === 'rect') return path;\n\n const { commands, coords } = resolveCorners(path);\n if (commands.length === 0) {\n return { kind: 'rect', x: 0, y: 0, width: 0, height: 0 };\n }\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n let seen = false;\n\n const include = (x: number, y: number) => {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n seen = true;\n };\n\n forEachSegment(commands, coords, (cmd, ci, px, py) => {\n switch (cmd) {\n case PATH_M:\n case PATH_L: {\n include(coords[ci], coords[ci + 1]);\n break;\n }\n case PATH_C: {\n const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(\n px, py,\n coords[ci], coords[ci + 1],\n coords[ci + 2], coords[ci + 3],\n coords[ci + 4], coords[ci + 5],\n );\n include(bMinX, bMinY);\n include(bMaxX, bMaxY);\n break;\n }\n case PATH_Q: {\n const qx2 = coords[ci + 2], qy2 = coords[ci + 3];\n const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(px, py, coords[ci], coords[ci + 1], qx2, qy2);\n const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(px, py, c1x, c1y, c2x, c2y, qx2, qy2);\n include(bMinX, bMinY);\n include(bMaxX, bMaxY);\n break;\n }\n case PATH_Z:\n break;\n default:\n throw new Error(`boundsOfPath: unknown command ${cmd}`);\n }\n });\n\n if (!seen) return { kind: 'rect', x: 0, y: 0, width: 0, height: 0 };\n return {\n kind: 'rect', x: minX + (path.origin?.x ?? 0), y: minY + (path.origin?.y ?? 0),\n width: maxX - minX, height: maxY - minY,\n };\n}\n\n","/**\n * How far a cubic and a run of samples stray from each other, and the handle\n * lengths that bring them closest: the measure and the search behind\n * `fitPointRun`. Both work on flattened cubics and on the run as a polyline.\n */\nimport type { Point } from './cubicMath';\n\n/** A cubic's two handles. */\nexport interface Handles {\n cp1: Point;\n cp2: Point;\n}\n\n/** Handle lengths tried on each axis of the coarse search, as shares of the chord. */\nconst GRID = [0.02, 0.1, 0.2, 0.3, 0.45, 0.6, 0.8, 1.05];\n/** Most steps of the pattern search after the coarse one. */\nconst MAX_STEPS = 60;\n/** Segments the cubic is flattened to while the search compares handle lengths. */\nconst SEARCH_FLAT = 48;\n/** The search stops once the run and the cubic are within this share of the tolerance. */\nconst TARGET = 0.9;\n/** A least-squares fit farther than this many tolerances from the run is not searched around. */\nconst SEARCH_REACH = 4;\n/** A coarse best farther than this many tolerances is not worth refining. */\nconst GIVE_UP = 2;\n/** How far a flattened cubic may sit from the cubic, as a share of the tolerance, when checking a fit. */\nconst CHECK_SAG = 1 / 16;\nconst MAX_CHECK_FLAT = 512;\n\n/** `pts` as interleaved `x, y`. */\nexport function packRun(pts: readonly Point[]): Float64Array {\n const run = new Float64Array(2 * pts.length);\n pts.forEach((p, i) => { run[2 * i] = p.x; run[2 * i + 1] = p.y; });\n return run;\n}\n\n/**\n * Whether the cubic from `a` to `e` lies within `tol` of the polyline through\n * `run`, and every sample of `run` within `tol` of it. The samples hold the\n * run to the cubic; the other way holds the cubic to the run, which a cubic\n * bulging across a sparsely sampled flat fails. The cubic is flattened finely\n * enough that its chords stay within a sixteenth of `tol` of it, and that\n * much is taken off the bound.\n */\nexport function cubicWithin(run: Float64Array, a: Point, cp1: Point, cp2: Point, e: Point, tol: number): boolean {\n // A chord of a cubic split N ways sits within max|B''| / 8N² of it, and |B''| is at most 6 × the larger second difference.\n const bend = 6 * Math.max(Math.hypot(a.x - 2 * cp1.x + cp2.x, a.y - 2 * cp1.y + cp2.y), Math.hypot(cp1.x - 2 * cp2.x + e.x, cp1.y - 2 * cp2.y + e.y));\n const n = Math.min(MAX_CHECK_FLAT, Math.max(8, Math.ceil(Math.sqrt(bend / (8 * CHECK_SAG * tol)))));\n const sag = bend / (8 * n * n);\n const bound = tol - sag;\n if (bound <= 0) return false;\n const flat = new Float64Array(2 * (n + 1));\n flatten(a, cp1, cp2, e, flat);\n return worstFromPolyline(run, flat, bound) <= bound && worstFromPolyline(flat, run, bound) <= bound;\n}\n\n/**\n * The handle lengths, directions held, that bring the run nearest the cubic\n * both ways: a coarse grid, then a pattern search from its best; null when\n * even the best of the grid is far off. Least squares minimizes the sum, so\n * its worst sample can sit well outside a tolerance other lengths meet, often\n * in another basin entirely: a bend near one end wants that end's handle\n * short. The caller checks the result with {@link cubicWithin}.\n */\nexport function searchHandles(run: Float64Array, a: Point, e: Point, tStart: Point, tEnd: Point, tol: number, from: Handles): Handles | null {\n const chord = Math.hypot(e.x - a.x, e.y - a.y);\n const at = (al: number, be: number): Handles => ({\n cp1: { x: a.x + al * tStart.x, y: a.y + al * tStart.y },\n cp2: { x: e.x + be * tEnd.x, y: e.y + be * tEnd.y },\n });\n const flat = new Float64Array(2 * (SEARCH_FLAT + 1));\n /** How far apart the run and the cubic get, or some figure above `bound` once they pass it. */\n const spread = (al: number, be: number, bound: number) => {\n const { cp1, cp2 } = at(al, be);\n flatten(a, cp1, cp2, e, flat);\n const out = worstFromPolyline(run, flat, bound);\n return out > bound ? out : Math.max(out, worstFromPolyline(flat, run, bound));\n };\n const fromAl = Math.max(0, (from.cp1.x - a.x) * tStart.x + (from.cp1.y - a.y) * tStart.y);\n const fromBe = Math.max(0, (from.cp2.x - e.x) * tEnd.x + (from.cp2.y - e.y) * tEnd.y);\n let al = fromAl, be = fromBe, best = spread(al, be, Infinity);\n if (best > SEARCH_REACH * tol) return null;\n for (const fa of GRID) for (const fb of GRID) {\n const d = spread(fa * chord, fb * chord, best);\n if (d < best) { best = d; al = fa * chord; be = fb * chord; }\n }\n if (best > GIVE_UP * tol) return null;\n let step = chord * 0.05;\n for (let i = 0; i < MAX_STEPS && best > TARGET * tol && step > tol / 32; i++) {\n let moved = false;\n for (const [da, db] of STEPS) {\n const na = al + da * step, nb = be + db * step;\n if (na < 0 || nb < 0) continue;\n const d = spread(na, nb, best);\n if (d < best) { best = d; al = na; be = nb; moved = true; break; }\n }\n if (!moved) step /= 2;\n }\n return at(al, be);\n}\n\nconst STEPS = [[1, 0], [-1, 0], [0, 1], [0, -1], [1, 1], [-1, -1], [1, -1], [-1, 1]];\n\n/** The cubic at even parameters, as many as `out` holds points, into `out`. */\nfunction flatten(a: Point, cp1: Point, cp2: Point, e: Point, out: Float64Array): void {\n const n = out.length / 2 - 1;\n const ax = e.x - a.x + 3 * (cp1.x - cp2.x), ay = e.y - a.y + 3 * (cp1.y - cp2.y);\n const bx = 3 * (a.x - 2 * cp1.x + cp2.x), by = 3 * (a.y - 2 * cp1.y + cp2.y);\n const cx = 3 * (cp1.x - a.x), cy = 3 * (cp1.y - a.y);\n for (let k = 0; k <= n; k++) {\n const t = k / n;\n out[2 * k] = ((ax * t + bx) * t + cx) * t + a.x;\n out[2 * k + 1] = ((ay * t + by) * t + cy) * t + a.y;\n }\n}\n\n/**\n * The farthest any interior point of `from` lies from the polyline through\n * `to`, both interleaved `x, y` and running the same way; it stops early,\n * with a figure above `bound`, once one is farther than that. Each point\n * looks only a stretch ahead of where the last one landed, so a polyline\n * doubling back reads as farther than it is, never nearer.\n */\nfunction worstFromPolyline(from: Float64Array, to: Float64Array, bound: number): number {\n const edges = to.length / 2 - 1;\n const reach = Math.max(4, edges >> 2);\n const limit = bound * bound;\n let hint = 0, worst = 0;\n for (let i = 2; i < from.length - 2; i += 2) {\n const px = from[i], py = from[i + 1];\n let near = Infinity, at = hint;\n for (let j = hint, end = Math.min(edges, hint + reach); j < end; j++) {\n const x0 = to[2 * j], y0 = to[2 * j + 1];\n const dx = to[2 * j + 2] - x0, dy = to[2 * j + 3] - y0;\n const len = dx * dx + dy * dy;\n const s = len === 0 ? 0 : Math.min(1, Math.max(0, ((px - x0) * dx + (py - y0) * dy) / len));\n const ex = x0 + s * dx - px, ey = y0 + s * dy - py;\n const d = ex * ex + ey * ey;\n if (d < near) { near = d; at = j; }\n }\n hint = at;\n if (near > worst) {\n worst = near;\n if (worst > limit) break;\n }\n }\n return Math.sqrt(worst);\n}\n","/**\n * Fitting a run of sampled points with as few cubics as hold it within a\n * tolerance, each held to the run's end tangents: the refit `simplifyPath`\n * and `warpPath` share.\n */\nimport { nearestOnLine } from '../nearest';\nimport type { PenAnchor } from './anchors';\nimport type { Point } from './cubicMath';\nimport { cubicWithin, packRun, searchHandles } from './fitHandles';\nimport { fitCubicWithTangents } from './schneiderFit';\n\n/** Give `to`, an anchor a refit kept where `from` was, `from`'s corner spec. */\nexport function keepCorner(to: PenAnchor, from: PenAnchor): void {\n if (from.corner) to.corner = { ...from.corner };\n}\n\n/**\n * Fit `pts` with cubics held to the end tangents, each the longest stretch one\n * cubic holds within `tol`, and append the anchors after the first to `out`\n * (the first too when `out` is empty). `closing` folds the final anchor,\n * which lands on the subpath's first, into that first one.\n */\nexport function fitPointRun(pts: Point[], tStart: Point, tEnd: Point, tol: number, out: PenAnchor[], closing: boolean): void {\n if (out.length === 0) out.push({ x: pts[0].x, y: pts[0].y });\n const segs: Seg[] = [];\n fitGreedy(pts, tStart, tEnd, tol, segs);\n segs.forEach((seg, i) => {\n const prev = out[out.length - 1];\n if (seg.c1) prev.outHandle = seg.c1;\n const isLast = i === segs.length - 1;\n if (closing && isLast) {\n if (seg.c2) out[0].inHandle = seg.c2;\n return;\n }\n out.push(seg.c2 ? { x: seg.end.x, y: seg.end.y, inHandle: seg.c2 } : { x: seg.end.x, y: seg.end.y });\n });\n}\n\ntype Seg = { c1?: Point; c2?: Point; end: Point };\n\n/**\n * Each piece is the longest prefix of what is left that one cubic holds,\n * found by bisecting on its end sample. Splitting at the worst sample instead\n * cuts where a poor first fit strays most, which is rarely where a piece has\n * to end: it refit a puppet-warped bar with twice the anchors it needed.\n */\nfunction fitGreedy(pts: Point[], tStart: Point, tEnd: Point, tol: number, out: Seg[]): void {\n let from = 0;\n let tIn = tStart;\n for (;;) {\n const whole = fitOne(pts.slice(from), tIn, tEnd, tol);\n if (whole) { out.push(whole); return; }\n let lo = from + 1, hi = pts.length - 1;\n let piece: Seg = { end: pts[lo] };\n while (hi - lo > 1) {\n const mid = (lo + hi) >> 1;\n const fit = fitOne(pts.slice(from, mid + 1), tIn, neg(tangentAt(pts, mid)), tol);\n if (fit) { lo = mid; piece = fit; } else hi = mid;\n }\n out.push(piece);\n tIn = tangentAt(pts, lo);\n from = lo;\n }\n}\n\nconst tangentAt = (pts: Point[], k: number): Point => unit(sub2(pts[k + 1], pts[k - 1]));\n\n/** One cubic held to the run's end tangents within `tol` of the run both ways, or null. */\nfunction fitOne(pts: Point[], tStart: Point, tEnd: Point, tol: number): Seg | null {\n const a = pts[0];\n const e = pts[pts.length - 1];\n if (pts.length <= 2 || withinLine(pts, a, e, tol)) return { end: e };\n const run = packRun(pts);\n const { cp1, cp2 } = fitCubicWithTangents(pts, tStart, tEnd);\n if (cubicWithin(run, a, cp1, cp2, e, tol)) return { c1: cp1, c2: cp2, end: e };\n const found = searchHandles(run, a, e, tStart, tEnd, tol, { cp1, cp2 });\n return found && cubicWithin(run, a, found.cp1, found.cp2, e, tol) ? { c1: found.cp1, c2: found.cp2, end: e } : null;\n}\n\nfunction withinLine(pts: Point[], a: Point, e: Point, tol: number): boolean {\n for (let i = 1; i < pts.length - 1; i++) {\n if (nearestOnLine(pts[i].x, pts[i].y, a.x, a.y, e.x, e.y).dist > tol) return false;\n }\n return true;\n}\n\nconst sub2 = (p: Point, q: Point): Point => ({ x: p.x - q.x, y: p.y - q.y });\nconst neg = (p: Point): Point => ({ x: -p.x, y: -p.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"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { b as Point, C as CornerSpec, P as PolygonPath, a as Path } from './path-
|
|
1
|
+
import { b as Point, C as CornerSpec, P as PolygonPath, a as Path } from './path-t80OoJnM.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* One spiral segment, fitted between two points so it leaves the first and
|
|
@@ -106,6 +106,37 @@ declare function isSpiroKind(kind: unknown): kind is SpiroKind;
|
|
|
106
106
|
*/
|
|
107
107
|
declare function solveSpiro(points: readonly SpiroPoint[], closed: boolean): SpiroSegment[];
|
|
108
108
|
|
|
109
|
+
/** `[a, b, c, d, e, f]`: `x' = a·x + c·y + e`, `y' = b·x + d·y + f`. */
|
|
110
|
+
type Affine = readonly [number, number, number, number, number, number];
|
|
111
|
+
/** The transform that leaves a point where it is. */
|
|
112
|
+
declare function identity(): Affine;
|
|
113
|
+
/** A pure translation by `(tx, ty)`. */
|
|
114
|
+
declare function translate(tx: number, ty: number): Affine;
|
|
115
|
+
/** A pure scale about the origin. Scale about another point by composing
|
|
116
|
+
* translate → scale → inverse translate with `multiply`. */
|
|
117
|
+
declare function scale(sx: number, sy: number): Affine;
|
|
118
|
+
/** A pure rotation about the origin, in radians, clockwise in canvas
|
|
119
|
+
* coordinates (y down). */
|
|
120
|
+
declare function rotate(rad: number): Affine;
|
|
121
|
+
/** Compose: result applies `n` first, then `m` (m·n). */
|
|
122
|
+
declare function multiply(m: Affine, n: Affine): Affine;
|
|
123
|
+
/** Inverse, or null when the matrix is singular, non-finite, or too
|
|
124
|
+
* ill-conditioned to invert meaningfully at its own scale. */
|
|
125
|
+
declare function invert(m: Affine): Affine | null;
|
|
126
|
+
/** Apply to a point, returning a tuple. Cold-path use; hot loops inline. */
|
|
127
|
+
declare function applyToPoint(m: Affine, x: number, y: number): [number, number];
|
|
128
|
+
/** Affine that maps source box (sx,sy,sw,sh) onto destination box (dx,dy,dw,dh). */
|
|
129
|
+
declare function boxToBox(sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number): Affine;
|
|
130
|
+
/** Rotation by `rad` about pivot (cx,cy): translate(c)·rotate·translate(-c). */
|
|
131
|
+
declare function rotateAboutPoint(cx: number, cy: number, rad: number): Affine;
|
|
132
|
+
/**
|
|
133
|
+
* Apply an affine to an interleaved coord stream, returning a fresh f64
|
|
134
|
+
* buffer. Command codes are unaffected — for a Bezier the transformed control
|
|
135
|
+
* points define the transformed curve exactly (affine invariance), so callers
|
|
136
|
+
* pass `path.coords` straight through and keep `path.commands` as-is.
|
|
137
|
+
*/
|
|
138
|
+
declare function transformCoords(coords: ArrayLike<number>, m: Affine): Float64Array;
|
|
139
|
+
|
|
109
140
|
/**
|
|
110
141
|
* Screen-pixel lengths in world units, per axis.
|
|
111
142
|
*
|
|
@@ -120,6 +151,8 @@ declare function solveSpiro(points: readonly SpiroPoint[], closed: boolean): Spi
|
|
|
120
151
|
* cases that must stay in world units — a tolerance handed to geometry that
|
|
121
152
|
* doesn't know about the view.
|
|
122
153
|
*/
|
|
154
|
+
|
|
155
|
+
/** A view's zoom on each axis. */
|
|
123
156
|
interface Scale2 {
|
|
124
157
|
x: number;
|
|
125
158
|
y: number;
|
|
@@ -173,6 +206,14 @@ declare function standoff(anchor: {
|
|
|
173
206
|
nx: number;
|
|
174
207
|
ny: number;
|
|
175
208
|
};
|
|
209
|
+
/** One screen-pixel length as extents along each axis of `frame`, in the
|
|
210
|
+
* frame's own units: how far a line across that axis moves to move `px` on
|
|
211
|
+
* screen. `frame` takes the frame to world; only its linear part counts.
|
|
212
|
+
* Zero on both axes for a singular frame, which draws nothing. */
|
|
213
|
+
declare function pxExtentInFrame(px: number, scale: Scale2, frame: Affine): {
|
|
214
|
+
x: number;
|
|
215
|
+
y: number;
|
|
216
|
+
};
|
|
176
217
|
/** The screen angle a frame turned `rotation` from world lands its x axis at.
|
|
177
218
|
* Equals `rotation` under uniform zoom; non-uniform zoom bends it. */
|
|
178
219
|
declare function screenAngleOf(rotation: number, scale: Scale2): number;
|
|
@@ -226,7 +267,9 @@ declare function pathToAnchors(path: PolygonPath): {
|
|
|
226
267
|
* - Both adjacent handles absent → straight L segment.
|
|
227
268
|
* - Either handle present → C segment, with missing handles defaulting to
|
|
228
269
|
* the anchor point itself (degenerate but valid; renders as a near-line).
|
|
229
|
-
* Given `like`, the path being reshaped, the result keeps its fill rules
|
|
270
|
+
* Given `like`, the path being reshaped, the result keeps its fill rules and
|
|
271
|
+
* its origin; without it, the result is measured from the origin `originFor`
|
|
272
|
+
* picks for its points, if any.
|
|
230
273
|
*/
|
|
231
274
|
declare function anchorsToPath(anchors: PenAnchor[][], closed: boolean[], like?: PolygonPath): PolygonPath;
|
|
232
275
|
/**
|
|
@@ -451,4 +494,4 @@ declare function cubicCurvatureSource(p0: Point, p1: Point, p2: Point, p3: Point
|
|
|
451
494
|
*/
|
|
452
495
|
declare function curvatureComb(set: AnchorSet, opts: CurvatureCombOptions): SegmentComb[];
|
|
453
496
|
|
|
454
|
-
export { type
|
|
497
|
+
export { scale as $, type Affine as A, eulerCurvatureAt as B, type CurvatureSource as C, eulerCurvatureDerivativesAt as D, type EulerFit as E, eulerPointAt as F, fitEulerSegment as G, flatAnchorIndex as H, identity as I, insertAnchorOnSegment as J, invert as K, isAnchorSmooth as L, isSpiroKind as M, isStraightSegment as N, locateAnchor as O, type PenAnchor as P, moveHandleTo as Q, multiply as R, type SpiroKind as S, nearestSegmentT as T, openSubpathAt as U, pathToAnchors as V, placeEulerSegment as W, pxExtent as X, pxExtentInFrame as Y, rotate as Z, rotateAboutPoint as _, type AnchorSet as a, scaleDelta as a0, screenAngleOf as a1, segmentAt as a2, segmentEnds as a3, solveSpiro as a4, standoff as a5, transformCoords as a6, translate as a7, translateAnchorBy as a8, withinPxBox as a9, withinPxRadius as aa, type SpiroPoint as b, type Scale2 as c, type AnchorRect as d, type CombTooth as e, type CurvatureCombOptions as f, type EulerSegment as g, SPIRO_KINDS as h, type SegmentComb as i, type SegmentHit as j, type SpiroSegment as k, anchorAt as l, anchorCount as m, anchorsInRect as n, anchorsToPath as o, applyToPoint as p, boxToBox as q, combTeeth as r, countPathAnchors as s, cubicCurvatureAt as t, cubicCurvatureSource as u, cubicDerivativeAt as v, curvatureComb as w, deleteAnchorsAt as x, editAnchorSet as y, eulerAngleAt as z };
|
package/dist/curves/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { P as PolygonPath } from '../path-
|
|
2
|
-
import { S as SpiroKind, C as CurvatureSource } from '../curvature-
|
|
1
|
+
import { P as PolygonPath } from '../path-t80OoJnM.js';
|
|
2
|
+
import { S as SpiroKind, C as CurvatureSource } from '../curvature-CDOI32hv.js';
|
|
3
3
|
|
|
4
4
|
/** A point in the shared anchor set. Every representation reads only the
|
|
5
5
|
* fields it cares about: cubic Bezier reads inHandle/outHandle; NURBS
|
package/dist/curves/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { cubicCurvatureAt, SPIRO_KINDS, eulerCurvatureAt, spiroToPath, eulerPointAt, solveSpiro } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
4
|
-
import { PATH_M, cubicPointAt, PATH_L, PATH_Q, PATH_C } from '../chunk-
|
|
1
|
+
import { cubicCurvatureAt, SPIRO_KINDS, eulerCurvatureAt, spiroToPath, eulerPointAt, solveSpiro } from '../chunk-42TZDN5C.js';
|
|
2
|
+
import '../chunk-3HQJGI63.js';
|
|
3
|
+
import '../chunk-2N6OWA7E.js';
|
|
4
|
+
import { PATH_M, cubicPointAt, PATH_L, PATH_Q, PATH_C } from '../chunk-B3D6KWW3.js';
|
|
5
5
|
|
|
6
6
|
// src/curves/anchorHandles.ts
|
|
7
7
|
var DEFAULT_HANDLE_FRACTION = 1 / 3;
|