pattapatta 0.2.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.
Files changed (74) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +98 -0
  4. package/dist/circle-BDbKfrdR.d.ts +12 -0
  5. package/dist/circlePacking/index.d.ts +78 -0
  6. package/dist/circlePacking/index.js +381 -0
  7. package/dist/circlePacking/index.js.map +1 -0
  8. package/dist/cli.js +365 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/construction/index.d.ts +26 -0
  11. package/dist/construction/index.js +102 -0
  12. package/dist/construction/index.js.map +1 -0
  13. package/dist/contour/index.d.ts +20 -0
  14. package/dist/contour/index.js +118 -0
  15. package/dist/contour/index.js.map +1 -0
  16. package/dist/conversion/index.d.ts +31 -0
  17. package/dist/conversion/index.js +99 -0
  18. package/dist/conversion/index.js.map +1 -0
  19. package/dist/group-BNjVVYSQ.d.ts +13 -0
  20. package/dist/hatch/index.d.ts +41 -0
  21. package/dist/hatch/index.js +253 -0
  22. package/dist/hatch/index.js.map +1 -0
  23. package/dist/hull/index.d.ts +16 -0
  24. package/dist/hull/index.js +97 -0
  25. package/dist/hull/index.js.map +1 -0
  26. package/dist/index.d.ts +67 -0
  27. package/dist/index.js +3933 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/meshing/index.d.ts +125 -0
  30. package/dist/meshing/index.js +1333 -0
  31. package/dist/meshing/index.js.map +1 -0
  32. package/dist/morphology/index.d.ts +58 -0
  33. package/dist/morphology/index.js +268 -0
  34. package/dist/morphology/index.js.map +1 -0
  35. package/dist/optimisation/index.d.ts +43 -0
  36. package/dist/optimisation/index.js +400 -0
  37. package/dist/optimisation/index.js.map +1 -0
  38. package/dist/path-0RjhYjJs.d.ts +21 -0
  39. package/dist/pointSet/index.d.ts +24 -0
  40. package/dist/pointSet/index.js +139 -0
  41. package/dist/pointSet/index.js.map +1 -0
  42. package/dist/polygonisation/index.d.ts +44 -0
  43. package/dist/polygonisation/index.js +310 -0
  44. package/dist/polygonisation/index.js.map +1 -0
  45. package/dist/predicates/index.d.ts +35 -0
  46. package/dist/predicates/index.js +159 -0
  47. package/dist/predicates/index.js.map +1 -0
  48. package/dist/processing/index.d.ts +54 -0
  49. package/dist/processing/index.js +457 -0
  50. package/dist/processing/index.js.map +1 -0
  51. package/dist/segment-BKuIFMKD.d.ts +10 -0
  52. package/dist/segmentSet/index.d.ts +25 -0
  53. package/dist/segmentSet/index.js +109 -0
  54. package/dist/segmentSet/index.js.map +1 -0
  55. package/dist/shapeBoolean/index.d.ts +41 -0
  56. package/dist/shapeBoolean/index.js +211 -0
  57. package/dist/shapeBoolean/index.js.map +1 -0
  58. package/dist/svg/index.d.ts +38 -0
  59. package/dist/svg/index.js +317 -0
  60. package/dist/svg/index.js.map +1 -0
  61. package/dist/tiling/index.d.ts +32 -0
  62. package/dist/tiling/index.js +344 -0
  63. package/dist/tiling/index.js.map +1 -0
  64. package/dist/transformation/index.d.ts +37 -0
  65. package/dist/transformation/index.js +184 -0
  66. package/dist/transformation/index.js.map +1 -0
  67. package/dist/triangulation/index.d.ts +48 -0
  68. package/dist/triangulation/index.js +334 -0
  69. package/dist/triangulation/index.js.map +1 -0
  70. package/dist/vec2-CWyXN1Wj.d.ts +10 -0
  71. package/dist/voronoi/index.d.ts +31 -0
  72. package/dist/voronoi/index.js +211 -0
  73. package/dist/voronoi/index.js.map +1 -0
  74. package/package.json +165 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/vec2.ts","../src/types/circle.ts","../src/types/segment.ts","../src/types/path.ts","../src/types/group.ts","../src/svg/pathData.ts","../src/svg/parse.ts","../src/svg/serialize.ts","../src/clipper/convert.ts","../src/shapeBoolean/index.ts","../src/predicates/index.ts","../src/compare/index.ts","../src/segmentSet/index.ts","../src/segmentSet/clip.ts","../src/hatch/index.ts","../src/circlePacking/index.ts","../src/morphology/buffer.ts","../src/morphology/index.ts","../src/transformation/index.ts","../src/processing/index.ts","../src/conversion/index.ts","../src/contour/index.ts","../src/hull/index.ts","../src/pointSet/index.ts","../src/triangulation/index.ts","../src/optimisation/index.ts","../src/voronoi/index.ts","../src/construction/index.ts","../src/tiling/index.ts","../src/polygonisation/index.ts","../src/meshing/index.ts"],"names":["ring","width","height","cross","bounds","path","intersect","mid","area","dist","minArea","mulberry32","segmentIntersection","m","hull","b","Delaunay","voronoi","squareGrid","densifyRing"],"mappings":"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","file":"index.js","sourcesContent":["/** 2D point / vector. */\nexport type Vec2 = {\n x: number\n y: number\n}\n\nexport function vec2(x: number, y: number): Vec2 {\n return { x, y }\n}\n\nexport function cloneVec2(v: Vec2): Vec2 {\n return { x: v.x, y: v.y }\n}\n\nexport function equalsVec2(a: Vec2, b: Vec2, eps = 1e-9): boolean {\n return Math.abs(a.x - b.x) <= eps && Math.abs(a.y - b.y) <= eps\n}\n","import type { Vec2 } from './vec2.js'\n\n/** Circle with center (x, y) and radius r (PGS often stored radius in PVector.z). */\nexport type Circle = {\n x: number\n y: number\n r: number\n}\n\nexport function circle(x: number, y: number, r: number): Circle {\n return { x, y, r }\n}\n\nexport function circleCenter(c: Circle): Vec2 {\n return { x: c.x, y: c.y }\n}\n","import type { Vec2 } from './vec2.js'\n\n/** Line segment between two points. */\nexport type Segment = {\n a: Vec2\n b: Vec2\n}\n\nexport function segment(a: Vec2, b: Vec2): Segment {\n return { a, b }\n}\n","import type { Vec2 } from './vec2.js'\nimport { cloneVec2, equalsVec2 } from './vec2.js'\n\n/** Ordered ring of vertices (typically without repeating the closing vertex). */\nexport type Ring = Vec2[]\n\n/**\n * A path: one exterior ring plus optional holes, or an open polyline.\n * `rings[0]` is the exterior (or the open polyline when `closed` is false).\n * Additional rings are holes (only meaningful when `closed` is true).\n */\nexport type Path = {\n rings: Ring[]\n closed: boolean\n}\n\nexport function path(rings: Ring[], closed = true): Path {\n return {\n rings: rings.map((ring) => ring.map(cloneVec2)),\n closed,\n }\n}\n\nexport function polyline(points: Ring): Path {\n return path([points], false)\n}\n\nexport function polygon(exterior: Ring, holes: Ring[] = []): Path {\n return path([exterior, ...holes], true)\n}\n\n/** Drop a trailing vertex that duplicates the first (SVG often closes this way). */\nexport function normalizeRing(ring: Ring, eps = 1e-9): Ring {\n if (ring.length < 2) return ring.map(cloneVec2)\n const first = ring[0]\n const last = ring[ring.length - 1]\n if (first && last && equalsVec2(first, last, eps)) {\n return ring.slice(0, -1).map(cloneVec2)\n }\n return ring.map(cloneVec2)\n}\n\nexport function clonePath(p: Path): Path {\n return {\n closed: p.closed,\n rings: p.rings.map((ring) => ring.map(cloneVec2)),\n }\n}\n","import type { Path } from './path.js'\nimport { clonePath } from './path.js'\n\n/**\n * Ordered collection of paths. Later entries are “on top” for occlusion-style ops.\n */\nexport type Group = {\n paths: Path[]\n}\n\nexport function group(paths: Path[] = []): Group {\n return { paths: paths.map(clonePath) }\n}\n\nexport function groupFromPaths(...paths: Path[]): Group {\n return group(paths)\n}\n\nexport function cloneGroup(g: Group): Group {\n return group(g.paths)\n}\n","import type { Ring } from '../types/index.js'\nimport { normalizeRing, vec2 } from '../types/index.js'\n\n/**\n * Minimal SVG path `d` tokenizer for plotter-oriented paths.\n * Supports M/m L/l H/h V/v Z/z. Curves are rejected with a clear error (Phase 1).\n */\nexport function parsePathData(d: string): { rings: Ring[]; closed: boolean } {\n const tokens = tokenize(d)\n const rings: Ring[] = []\n let current: Ring = []\n let cx = 0\n let cy = 0\n let startX = 0\n let startY = 0\n let sawClose = false\n let i = 0\n\n const pushPoint = (x: number, y: number) => {\n current.push(vec2(x, y))\n cx = x\n cy = y\n }\n\n const finishSubpath = () => {\n if (current.length === 0) return\n const ring = normalizeRing(current)\n if (ring.length > 0) rings.push(ring)\n current = []\n }\n\n while (i < tokens.length) {\n const raw = tokens[i]\n if (raw === undefined) break\n i += 1\n\n if (!/^[MmLlHhVvZz]$/.test(raw)) {\n throw new Error(\n `Unsupported SVG path command or token \"${raw}\". Phase 1 supports M/L/H/V/Z only.`,\n )\n }\n\n const relative = raw === raw.toLowerCase()\n const kind = raw.toUpperCase()\n\n if (kind === 'Z') {\n sawClose = true\n finishSubpath()\n cx = startX\n cy = startY\n continue\n }\n\n if (kind === 'M') {\n finishSubpath()\n const pair = readPair(tokens, i)\n i = pair.next\n const x = relative ? cx + pair.x : pair.x\n const y = relative ? cy + pair.y : pair.y\n pushPoint(x, y)\n startX = x\n startY = y\n while (i < tokens.length && isNumberToken(tokens[i])) {\n const next = readPair(tokens, i)\n i = next.next\n const nx = relative ? cx + next.x : next.x\n const ny = relative ? cy + next.y : next.y\n pushPoint(nx, ny)\n }\n continue\n }\n\n if (kind === 'L') {\n while (i < tokens.length && isNumberToken(tokens[i])) {\n const pair = readPair(tokens, i)\n i = pair.next\n const x = relative ? cx + pair.x : pair.x\n const y = relative ? cy + pair.y : pair.y\n pushPoint(x, y)\n }\n continue\n }\n\n if (kind === 'H') {\n while (i < tokens.length && isNumberToken(tokens[i])) {\n const v = readNumber(tokens, i)\n i = v.next\n const x = relative ? cx + v.value : v.value\n pushPoint(x, cy)\n }\n continue\n }\n\n if (kind === 'V') {\n while (i < tokens.length && isNumberToken(tokens[i])) {\n const v = readNumber(tokens, i)\n i = v.next\n const y = relative ? cy + v.value : v.value\n pushPoint(cx, y)\n }\n }\n }\n\n finishSubpath()\n return { rings, closed: sawClose }\n}\n\nexport function serializePathData(rings: Ring[], closed: boolean): string {\n const parts: string[] = []\n for (const ring of rings) {\n if (ring.length === 0) continue\n const first = ring[0]\n if (!first) continue\n parts.push(`M ${fmt(first.x)} ${fmt(first.y)}`)\n for (let i = 1; i < ring.length; i += 1) {\n const p = ring[i]\n if (!p) continue\n parts.push(`L ${fmt(p.x)} ${fmt(p.y)}`)\n }\n if (closed) parts.push('Z')\n }\n return parts.join(' ')\n}\n\nfunction tokenize(d: string): string[] {\n const out: string[] = []\n const re = /([MmLlHhVvZz])|([+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?)/g\n let m: RegExpExecArray | null\n while ((m = re.exec(d)) !== null) {\n const token = m[1] ?? m[2]\n if (token) out.push(token)\n }\n return out\n}\n\nfunction isNumberToken(token: string | undefined): boolean {\n return token !== undefined && /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(token)\n}\n\nfunction readNumber(tokens: string[], i: number): { value: number; next: number } {\n const t = tokens[i]\n if (!isNumberToken(t) || t === undefined) {\n throw new Error(`Expected number in path data at token index ${i}`)\n }\n return { value: Number(t), next: i + 1 }\n}\n\nfunction readPair(\n tokens: string[],\n i: number,\n): { x: number; y: number; next: number } {\n const x = readNumber(tokens, i)\n const y = readNumber(tokens, x.next)\n return { x: x.value, y: y.value, next: y.next }\n}\n\nfunction fmt(n: number): string {\n if (Number.isInteger(n)) return String(n)\n return String(Number(n.toPrecision(12)))\n}\n","import type { Group, Path } from '../types/index.js'\nimport { group, path, polygon, polyline, vec2 } from '../types/index.js'\nimport { parsePathData } from './pathData.js'\n\nconst SHAPE_RE =\n /<(path|rect|circle|line|polyline|polygon)\\b[^>]*\\/?>/gi\n\n/**\n * Parse a subset of SVG into a geometry group.\n * Supports: `path` (M/L/H/V/Z), `rect`, `circle`, `line`, `polyline`, `polygon`.\n * Element order in the document is preserved (later = on top for occlusion).\n */\nexport function parseSvg(svg: string): Group {\n const paths: Path[] = []\n\n for (const match of svg.matchAll(SHAPE_RE)) {\n const el = match[0]\n const tag = match[1]?.toLowerCase()\n if (!tag) continue\n\n if (tag === 'path') {\n const d = getAttr(el, 'd')\n if (!d) continue\n const parsed = parsePathData(d)\n if (parsed.rings.length === 0) continue\n paths.push(path(parsed.rings, parsed.closed))\n continue\n }\n\n if (tag === 'rect') {\n const x = num(getAttr(el, 'x'), 0)\n const y = num(getAttr(el, 'y'), 0)\n const w = num(getAttr(el, 'width'), 0)\n const h = num(getAttr(el, 'height'), 0)\n if (w === 0 || h === 0) continue\n paths.push(\n polygon([\n vec2(x, y),\n vec2(x + w, y),\n vec2(x + w, y + h),\n vec2(x, y + h),\n ]),\n )\n continue\n }\n\n if (tag === 'circle') {\n const cx = num(getAttr(el, 'cx'), 0)\n const cy = num(getAttr(el, 'cy'), 0)\n const r = num(getAttr(el, 'r'), 0)\n if (r <= 0) continue\n paths.push(polygon(circleRing(cx, cy, r, 64)))\n continue\n }\n\n if (tag === 'line') {\n const x1 = num(getAttr(el, 'x1'), 0)\n const y1 = num(getAttr(el, 'y1'), 0)\n const x2 = num(getAttr(el, 'x2'), 0)\n const y2 = num(getAttr(el, 'y2'), 0)\n paths.push(polyline([vec2(x1, y1), vec2(x2, y2)]))\n continue\n }\n\n if (tag === 'polyline') {\n const pts = parsePoints(getAttr(el, 'points') ?? '')\n if (pts.length >= 2) paths.push(polyline(pts))\n continue\n }\n\n if (tag === 'polygon') {\n const pts = parsePoints(getAttr(el, 'points') ?? '')\n if (pts.length >= 3) paths.push(polygon(pts))\n }\n }\n\n return group(paths)\n}\n\nfunction getAttr(el: string, name: string): string | undefined {\n const re = new RegExp(`\\\\b${name}\\\\s*=\\\\s*[\"']([^\"']*)[\"']`, 'i')\n const m = re.exec(el)\n return m?.[1]\n}\n\nfunction num(value: string | undefined, fallback: number): number {\n if (value === undefined || value === '') return fallback\n const n = Number(value)\n return Number.isFinite(n) ? n : fallback\n}\n\nfunction parsePoints(points: string) {\n const nums = points\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean)\n .map(Number)\n const out = []\n for (let i = 0; i + 1 < nums.length; i += 2) {\n const x = nums[i]\n const y = nums[i + 1]\n if (x === undefined || y === undefined) continue\n if (!Number.isFinite(x) || !Number.isFinite(y)) continue\n out.push(vec2(x, y))\n }\n return out\n}\n\nfunction circleRing(cx: number, cy: number, r: number, segments: number) {\n const ring = []\n for (let i = 0; i < segments; i += 1) {\n const t = (i / segments) * Math.PI * 2\n ring.push(vec2(cx + r * Math.cos(t), cy + r * Math.sin(t)))\n }\n return ring\n}\n","import type { Group, Path } from '../types/index.js'\nimport { serializePathData } from './pathData.js'\n\nexport type ToSvgOptions = {\n /** SVG viewBox attribute, e.g. `\"0 0 100 100\"`. */\n viewBox?: string\n /** Root width/height attributes (optional). */\n width?: number | string\n height?: number | string\n /** Stroke color (default `#000`). */\n stroke?: string\n /** Stroke width (default `1`). */\n strokeWidth?: number | string\n}\n\n/**\n * Serialize a group to plotter-oriented SVG (`fill=\"none\"`, stroked paths).\n */\nexport function toSvg(g: Group, options: ToSvgOptions = {}): string {\n const stroke = options.stroke ?? '#000'\n const strokeWidth = options.strokeWidth ?? 1\n const viewBox = options.viewBox ?? inferViewBox(g)\n const widthAttr =\n options.width !== undefined ? ` width=\"${options.width}\"` : ''\n const heightAttr =\n options.height !== undefined ? ` height=\"${options.height}\"` : ''\n\n const body = g.paths\n .map((p) => pathElement(p, stroke, strokeWidth))\n .filter(Boolean)\n .join('\\n ')\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>`,\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${viewBox}\"${widthAttr}${heightAttr} fill=\"none\">`,\n body ? ` ${body}` : '',\n `</svg>`,\n ]\n .filter((line) => line !== '')\n .join('\\n')\n}\n\nfunction pathElement(\n p: Path,\n stroke: string,\n strokeWidth: number | string,\n): string {\n if (p.rings.length === 0) return ''\n const d = serializePathData(p.rings, p.closed)\n if (!d) return ''\n return `<path d=\"${d}\" stroke=\"${stroke}\" stroke-width=\"${strokeWidth}\" fill=\"none\" />`\n}\n\nfunction inferViewBox(g: Group): string {\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const p of g.paths) {\n for (const ring of p.rings) {\n for (const v of ring) {\n minX = Math.min(minX, v.x)\n minY = Math.min(minY, v.y)\n maxX = Math.max(maxX, v.x)\n maxY = Math.max(maxY, v.y)\n }\n }\n }\n if (!Number.isFinite(minX)) return '0 0 100 100'\n const pad = 1\n const w = Math.max(maxX - minX, 0) + pad * 2\n const h = Math.max(maxY - minY, 0) + pad * 2\n return `${minX - pad} ${minY - pad} ${w} ${h}`\n}\n","import {\n FillRule,\n areaD,\n differenceD,\n intersectD,\n isPositiveD,\n pointInPolygonD,\n PointInPolygonResult,\n unionD,\n xorD,\n type PathD,\n type PathsD,\n type PointD,\n} from 'clipper2-ts'\nimport type { Group, Path, Ring, Vec2 } from '../types/index.js'\nimport { group, normalizeRing, path, vec2 } from '../types/index.js'\n\nexport const DEFAULT_FILL_RULE = FillRule.NonZero\n\nexport function ringToPathD(ring: Ring): PathD {\n const pts: PointD[] = []\n for (const v of normalizeRing(ring)) {\n pts.push({ x: v.x, y: v.y, z: 0 })\n }\n return pts\n}\n\n/** Closed path → Clipper subject/clip paths (exterior + holes). */\nexport function pathToPathsD(p: Path): PathsD {\n if (!p.closed || p.rings.length === 0) {\n throw new Error('Boolean ops require a closed path with at least one ring')\n }\n return p.rings.map((ring) => ringToPathD(ring))\n}\n\nexport function pathsDToGroup(paths: PathsD): Group {\n if (paths.length === 0) return group([])\n\n const outers: { ring: Ring; holes: Ring[] }[] = []\n const holes: Ring[] = []\n\n for (const pd of paths) {\n const ring = pathDToRing(pd)\n if (ring.length < 3) continue\n if (isPositiveD(pd)) {\n outers.push({ ring, holes: [] })\n } else {\n holes.push(ring)\n }\n }\n\n for (const hole of holes) {\n const sample = hole[0]\n if (!sample) continue\n let assigned = false\n for (const outer of outers) {\n if (pointInRing(sample, outer.ring)) {\n outer.holes.push(hole)\n assigned = true\n break\n }\n }\n if (!assigned) {\n // Treat unmatched negative rings as their own outers (orientation flip).\n outers.push({ ring: [...hole].reverse(), holes: [] })\n }\n }\n\n return group(outers.map((o) => path([o.ring, ...o.holes], true)))\n}\n\nexport function pathDToRing(pd: PathD): Ring {\n return normalizeRing(pd.map((p) => vec2(p.x, p.y)))\n}\n\nexport function pointInRing(point: Vec2, ring: Ring): boolean {\n const result = pointInPolygonD(\n { x: point.x, y: point.y, z: 0 },\n ringToPathD(ring),\n )\n return (\n result === PointInPolygonResult.IsInside ||\n result === PointInPolygonResult.IsOn\n )\n}\n\nexport function clipUnion(a: PathsD, b: PathsD): PathsD {\n return unionD(a, b, DEFAULT_FILL_RULE)\n}\n\nexport function clipIntersect(a: PathsD, b: PathsD): PathsD {\n return intersectD(a, b, DEFAULT_FILL_RULE)\n}\n\nexport function clipDifference(a: PathsD, b: PathsD): PathsD {\n return differenceD(a, b, DEFAULT_FILL_RULE)\n}\n\nexport function clipXor(a: PathsD, b: PathsD): PathsD {\n return xorD(a, b, DEFAULT_FILL_RULE)\n}\n\nexport function pathsArea(paths: PathsD): number {\n let sum = 0\n for (const p of paths) {\n sum += Math.abs(areaD(p))\n }\n return sum\n}\n","import type { Group, Path } from '../types/index.js'\nimport { group, groupFromPaths, path, polygon, vec2 } from '../types/index.js'\nimport {\n clipDifference,\n clipIntersect,\n clipUnion,\n clipXor,\n pathToPathsD,\n pathsDToGroup,\n} from '../clipper/convert.js'\n\nfunction ensureClosed(p: Path): Path {\n if (!p.closed) {\n throw new Error('shapeBoolean requires closed paths')\n }\n return p\n}\n\n/** Union of two closed paths. */\nexport function union(a: Path, b: Path): Group {\n const result = clipUnion(pathToPathsD(ensureClosed(a)), pathToPathsD(ensureClosed(b)))\n return pathsDToGroup(result)\n}\n\n/** Union of many closed paths (folded left-to-right). */\nexport function unionAll(paths: Path[]): Group {\n if (paths.length === 0) return group([])\n let acc = pathToPathsD(ensureClosed(paths[0]!))\n for (let i = 1; i < paths.length; i++) {\n acc = clipUnion(acc, pathToPathsD(ensureClosed(paths[i]!)))\n }\n return pathsDToGroup(acc)\n}\n\n/** Intersection of two closed paths. */\nexport function intersect(a: Path, b: Path): Group {\n const result = clipIntersect(\n pathToPathsD(ensureClosed(a)),\n pathToPathsD(ensureClosed(b)),\n )\n return pathsDToGroup(result)\n}\n\n/** Subtract b from a (a \\ b). */\nexport function subtract(a: Path, b: Path): Group {\n const result = clipDifference(\n pathToPathsD(ensureClosed(a)),\n pathToPathsD(ensureClosed(b)),\n )\n return pathsDToGroup(result)\n}\n\n/** Subtract many shapes from a base. */\nexport function subtractAll(base: Path, shapes: Path[]): Group {\n let acc = pathToPathsD(ensureClosed(base))\n for (const s of shapes) {\n acc = clipDifference(acc, pathToPathsD(ensureClosed(s)))\n }\n return pathsDToGroup(acc)\n}\n\n/** Symmetric difference. */\nexport function symDifference(a: Path, b: Path): Group {\n const result = clipXor(pathToPathsD(ensureClosed(a)), pathToPathsD(ensureClosed(b)))\n return pathsDToGroup(result)\n}\n\n/** Complement of shape within axis-aligned rectangle [0,width] x [0,height]. */\nexport function complement(shape: Path, width: number, height: number): Group {\n const frame = polygon([\n vec2(0, 0),\n vec2(width, 0),\n vec2(width, height),\n vec2(0, height),\n ])\n return subtract(frame, shape)\n}\n\n/**\n * Painter-style occlusion: later paths in the group are on top.\n * Each path has higher paths subtracted from it; returns visible remainders.\n */\nexport function occlusionSubtract(g: Group): Group {\n const paths = g.paths\n const visible: Path[] = []\n for (let i = 0; i < paths.length; i++) {\n const subject = paths[i]\n if (!subject) continue\n const occluders = paths.slice(i + 1)\n const piece =\n occluders.length === 0\n ? groupFromPaths(ensureClosed(subject))\n : subtractAll(subject, occluders)\n for (const p of piece.paths) {\n visible.push(p)\n }\n }\n return group(visible)\n}\n\n/**\n * Regions covered by at least two input shapes.\n * If `merged`, collapse multi-overlaps into disjoint patches via union of pairwise intersects.\n */\nexport function overlapRegions(shapes: Path[], merged: boolean): Group {\n if (shapes.length < 2) return group([])\n const pairs: Path[] = []\n for (let i = 0; i < shapes.length; i++) {\n for (let j = i + 1; j < shapes.length; j++) {\n const a = shapes[i]\n const b = shapes[j]\n if (!a || !b) continue\n for (const p of intersect(a, b).paths) {\n pairs.push(p)\n }\n }\n }\n if (!merged) return group(pairs)\n return unionAll(pairs)\n}\n\nexport const shapeBoolean = {\n union,\n unionAll,\n intersect,\n subtract,\n subtractAll,\n symDifference,\n complement,\n occlusionSubtract,\n overlapRegions,\n}\n","import type { Group, Path, Vec2 } from '../types/index.js'\nimport { vec2 } from '../types/index.js'\nimport {\n pathToPathsD,\n pathsArea,\n pointInRing,\n} from '../clipper/convert.js'\n\n/** Signed area of a closed ring (shoelace). */\nexport function ringArea(ring: Vec2[]): number {\n if (ring.length < 3) return 0\n let sum = 0\n for (let i = 0; i < ring.length; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % ring.length]!\n sum += a.x * b.y - b.x * a.y\n }\n return sum / 2\n}\n\n/** Absolute area of a closed path (exterior minus holes). */\nexport function area(p: Path): number {\n if (!p.closed || p.rings.length === 0) return 0\n try {\n return pathsArea(pathToPathsD(p))\n } catch {\n let total = 0\n for (let i = 0; i < p.rings.length; i++) {\n const a = Math.abs(ringArea(p.rings[i]!))\n total += i === 0 ? a : -a\n }\n return Math.max(0, total)\n }\n}\n\nexport function areaGroup(g: Group): number {\n return g.paths.reduce((sum, p) => sum + area(p), 0)\n}\n\n/** Centroid of a closed exterior ring (ignores holes for Phase 2). */\nexport function centroid(p: Path): Vec2 {\n const ring = p.rings[0]\n if (!ring || ring.length === 0) return vec2(0, 0)\n const a = ringArea(ring)\n if (Math.abs(a) < 1e-12) {\n let sx = 0\n let sy = 0\n for (const v of ring) {\n sx += v.x\n sy += v.y\n }\n return vec2(sx / ring.length, sy / ring.length)\n }\n let cx = 0\n let cy = 0\n for (let i = 0; i < ring.length; i++) {\n const p0 = ring[i]!\n const p1 = ring[(i + 1) % ring.length]!\n const cross = p0.x * p1.y - p1.x * p0.y\n cx += (p0.x + p1.x) * cross\n cy += (p0.y + p1.y) * cross\n }\n return vec2(cx / (6 * a), cy / (6 * a))\n}\n\nexport function containsPoint(p: Path, point: Vec2): boolean {\n if (!p.closed || !p.rings[0]) return false\n if (!pointInRing(point, p.rings[0])) return false\n for (let i = 1; i < p.rings.length; i++) {\n const hole = p.rings[i]\n if (hole && pointInRing(point, hole)) return false\n }\n return true\n}\n\nexport function bounds(p: Path): {\n minX: number\n minY: number\n maxX: number\n maxY: number\n} {\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const ring of p.rings) {\n for (const v of ring) {\n minX = Math.min(minX, v.x)\n minY = Math.min(minY, v.y)\n maxX = Math.max(maxX, v.x)\n maxY = Math.max(maxY, v.y)\n }\n }\n if (!Number.isFinite(minX)) {\n return { minX: 0, minY: 0, maxX: 0, maxY: 0 }\n }\n return { minX, minY, maxX, maxY }\n}\n\nexport function width(p: Path): number {\n const b = bounds(p)\n return b.maxX - b.minX\n}\n\nexport function height(p: Path): number {\n const b = bounds(p)\n return b.maxY - b.minY\n}\n\n/** Rough polygon similarity via absolute area difference relative to max area. */\nexport function areaSimilarity(a: Path, b: Path): number {\n const aa = area(a)\n const bb = area(b)\n const denom = Math.max(aa, bb, 1e-12)\n return 1 - Math.abs(aa - bb) / denom\n}\n\nexport const predicates = {\n area,\n areaGroup,\n ringArea,\n centroid,\n containsPoint,\n bounds,\n width,\n height,\n areaSimilarity,\n}\n","import type { Group, Path, Vec2 } from '../types/index.js'\nimport { polygon, vec2 } from '../types/index.js'\nimport { areaGroup } from '../predicates/index.js'\n\nexport type OracleCase = {\n id: string\n seed: number\n operation: string\n outputs: {\n paths: { rings: number[][][] }[]\n lines: number[][][]\n circles: { x: number; y: number; r: number }[]\n scalars: { area?: number; [k: string]: number | undefined }\n }\n}\n\nexport function ringsToPath(rings: number[][][]): Path {\n const converted = rings.map((ring) =>\n ring.map((pt) => vec2(pt[0]!, pt[1]!)),\n )\n return polygon(converted[0] ?? [], converted.slice(1))\n}\n\nexport function oraclePathsToGroup(paths: { rings: number[][][] }[]): Group {\n return {\n paths: paths.map((p) => ringsToPath(p.rings)),\n }\n}\n\n/** Relative area error between two groups. */\nexport function relativeAreaError(a: Group, b: Group): number {\n const aa = areaGroup(a)\n const bb = areaGroup(b)\n const denom = Math.max(Math.abs(aa), Math.abs(bb), 1e-12)\n return Math.abs(aa - bb) / denom\n}\n\nexport function assertAreaClose(\n actual: Group,\n expectedArea: number,\n tol = 1e-3,\n): void {\n const got = areaGroup(actual)\n const denom = Math.max(Math.abs(expectedArea), 1e-12)\n const err = Math.abs(got - expectedArea) / denom\n if (err > tol) {\n throw new Error(\n `Area mismatch: got ${got}, expected ${expectedArea}, relErr=${err}`,\n )\n }\n}\n\n/** Sample grid points: fraction of points with same containment in both groups. */\nexport function containmentAgreement(\n a: Group,\n b: Group,\n samples = 20,\n): number {\n const bounds = unionBounds(a, b)\n if (bounds.maxX === bounds.minX || bounds.maxY === bounds.minY) return 1\n let agree = 0\n let total = 0\n for (let i = 0; i < samples; i++) {\n for (let j = 0; j < samples; j++) {\n const x =\n bounds.minX + ((i + 0.5) / samples) * (bounds.maxX - bounds.minX)\n const y =\n bounds.minY + ((j + 0.5) / samples) * (bounds.maxY - bounds.minY)\n const p = vec2(x, y)\n const inA = pointInGroup(a, p)\n const inB = pointInGroup(b, p)\n if (inA === inB) agree += 1\n total += 1\n }\n }\n return agree / total\n}\n\nfunction pointInGroup(g: Group, p: Vec2): boolean {\n for (const path of g.paths) {\n if (!path.closed || !path.rings[0]) continue\n // exterior\n if (!pointInPoly(p, path.rings[0])) continue\n let inHole = false\n for (let i = 1; i < path.rings.length; i++) {\n const hole = path.rings[i]\n if (hole && pointInPoly(p, hole)) {\n inHole = true\n break\n }\n }\n if (!inHole) return true\n }\n return false\n}\n\nfunction pointInPoly(point: Vec2, ring: Vec2[]): boolean {\n // ray cast\n let inside = false\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n const xi = ring[i]!.x\n const yi = ring[i]!.y\n const xj = ring[j]!.x\n const yj = ring[j]!.y\n const intersect =\n yi > point.y !== yj > point.y &&\n point.x < ((xj - xi) * (point.y - yi)) / (yj - yi + 0.0) + xi\n if (intersect) inside = !inside\n }\n return inside\n}\n\nfunction unionBounds(a: Group, b: Group) {\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const g of [a, b]) {\n for (const p of g.paths) {\n for (const ring of p.rings) {\n for (const v of ring) {\n minX = Math.min(minX, v.x)\n minY = Math.min(minY, v.y)\n maxX = Math.max(maxX, v.x)\n maxY = Math.max(maxY, v.y)\n }\n }\n }\n }\n return { minX, minY, maxX, maxY }\n}\n","import type { Segment, Vec2 } from '../types/index.js'\nimport { segment, vec2 } from '../types/index.js'\n\n/** Match Processing `float` for PGS parity on hatch fixtures. */\nfunction f32(n: number): number {\n return Math.fround(n)\n}\n\n/**\n * Parallel segments through a center point (PGS `parallelSegments` semantics).\n * `length` is the half-length along the segment direction; full span is `2 * length`.\n * `angle` is radians along the segment; spacing is perpendicular.\n */\nexport function parallelSegments(\n centerX: number,\n centerY: number,\n length: number,\n spacing: number,\n angle: number,\n n: number,\n): Segment[] {\n const edges: Segment[] = []\n if (n < 1) return edges\n\n const center = vec2(f32(centerX), f32(centerY))\n let dx = f32(Math.cos(angle + Math.PI / 2) * spacing)\n let dy = f32(Math.sin(angle + Math.PI / 2) * spacing)\n const cos = f32(Math.cos(angle))\n const sin = f32(Math.sin(angle))\n const l = f32(length)\n\n let i: number\n let offX = 0\n let offY = 0\n\n if (n % 2 === 1) {\n const a = vec2(f32(center.x + cos * l), f32(center.y + sin * l))\n const b = vec2(f32(center.x + cos * -l), f32(center.y + sin * -l))\n edges.push(segment(a, b))\n i = 1\n } else {\n dx = f32(dx / 2)\n dy = f32(dy / 2)\n i = 1\n {\n let a = vec2(f32(center.x + dx * i), f32(center.y + dy * i))\n const b = vec2(f32(a.x + cos * l), f32(a.y + sin * l))\n a = vec2(f32(a.x + cos * -l), f32(a.y + sin * -l))\n edges.push(segment(a, b))\n }\n {\n let a = vec2(f32(center.x + dx * -i), f32(center.y + dy * -i))\n const b = vec2(f32(a.x + cos * l), f32(a.y + sin * l))\n a = vec2(f32(a.x + cos * -l), f32(a.y + sin * -l))\n edges.push(segment(a, b))\n }\n i = 2\n dx = f32(dx * 2)\n dy = f32(dy * 2)\n offX = f32(dx / 2)\n offY = f32(dy / 2)\n }\n\n for (; i < 1 + Math.floor(n / 2); i++) {\n {\n let a = vec2(\n f32(center.x + dx * i - offX),\n f32(center.y + dy * i - offY),\n )\n const b = vec2(f32(a.x + cos * l), f32(a.y + sin * l))\n a = vec2(f32(a.x + cos * -l), f32(a.y + sin * -l))\n edges.push(segment(a, b))\n }\n {\n let a = vec2(\n f32(center.x + dx * -i + offX),\n f32(center.y + dy * -i + offY),\n )\n const b = vec2(f32(a.x + cos * l), f32(a.y + sin * l))\n a = vec2(f32(a.x + cos * -l), f32(a.y + sin * -l))\n edges.push(segment(a, b))\n }\n }\n\n return edges\n}\n\nexport function filterByMinLength(\n segments: Segment[],\n minLength: number,\n): Segment[] {\n return segments.filter((s) => segmentLength(s) >= minLength)\n}\n\nexport function filterAxisAligned(\n segments: Segment[],\n angleDelta: number,\n): Segment[] {\n return segments.filter((s) => {\n const ang = Math.abs(Math.atan2(s.b.y - s.a.y, s.b.x - s.a.x))\n const norm = Math.min(ang % Math.PI, Math.PI - (ang % Math.PI))\n const nearH = norm <= angleDelta || Math.abs(norm - Math.PI) <= angleDelta\n const nearV = Math.abs(norm - Math.PI / 2) <= angleDelta\n return !(nearH || nearV)\n })\n}\n\nexport function segmentLength(s: Segment): number {\n const dx = s.b.x - s.a.x\n const dy = s.b.y - s.a.y\n return Math.hypot(dx, dy)\n}\n\nexport function segmentsToOpenPaths(segments: Segment[]) {\n return segments.map((s) => ({\n rings: [[s.a, s.b]],\n closed: false as const,\n }))\n}\n\nexport const segmentSet = {\n parallelSegments,\n filterByMinLength,\n filterAxisAligned,\n segmentLength,\n segmentsToOpenPaths,\n}\n\nexport type { Vec2 }\n","import type { Path, Ring, Segment, Vec2 } from '../types/index.js'\nimport { segment, vec2 } from '../types/index.js'\nimport { containsPoint } from '../predicates/index.js'\n\ntype Hit = { t: number; p: Vec2 }\n\n/**\n * Clip an open segment to the interior of a closed path (exterior minus holes).\n * Returns zero or more interior sub-segments.\n */\nexport function clipSegmentToPath(seg: Segment, clip: Path): Segment[] {\n if (!clip.closed || !clip.rings[0]) return []\n\n const hits: Hit[] = []\n const pushHit = (t: number, p: Vec2) => {\n if (t < -1e-9 || t > 1 + 1e-9) return\n const tt = Math.min(1, Math.max(0, t))\n for (const h of hits) {\n if (Math.abs(h.t - tt) < 1e-9) return\n }\n hits.push({ t: tt, p })\n }\n\n if (containsPoint(clip, seg.a)) pushHit(0, seg.a)\n if (containsPoint(clip, seg.b)) pushHit(1, seg.b)\n\n for (const ring of clip.rings) {\n for (let i = 0; i < ring.length; i++) {\n const e0 = ring[i]!\n const e1 = ring[(i + 1) % ring.length]!\n const hit = segmentIntersection(seg.a, seg.b, e0, e1)\n if (hit) pushHit(hit.t, hit.p)\n }\n }\n\n hits.sort((a, b) => a.t - b.t)\n if (hits.length < 2) return []\n\n const out: Segment[] = []\n for (let i = 0; i + 1 < hits.length; i++) {\n const h0 = hits[i]!\n const h1 = hits[i + 1]!\n if (h1.t - h0.t < 1e-9) continue\n const mid = vec2((h0.p.x + h1.p.x) / 2, (h0.p.y + h1.p.y) / 2)\n if (containsPoint(clip, mid)) {\n out.push(segment(h0.p, h1.p))\n }\n }\n return out\n}\n\nexport function clipSegmentsToPath(\n segments: Segment[],\n clip: Path,\n): Segment[] {\n const out: Segment[] = []\n for (const s of segments) {\n out.push(...clipSegmentToPath(s, clip))\n }\n return out\n}\n\nfunction segmentIntersection(\n a: Vec2,\n b: Vec2,\n c: Vec2,\n d: Vec2,\n): { t: number; p: Vec2 } | null {\n const rX = b.x - a.x\n const rY = b.y - a.y\n const sX = d.x - c.x\n const sY = d.y - c.y\n const denom = rX * sY - rY * sX\n if (Math.abs(denom) < 1e-12) return null\n const t = ((c.x - a.x) * sY - (c.y - a.y) * sX) / denom\n const u = ((c.x - a.x) * rY - (c.y - a.y) * rX) / denom\n if (t < -1e-9 || t > 1 + 1e-9 || u < -1e-9 || u > 1 + 1e-9) return null\n return {\n t,\n p: vec2(a.x + t * rX, a.y + t * rY),\n }\n}\n\n/** @internal exported for tests */\nexport type { Ring }\n","import type { Path, Segment } from '../types/index.js'\nimport { parallelSegments } from '../segmentSet/index.js'\nimport { clipSegmentsToPath } from '../segmentSet/clip.js'\n\nexport type ParallelHatchOptions = {\n /** Hatch angle in radians (segment direction). Default `Math.PI / 4`. */\n angle?: number\n /** Perpendicular spacing between lines. Default `0.15`. */\n spacing?: number\n /**\n * Half-length of generated lines before clipping (PGS `length`).\n * Default: diagonal of path bounds.\n */\n length?: number\n /**\n * Number of parallel lines (PGS `n`).\n * Default: enough lines to cover the path AABB at the given spacing.\n */\n count?: number\n /** Hatch field center. Default: path centroid of exterior bounds center. */\n center?: { x: number; y: number }\n}\n\n/**\n * Fill a closed path with parallel hatch strokes (plotter-safe).\n * Composes `parallelSegments` + clip-to-path (PGS dysonHatching recipe).\n *\n * When `count` is omitted, line count is derived from `spacing` and the path\n * bounds so the hatch covers the whole region (no corner gaps).\n */\nexport function parallel(path: Path, options: ParallelHatchOptions = {}): Segment[] {\n if (!path.closed || !path.rings[0]) {\n throw new Error('hatch.parallel requires a closed path')\n }\n\n const bounds = pathBounds(path)\n const center = options.center ?? {\n x: (bounds.minX + bounds.maxX) / 2,\n y: (bounds.minY + bounds.maxY) / 2,\n }\n const diag = Math.hypot(bounds.maxX - bounds.minX, bounds.maxY - bounds.minY)\n const length = options.length ?? Math.max(diag, 1e-6)\n const spacing = Math.max(options.spacing ?? 0.15, 1e-9)\n const angle = options.angle ?? Math.PI / 4\n const count = options.count ?? hatchLineCount(bounds, spacing, angle)\n\n const raw = parallelSegments(\n center.x,\n center.y,\n length,\n spacing,\n angle,\n count,\n )\n return clipSegmentsToPath(raw, path)\n}\n\n/** Cross-hatch: two perpendicular parallel passes. */\nexport function cross(path: Path, options: ParallelHatchOptions = {}): Segment[] {\n const angle = options.angle ?? Math.PI / 4\n const a = parallel(path, options)\n const b = parallel(path, { ...options, angle: angle + Math.PI / 2 })\n return [...a, ...b]\n}\n\n/** Lines needed so perpendicular spacing covers the AABB at `angle`. */\nfunction hatchLineCount(\n bounds: { minX: number; minY: number; maxX: number; maxY: number },\n spacing: number,\n angle: number,\n): number {\n const nx = Math.cos(angle + Math.PI / 2)\n const ny = Math.sin(angle + Math.PI / 2)\n const corners: [number, number][] = [\n [bounds.minX, bounds.minY],\n [bounds.maxX, bounds.minY],\n [bounds.maxX, bounds.maxY],\n [bounds.minX, bounds.maxY],\n ]\n let minP = Infinity\n let maxP = -Infinity\n for (const [x, y] of corners) {\n const p = x * nx + y * ny\n minP = Math.min(minP, p)\n maxP = Math.max(maxP, p)\n }\n const extent = maxP - minP\n return Math.max(1, Math.ceil(extent / spacing) + 1)\n}\n\nfunction pathBounds(path: Path) {\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const ring of path.rings) {\n for (const v of ring) {\n minX = Math.min(minX, v.x)\n minY = Math.min(minY, v.y)\n maxX = Math.max(maxX, v.x)\n maxY = Math.max(maxY, v.y)\n }\n }\n return { minX, minY, maxX, maxY }\n}\n\nexport const hatch = {\n parallel,\n cross,\n}\n","import type { Circle, Path, Vec2 } from '../types/index.js'\nimport { circle } from '../types/index.js'\nimport { bounds, containsPoint } from '../predicates/index.js'\n\n/**\n * Lattice inclusion mode.\n * - `overlap` (default): full-path fill — keep disks that overlap the path;\n * center the lattice so opposite-edge cutoffs match. Clip in SVG to cut at\n * the boundary (including holes).\n * - `contained`: keep only disks fully inside the path (when you must stroke\n * complete circles); lattice centered with equal leftover margins.\n */\nexport type LatticePackMode = 'overlap' | 'contained'\n\n/**\n * Square lattice of equal circles.\n * @see docs/decisions/0003-deferred-circle-packing.md\n */\nexport function squareLatticePack(\n path: Path,\n diameter: number,\n mode: LatticePackMode = 'overlap',\n): Circle[] {\n const d = Math.max(diameter, 0.1)\n const r = d / 2\n const b = bounds(path)\n const out: Circle[] = []\n const accept =\n mode === 'contained' ? circleContainedInPath : circleOverlapsPath\n const inset = mode === 'contained' ? r : 0\n const { ox, oy, nX, nY } = centeredLatticeGrid(b, d, d, inset, d)\n if (nX < 1 || nY < 1) return out\n\n for (let i = 0; i < nX; i++) {\n for (let j = 0; j < nY; j++) {\n const c = circle(ox + i * d, oy + j * d, r)\n if (accept(c, path)) out.push(c)\n }\n }\n return out\n}\n\n/**\n * Hexagonal lattice of equal circles.\n */\nexport function hexLatticePack(\n path: Path,\n diameter: number,\n mode: LatticePackMode = 'overlap',\n): Circle[] {\n const d = Math.max(diameter, 0.1)\n const r = d / 2\n const b = bounds(path)\n const z = r * Math.sqrt(3)\n const out: Circle[] = []\n const accept =\n mode === 'contained' ? circleContainedInPath : circleOverlapsPath\n const inset = mode === 'contained' ? r : 0\n const { ox, nX, nY } = centeredLatticeGrid(b, z, d, inset, d)\n if (nX < 1 || nY < 1) return out\n\n // First column uses offset `r`, so Y centers span [oy - r, oy + (nY-1)*d].\n // Re-center that full extent so top/bottom cutoffs match.\n const innerH = b.maxY - b.minY - 2 * inset\n const extentY = (nY - 1) * d + r\n const oy = b.minY + inset + (innerH - extentY) / 2 + r\n\n let offset = 0\n for (let i = 0; i < nX; i++) {\n offset = offset === r ? 0 : r\n for (let j = 0; j < nY; j++) {\n const c = circle(ox + i * z, oy + j * d - offset, r)\n if (accept(c, path)) out.push(c)\n }\n }\n return out\n}\n\n/**\n * Centered lattice grid. `inset` > 0 (contained) keeps disk edges inside the AABB;\n * `inset` 0 (overlap) matches PGS coverage count, shifted so opposite cutoffs match.\n * `endPad` mirrors the historical loop bound `max + diameter`.\n */\nfunction centeredLatticeGrid(\n b: { minX: number; minY: number; maxX: number; maxY: number },\n stepX: number,\n stepY: number,\n inset: number,\n endPad: number,\n): { ox: number; oy: number; nX: number; nY: number } {\n const innerW = b.maxX - b.minX - 2 * inset\n const innerH = b.maxY - b.minY - 2 * inset\n if (innerW < -1e-9 || innerH < -1e-9) {\n return { ox: 0, oy: 0, nX: 0, nY: 0 }\n }\n\n let nX: number\n let nY: number\n if (inset > 0) {\n nX = Math.floor(innerW / stepX + 1e-9) + 1\n nY = Math.floor(innerH / stepY + 1e-9) + 1\n } else {\n // Same count as `for (x = min; x < max + endPad; x += step)`\n nX = Math.floor((innerW + endPad) / stepX - 1e-12) + 1\n nY = Math.floor((innerH + endPad) / stepY - 1e-12) + 1\n }\n\n const spanX = (nX - 1) * stepX\n const spanY = (nY - 1) * stepY\n const ox = b.minX + inset + (innerW - spanX) / 2\n const oy = b.minY + inset + (innerH - spanY) / 2\n return { ox, oy, nX, nY }\n}\n\n/**\n * Seeded stochastic packing: sample random points, grow max non-overlapping\n * radius (tangent to nearest circle or limited by distance to boundary).\n * Triangulation Steiner mode deferred.\n */\nexport function stochasticPack(\n path: Path,\n points: number,\n minRadius: number,\n seed = 1,\n): Circle[] {\n const rng = mulberry32(seed >>> 0)\n const b = bounds(path)\n const packing: Circle[] = []\n\n for (let attempt = 0; attempt < points; attempt++) {\n const p = vecInBounds(b, rng)\n if (!containsPoint(path, p)) continue\n\n const maxR = clearanceRadius(p, path, packing)\n if (maxR < minRadius) continue\n packing.push(circle(p.x, p.y, maxR))\n }\n\n return packing\n}\n\n/**\n * Pack up to `n` maximum inscribed circles via iterative largest-empty-circle\n * search (grid + local refine). Circles are fully contained and non-overlapping.\n * `tolerance` controls coarse grid step as a fraction of the bbox diagonal\n * (PGS uses a related accuracy knob; values ~0.5–1 are reasonable).\n *\n * Deferred: `tangencyPack`, `trinscribedPack` — see ADR 0003.\n */\nexport function maximumInscribedPack(\n path: Path,\n n: number,\n tolerance = 1,\n): Circle[] {\n return obstaclePack(path, [], n, tolerance)\n}\n\n/**\n * Pack inscribed circles while radius stays ≥ `minRadius`.\n */\nexport function maximumInscribedPackUntil(\n path: Path,\n minRadius: number,\n tolerance = 1,\n): Circle[] {\n const packing: Circle[] = []\n const tol = Math.max(0.01, tolerance)\n const minR = Math.max(0.01, minRadius)\n for (;;) {\n const next = findLargestEmptyCircle(path, packing, tol)\n if (!next || next.r < minR) break\n packing.push(next)\n }\n return packing\n}\n\n/**\n * Successive LECs inside `path`, treating `obstacles` as already-placed disks.\n * Simpler than full PGS obstacle packing; sufficient for “avoid these circles.”\n */\nexport function obstaclePack(\n path: Path,\n obstacles: Circle[],\n n: number,\n tolerance = 1,\n): Circle[] {\n const packing: Circle[] = obstacles.map((c) => ({ ...c }))\n const placed: Circle[] = []\n const tol = Math.max(0.01, tolerance)\n for (let i = 0; i < n; i++) {\n const next = findLargestEmptyCircle(path, packing, tol)\n if (!next || next.r <= 1e-9) break\n packing.push(next)\n placed.push(next)\n }\n return placed\n}\n\n/**\n * Front-chain-inspired packing of (possibly varying) radii in the path envelope,\n * then keep circles that overlap the path. Seeded for determinism.\n * Grows until placement stalls (region effectively full); no fixed circle count.\n * Not a line-by-line port of PGS FrontChainPacker — same role, approximate layout.\n */\nexport function frontChainPack(\n path: Path,\n radiusMin: number,\n radiusMax: number,\n seed = 1,\n): Circle[] {\n let rMin = Math.max(1e-6, Math.min(radiusMin, radiusMax))\n let rMax = Math.max(rMin, Math.max(radiusMin, radiusMax))\n const rng = mulberry32(seed >>> 0)\n const b = bounds(path)\n const packing: Circle[] = []\n const area = Math.max(1e-6, (b.maxX - b.minX) * (b.maxY - b.minY))\n // Safety ceiling only — real stop is consecutive placement failures.\n const capacity = Math.max(\n 4,\n Math.ceil((area / (Math.PI * rMin * rMin)) * 2),\n )\n\n const trySeed = (): boolean => {\n const p = vecInBounds(b, rng)\n const r = rMin + rng() * (rMax - rMin)\n const c = circle(p.x, p.y, r)\n if (!overlapsAny(c, packing) && circleOverlapsPath(c, path)) {\n packing.push(c)\n return true\n }\n return false\n }\n\n // Seed a few circles, then grow a frontier of tangent candidates.\n for (let i = 0; i < 8; i++) trySeed()\n\n let fails = 0\n while (packing.length < capacity) {\n const stallLimit = Math.max(500, packing.length * 12)\n if (fails >= stallLimit) break\n\n if (packing.length === 0) {\n if (trySeed()) fails = 0\n else fails++\n continue\n }\n\n // Reseed empty pockets so growth is not stuck on one cluster.\n if (fails > 0 && fails % 50 === 0) {\n if (trySeed()) {\n fails = 0\n continue\n }\n }\n\n const base = packing[Math.floor(rng() * packing.length)]!\n const ang = rng() * Math.PI * 2\n const r = rMin + rng() * (rMax - rMin)\n const dist = base.r + r\n const c = circle(\n base.x + Math.cos(ang) * dist,\n base.y + Math.sin(ang) * dist,\n r,\n )\n if (\n c.x < b.minX - rMax ||\n c.x > b.maxX + rMax ||\n c.y < b.minY - rMax ||\n c.y > b.maxY + rMax\n ) {\n fails++\n continue\n }\n if (!overlapsAny(c, packing) && circleOverlapsPath(c, path)) {\n packing.push(c)\n fails = 0\n } else {\n fails++\n }\n }\n\n return packing.filter((c) => circleOverlapsPath(c, path))\n}\n\n/**\n * Seed random circles in the envelope, then iteratively repulse overlaps;\n * keep those that overlap the path (PGS repulsionPack role).\n */\nexport function repulsionPack(\n path: Path,\n radiusMin: number,\n radiusMax: number,\n seed = 1,\n iterations = 80,\n): Circle[] {\n const rMin = Math.max(1e-6, Math.min(radiusMin, radiusMax))\n const rMax = Math.max(rMin, Math.max(radiusMin, radiusMax))\n const rng = mulberry32(seed >>> 0)\n const b = bounds(path)\n const area = Math.max(1e-6, (b.maxX - b.minX) * (b.maxY - b.minY))\n const avgR = (rMin + rMax) / 2\n const target = Math.max(\n 4,\n Math.floor(area / (Math.PI * avgR * avgR) * 0.6),\n )\n\n const circles: Circle[] = []\n for (let i = 0; i < target; i++) {\n const p = vecInBounds(b, rng)\n circles.push(circle(p.x, p.y, rMin + rng() * (rMax - rMin)))\n }\n\n for (let iter = 0; iter < iterations; iter++) {\n for (let i = 0; i < circles.length; i++) {\n for (let j = i + 1; j < circles.length; j++) {\n const a = circles[i]!\n const bC = circles[j]!\n const dx = bC.x - a.x\n const dy = bC.y - a.y\n const dist = Math.hypot(dx, dy) || 1e-9\n const minDist = a.r + bC.r\n if (dist >= minDist) continue\n const push = ((minDist - dist) / 2) * 0.5\n const ux = dx / dist\n const uy = dy / dist\n a.x -= ux * push\n a.y -= uy * push\n bC.x += ux * push\n bC.y += uy * push\n }\n }\n // Soft clamp to inflated envelope\n for (const c of circles) {\n c.x = Math.min(b.maxX + c.r, Math.max(b.minX - c.r, c.x))\n c.y = Math.min(b.maxY + c.r, Math.max(b.minY - c.r, c.y))\n }\n }\n\n return circles.filter((c) => circleOverlapsPath(c, path))\n}\n\n/** True if disk overlaps the filled path (including partial exterior overlap). */\nexport function circleOverlapsPath(c: Circle, path: Path): boolean {\n const center = { x: c.x, y: c.y }\n const dist = distanceToPolygon(center, path)\n return dist <= c.r * 0.95\n}\n\n/** True if the disk lies fully inside the path. */\nexport function circleContainedInPath(c: Circle, path: Path): boolean {\n const center = { x: c.x, y: c.y }\n if (!containsPoint(path, center)) return false\n return distanceToBoundary(center, path) + 1e-9 >= c.r\n}\n\n/** Distance from point to polygon: 0 if inside, else distance to boundary. */\nexport function distanceToPolygon(p: Vec2, path: Path): number {\n if (containsPoint(path, p)) return 0\n return distanceToBoundary(p, path)\n}\n\nfunction findLargestEmptyCircle(\n path: Path,\n obstacles: Circle[],\n tolerance: number,\n): Circle | null {\n const b = bounds(path)\n const diag = Math.hypot(b.maxX - b.minX, b.maxY - b.minY) || 1\n // denser grid for smaller tolerance\n const step = Math.max(diag * 0.02 * Math.sqrt(tolerance), diag * 0.01)\n let best: Circle | null = null\n\n for (let x = b.minX; x <= b.maxX; x += step) {\n for (let y = b.minY; y <= b.maxY; y += step) {\n const p = { x, y }\n if (!containsPoint(path, p)) continue\n const r = clearanceRadius(p, path, obstacles)\n if (!best || r > best.r) best = circle(p.x, p.y, r)\n }\n }\n\n if (!best) return null\n\n // Local refine around best\n let cur = best\n let span = step\n for (let iter = 0; iter < 8; iter++) {\n let improved = cur\n for (let dx = -1; dx <= 1; dx++) {\n for (let dy = -1; dy <= 1; dy++) {\n if (dx === 0 && dy === 0) continue\n const p = { x: cur.x + dx * span, y: cur.y + dy * span }\n if (!containsPoint(path, p)) continue\n const r = clearanceRadius(p, path, obstacles)\n if (r > improved.r) improved = circle(p.x, p.y, r)\n }\n }\n cur = improved\n span *= 0.5\n }\n return cur\n}\n\nfunction clearanceRadius(\n p: Vec2,\n path: Path,\n obstacles: Circle[],\n): number {\n let r = distanceToBoundary(p, path)\n for (const c of obstacles) {\n r = Math.min(r, Math.hypot(p.x - c.x, p.y - c.y) - c.r)\n }\n return Math.max(0, r)\n}\n\nfunction overlapsAny(c: Circle, packing: Circle[]): boolean {\n for (const o of packing) {\n if (Math.hypot(c.x - o.x, c.y - o.y) < c.r + o.r - 1e-9) return true\n }\n return false\n}\n\nfunction distanceToBoundary(p: Vec2, path: Path): number {\n let min = Infinity\n for (const ring of path.rings) {\n for (let i = 0; i < ring.length; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % ring.length]!\n min = Math.min(min, pointSegmentDistance(p, a, b))\n }\n }\n return min\n}\n\nfunction pointSegmentDistance(p: Vec2, a: Vec2, b: Vec2): number {\n const abx = b.x - a.x\n const aby = b.y - a.y\n const len2 = abx * abx + aby * aby\n if (len2 < 1e-18) return Math.hypot(p.x - a.x, p.y - a.y)\n let t = ((p.x - a.x) * abx + (p.y - a.y) * aby) / len2\n t = Math.max(0, Math.min(1, t))\n return Math.hypot(p.x - (a.x + t * abx), p.y - (a.y + t * aby))\n}\n\nfunction vecInBounds(\n b: { minX: number; minY: number; maxX: number; maxY: number },\n rng: () => number,\n): Vec2 {\n return {\n x: b.minX + rng() * (b.maxX - b.minX),\n y: b.minY + rng() * (b.maxY - b.minY),\n }\n}\n\nfunction mulberry32(a: number): () => number {\n return function () {\n let t = (a += 0x6d2b79f5)\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\nexport const circlePacking = {\n squareLatticePack,\n hexLatticePack,\n stochasticPack,\n maximumInscribedPack,\n maximumInscribedPackUntil,\n obstaclePack,\n frontChainPack,\n repulsionPack,\n circleOverlapsPath,\n circleContainedInPath,\n}\n","import type { Group, Path } from '../types/index.js'\nimport { group } from '../types/index.js'\nimport { inflatePathsD, JoinType, EndType } from 'clipper2-ts'\nimport { pathToPathsD, pathsDToGroup } from '../clipper/convert.js'\n\nexport type BufferOptions = {\n /** Join style for offset. Default round. */\n join?: 'round' | 'miter' | 'square'\n}\n\n/**\n * Offset / buffer a closed path by `delta` (positive = expand, negative = erode).\n * Returns a group of resulting closed paths (may split or vanish when eroding).\n */\nexport function buffer(\n path: Path,\n delta: number,\n options: BufferOptions = {},\n): Group {\n const subject = pathToPathsD(path)\n const join =\n options.join === 'miter'\n ? JoinType.Miter\n : options.join === 'square'\n ? JoinType.Square\n : JoinType.Round\n const inflated = inflatePathsD(subject, delta, join, EndType.Polygon)\n return pathsDToGroup(inflated)\n}\n\n/**\n * Erode by `|amount|` then dilate by `|amount|` (opening). Useful for cleaning.\n */\nexport function erosionDilation(p: Path, amount: number): Group {\n const a = Math.abs(amount)\n if (a < 1e-12) return group([p])\n const eroded = buffer(p, -a)\n if (eroded.paths.length === 0) return eroded\n const dilated: Path[] = []\n for (const q of eroded.paths) {\n dilated.push(...buffer(q, a).paths)\n }\n return group(dilated)\n}\n\n/**\n * Dilate by `|amount|` then erode by `|amount|` (closing). Fills small gaps.\n */\nexport function dilationErosion(p: Path, amount: number): Group {\n const a = Math.abs(amount)\n if (a < 1e-12) return group([p])\n const dilated = buffer(p, a)\n if (dilated.paths.length === 0) return dilated\n const eroded: Path[] = []\n for (const q of dilated.paths) {\n eroded.push(...buffer(q, -a).paths)\n }\n return group(eroded)\n}\n","import { simplifyPathD, minkowskiSumD, minkowskiDiffD } from 'clipper2-ts'\nimport type { Group, Path, Ring, Vec2 } from '../types/index.js'\nimport { path, normalizeRing } from '../types/index.js'\nimport { pathDToRing, ringToPathD, pathsDToGroup } from '../clipper/convert.js'\nimport { centroid } from '../predicates/index.js'\nimport { buffer, erosionDilation, dilationErosion } from './buffer.js'\n\nexport type { BufferOptions } from './buffer.js'\nexport { buffer, erosionDilation, dilationErosion } from './buffer.js'\n\n/**\n * Ramer–Douglas–Peucker simplify (Clipper2). `epsilon` is absolute distance.\n */\nexport function simplify(p: Path, epsilon: number): Path {\n if (epsilon <= 0 || p.rings.length === 0) return p\n const rings: Ring[] = []\n for (const ring of p.rings) {\n const simplified = simplifyPathD(ringToPathD(ring), epsilon, p.closed)\n const out = pathDToRing(simplified)\n if (out.length >= (p.closed ? 3 : 2)) rings.push(out)\n }\n if (rings.length === 0) return path([], p.closed)\n return path(rings, p.closed)\n}\n\n/** Round vertex coordinates to `decimals` places. */\nexport function reducePrecision(p: Path, decimals: number): Path {\n const f = 10 ** Math.max(0, Math.floor(decimals))\n const round = (n: number) => Math.round(n * f) / f\n return path(\n p.rings.map((ring) =>\n normalizeRing(ring.map((v) => ({ x: round(v.x), y: round(v.y) }))),\n ),\n p.closed,\n )\n}\n\n/**\n * Chaikin corner cutting. `iterations` ≥ 1; closed rings stay closed.\n * Ratio defaults to classic 1/4–3/4 cut.\n */\nexport function chaikinCut(p: Path, iterations = 1, ratio = 0.25): Path {\n const r = Math.min(0.49, Math.max(0.01, ratio))\n let rings = p.rings\n for (let i = 0; i < Math.max(1, Math.floor(iterations)); i++) {\n rings = rings.map((ring) => chaikinRing(ring, r, p.closed))\n }\n return path(rings, p.closed)\n}\n\n/** Alias: Chaikin smoothing for `iterations` passes. */\nexport function smooth(p: Path, iterations = 2): Path {\n return chaikinCut(p, iterations)\n}\n\n/** Radial displace from centroid: r' = r * (1 + amplitude * cos(freq * θ + phase)). */\nexport function radialWarp(\n p: Path,\n amplitude: number,\n frequency = 3,\n phase = 0,\n): Path {\n const c = centroid(p)\n return mapVerts(p, (v) => {\n const dx = v.x - c.x\n const dy = v.y - c.y\n const dist = Math.hypot(dx, dy)\n if (dist < 1e-12) return v\n const theta = Math.atan2(dy, dx)\n const s = 1 + amplitude * Math.cos(frequency * theta + phase)\n return { x: c.x + dx * s, y: c.y + dy * s }\n })\n}\n\n/** Sine warp along X: y' = y + amplitude * sin(2π * frequency * x + phase). */\nexport function sineWarp(\n p: Path,\n amplitude: number,\n frequency = 1,\n phase = 0,\n): Path {\n return mapVerts(p, (v) => ({\n x: v.x,\n y: v.y + amplitude * Math.sin(2 * Math.PI * frequency * v.x + phase),\n }))\n}\n\n/** Minkowski sum of two closed paths (Clipper2). */\nexport function minkSum(a: Path, b: Path): Group {\n const pattern = ringToPathD(b.rings[0] ?? [])\n const subject = ringToPathD(a.rings[0] ?? [])\n return pathsDToGroup(minkowskiSumD(pattern, subject, true))\n}\n\n/** Minkowski difference of two closed paths (Clipper2). */\nexport function minkDifference(a: Path, b: Path): Group {\n const pattern = ringToPathD(b.rings[0] ?? [])\n const subject = ringToPathD(a.rings[0] ?? [])\n return pathsDToGroup(minkowskiDiffD(pattern, subject, true))\n}\n\nfunction chaikinRing(ring: Ring, ratio: number, closed: boolean): Ring {\n if (ring.length < 2) return ring.map((v) => ({ ...v }))\n const out: Vec2[] = []\n const n = ring.length\n const edges = closed ? n : n - 1\n for (let i = 0; i < edges; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % n]!\n out.push({\n x: a.x * (1 - ratio) + b.x * ratio,\n y: a.y * (1 - ratio) + b.y * ratio,\n })\n out.push({\n x: a.x * ratio + b.x * (1 - ratio),\n y: a.y * ratio + b.y * (1 - ratio),\n })\n }\n if (!closed) {\n out.unshift({ ...ring[0]! })\n out.push({ ...ring[n - 1]! })\n }\n return closed ? normalizeRing(out) : out\n}\n\nfunction mapVerts(p: Path, fn: (v: Vec2) => Vec2): Path {\n return path(\n p.rings.map((ring) => normalizeRing(ring.map(fn))),\n p.closed,\n )\n}\n\nexport const morphology = {\n buffer,\n erosionDilation,\n dilationErosion,\n simplify,\n reducePrecision,\n chaikinCut,\n smooth,\n radialWarp,\n sineWarp,\n minkSum,\n minkDifference,\n}\n","import type { Path, Vec2 } from '../types/index.js'\nimport { path, normalizeRing, clonePath } from '../types/index.js'\nimport { bounds, centroid } from '../predicates/index.js'\n\nfunction mapPath(p: Path, fn: (v: Vec2) => Vec2): Path {\n return path(\n p.rings.map((ring) => normalizeRing(ring.map(fn))),\n p.closed,\n )\n}\n\nexport function translate(p: Path, dx: number, dy: number): Path {\n return mapPath(p, (v) => ({ x: v.x + dx, y: v.y + dy }))\n}\n\nexport function translateToOrigin(p: Path): Path {\n const c = centroid(p)\n return translate(p, -c.x, -c.y)\n}\n\nexport function translateCentroidTo(p: Path, target: Vec2): Path {\n const c = centroid(p)\n return translate(p, target.x - c.x, target.y - c.y)\n}\n\nexport function rotate(p: Path, angleRad: number, pivot?: Vec2): Path {\n const o = pivot ?? { x: 0, y: 0 }\n const cos = Math.cos(angleRad)\n const sin = Math.sin(angleRad)\n return mapPath(p, (v) => {\n const x = v.x - o.x\n const y = v.y - o.y\n return {\n x: o.x + x * cos - y * sin,\n y: o.y + x * sin + y * cos,\n }\n })\n}\n\nexport function rotateAroundCenter(p: Path, angleRad: number): Path {\n return rotate(p, angleRad, centroid(p))\n}\n\nexport function scale(p: Path, sx: number, sy = sx, pivot?: Vec2): Path {\n const o = pivot ?? { x: 0, y: 0 }\n return mapPath(p, (v) => ({\n x: o.x + (v.x - o.x) * sx,\n y: o.y + (v.y - o.y) * sy,\n }))\n}\n\nexport function originScale(p: Path, s: number): Path {\n return scale(p, s, s, { x: 0, y: 0 })\n}\n\nexport function flipHorizontal(p: Path, x = 0): Path {\n return mapPath(p, (v) => ({ x: 2 * x - v.x, y: v.y }))\n}\n\nexport function flipVertical(p: Path, y = 0): Path {\n return mapPath(p, (v) => ({ x: v.x, y: 2 * y - v.y }))\n}\n\n/** Uniform resize so bounding-box width equals `width`. */\nexport function resizeByWidth(p: Path, width: number): Path {\n const b = bounds(p)\n const w = b.maxX - b.minX\n if (w < 1e-12) return clonePath(p)\n return scale(p, width / w, width / w, { x: b.minX, y: b.minY })\n}\n\n/** Uniform resize so bounding-box height equals `height`. */\nexport function resizeByHeight(p: Path, height: number): Path {\n const b = bounds(p)\n const h = b.maxY - b.minY\n if (h < 1e-12) return clonePath(p)\n return scale(p, height / h, height / h, { x: b.minX, y: b.minY })\n}\n\n/** Move the AABB min corner to `target`. */\nexport function translateCornerTo(p: Path, target: Vec2): Path {\n const b = bounds(p)\n return translate(p, target.x - b.minX, target.y - b.minY)\n}\n\n/** Shear: x' = x + shx * y, y' = y + shy * x (about origin or pivot). */\nexport function shear(\n p: Path,\n shx: number,\n shy = 0,\n pivot?: Vec2,\n): Path {\n const o = pivot ?? { x: 0, y: 0 }\n return mapPath(p, (v) => {\n const x = v.x - o.x\n const y = v.y - o.y\n return {\n x: o.x + x + shx * y,\n y: o.y + y + shy * x,\n }\n })\n}\n\nexport const transformation = {\n translate,\n translateToOrigin,\n translateCentroidTo,\n translateCornerTo,\n rotate,\n rotateAroundCenter,\n scale,\n originScale,\n flipHorizontal,\n flipVertical,\n resizeByWidth,\n resizeByHeight,\n shear,\n}\n","import type { Group, Path, Segment, Vec2 } from '../types/index.js'\nimport { path, normalizeRing, polygon, segment, group } from '../types/index.js'\nimport { bounds, containsPoint, centroid } from '../predicates/index.js'\nimport { intersect, unionAll } from '../shapeBoolean/index.js'\n\n/** Exterior ring as its own closed path (holes dropped). */\nexport function extractPerimeter(p: Path): Path {\n const exterior = p.rings[0]\n if (!exterior) return path([], true)\n return polygon(exterior)\n}\n\n/** Alias for extractPerimeter. */\nexport function extractBoundary(p: Path): Path {\n return extractPerimeter(p)\n}\n\n/** Each hole as a separate closed path. */\nexport function extractHoles(p: Path): Path[] {\n const holes: Path[] = []\n for (let i = 1; i < p.rings.length; i++) {\n const hole = p.rings[i]\n if (hole && hole.length >= 3) holes.push(polygon(hole))\n }\n return holes\n}\n\n/**\n * Insert vertices so no edge exceeds `maxSegLen`.\n * Closed rings treat the wrap-around edge.\n */\nexport function densify(p: Path, maxSegLen: number): Path {\n if (maxSegLen <= 0) return p\n return path(\n p.rings.map((ring) => densifyRing(ring, maxSegLen, p.closed)),\n p.closed,\n )\n}\n\nfunction densifyRing(\n ring: Vec2[],\n maxSegLen: number,\n closed: boolean,\n): Vec2[] {\n if (ring.length < 2) return [...ring]\n const out: Vec2[] = []\n const n = ring.length\n const edges = closed ? n : n - 1\n for (let i = 0; i < edges; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % n]!\n out.push(a)\n const dist = Math.hypot(b.x - a.x, b.y - a.y)\n const steps = Math.floor(dist / maxSegLen)\n for (let s = 1; s < steps; s++) {\n const t = s / steps\n out.push({\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n })\n }\n }\n if (!closed) out.push(ring[n - 1]!)\n return closed ? normalizeRing(out) : out\n}\n\n/** Drop holes whose absolute area is below `minArea`. */\nexport function removeSmallHoles(p: Path, minArea: number): Path {\n if (p.rings.length <= 1) return p\n const exterior = p.rings[0]!\n const kept = p.rings.slice(1).filter((hole) => {\n const a = Math.abs(shoelace(hole))\n return a >= minArea\n })\n return path([exterior, ...kept], p.closed)\n}\n\n/** Seeded uniform random points inside a closed path. */\nexport function generateRandomPoints(\n p: Path,\n count: number,\n seed = 1,\n): Vec2[] {\n const rng = mulberry32(seed >>> 0)\n const b = bounds(p)\n const out: Vec2[] = []\n let attempts = 0\n const maxAttempts = Math.max(count * 50, 100)\n while (out.length < count && attempts < maxAttempts) {\n attempts++\n const pt = {\n x: b.minX + rng() * (b.maxX - b.minX),\n y: b.minY + rng() * (b.maxY - b.minY),\n }\n if (containsPoint(p, pt)) out.push(pt)\n }\n return out\n}\n\n/** Axis-aligned grid samples that fall inside the path. */\nexport function generateRandomGridPoints(\n p: Path,\n spacing: number,\n): Vec2[] {\n const step = Math.max(spacing, 1e-9)\n const b = bounds(p)\n const out: Vec2[] = []\n for (let x = b.minX; x <= b.maxX + 1e-12; x += step) {\n for (let y = b.minY; y <= b.maxY + 1e-12; y += step) {\n const pt = { x, y }\n if (containsPoint(p, pt)) out.push(pt)\n }\n }\n return out\n}\n\n/** Evenly spaced samples along the exterior perimeter. */\nexport function pointsOnExterior(p: Path, count: number): Vec2[] {\n const ring = p.rings[0]\n if (!ring || ring.length < 2 || count <= 0) return []\n const lengths = edgeLengths(ring, true)\n const total = lengths.reduce((s, L) => s + L, 0)\n if (total < 1e-12) return []\n const out: Vec2[] = []\n for (let i = 0; i < count; i++) {\n const target = (i / count) * total\n out.push(pointAtArcLength(ring, lengths, target))\n }\n return out\n}\n\n/** Exterior edges as segments. */\nexport function segmentsOnExterior(p: Path): Segment[] {\n const ring = p.rings[0]\n if (!ring || ring.length < 2) return []\n const n = ring.length\n const closed = p.closed\n const edges = closed ? n : n - 1\n const out: Segment[] = []\n for (let i = 0; i < edges; i++) {\n out.push(segment(ring[i]!, ring[(i + 1) % n]!))\n }\n return out\n}\n\n/**\n * Cut `p` with the infinite line through `a`→`b`.\n * Returns pieces on both sides (typically 0–2 paths).\n */\nexport function slice(p: Path, a: Vec2, b: Vec2): Group {\n const dx = b.x - a.x\n const dy = b.y - a.y\n const len = Math.hypot(dx, dy)\n if (len < 1e-12) return group([p])\n const nx = -dy / len\n const ny = dx / len\n const bb = bounds(p)\n const span =\n Math.hypot(bb.maxX - bb.minX, bb.maxY - bb.minY) * 4 + 10\n const left = halfPlanePoly(a, nx, ny, span)\n const right = halfPlanePoly(a, -nx, -ny, span)\n const parts: Path[] = []\n for (const half of [left, right]) {\n parts.push(...intersect(p, half).paths)\n }\n return group(parts)\n}\n\n/** Split through the centroid with a vertical cut (left/right). */\nexport function centroidSplit(p: Path): Group {\n const c = centroid(p)\n const bb = bounds(p)\n const pad = Math.max(bb.maxY - bb.minY, 1) + 1\n return slice(p, { x: c.x, y: c.y - pad }, { x: c.x, y: c.y + pad })\n}\n\n/** Union all closed paths in a group (dissolve overlapping contours). */\nexport function dissolve(paths: Path[]): Group {\n return unionAll(paths)\n}\n\n/** Vertex–edge intersection points between two path boundaries. */\nexport function intersectionPoints(a: Path, b: Path): Vec2[] {\n const segsA = allSegments(a)\n const segsB = allSegments(b)\n const out: Vec2[] = []\n const seen = new Set<string>()\n for (const sa of segsA) {\n for (const sb of segsB) {\n const hit = segmentIntersection(sa.a, sa.b, sb.a, sb.b)\n if (!hit) continue\n const key = `${hit.x.toFixed(9)},${hit.y.toFixed(9)}`\n if (seen.has(key)) continue\n seen.add(key)\n out.push(hit)\n }\n }\n return out\n}\n\nfunction halfPlanePoly(\n origin: Vec2,\n nx: number,\n ny: number,\n span: number,\n): Path {\n // Orthonormal tangent\n const tx = -ny\n const ty = nx\n const o = origin\n return polygon([\n {\n x: o.x - tx * span + nx * 1e-9,\n y: o.y - ty * span + ny * 1e-9,\n },\n {\n x: o.x + tx * span + nx * 1e-9,\n y: o.y + ty * span + ny * 1e-9,\n },\n {\n x: o.x + tx * span + nx * span,\n y: o.y + ty * span + ny * span,\n },\n {\n x: o.x - tx * span + nx * span,\n y: o.y - ty * span + ny * span,\n },\n ])\n}\n\nfunction allSegments(p: Path): Segment[] {\n const out: Segment[] = []\n for (const ring of p.rings) {\n const n = ring.length\n const edges = p.closed ? n : Math.max(0, n - 1)\n for (let i = 0; i < edges; i++) {\n out.push(segment(ring[i]!, ring[(i + 1) % n]!))\n }\n }\n return out\n}\n\nfunction segmentIntersection(\n a: Vec2,\n b: Vec2,\n c: Vec2,\n d: Vec2,\n): Vec2 | null {\n const rX = b.x - a.x\n const rY = b.y - a.y\n const sX = d.x - c.x\n const sY = d.y - c.y\n const den = rX * sY - rY * sX\n if (Math.abs(den) < 1e-14) return null\n const t = ((c.x - a.x) * sY - (c.y - a.y) * sX) / den\n const u = ((c.x - a.x) * rY - (c.y - a.y) * rX) / den\n if (t < -1e-9 || t > 1 + 1e-9 || u < -1e-9 || u > 1 + 1e-9) return null\n return { x: a.x + t * rX, y: a.y + t * rY }\n}\n\nfunction edgeLengths(ring: Vec2[], closed: boolean): number[] {\n const n = ring.length\n const edges = closed ? n : n - 1\n const lengths: number[] = []\n for (let i = 0; i < edges; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % n]!\n lengths.push(Math.hypot(b.x - a.x, b.y - a.y))\n }\n return lengths\n}\n\nfunction pointAtArcLength(\n ring: Vec2[],\n lengths: number[],\n target: number,\n): Vec2 {\n let remain = target\n const n = ring.length\n for (let i = 0; i < lengths.length; i++) {\n const L = lengths[i]!\n if (remain <= L || i === lengths.length - 1) {\n const t = L < 1e-12 ? 0 : remain / L\n const a = ring[i]!\n const b = ring[(i + 1) % n]!\n return {\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n }\n }\n remain -= L\n }\n return { ...ring[0]! }\n}\n\nfunction shoelace(ring: Vec2[]): number {\n let sum = 0\n for (let i = 0; i < ring.length; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % ring.length]!\n sum += a.x * b.y - b.x * a.y\n }\n return sum / 2\n}\n\nfunction mulberry32(a: number): () => number {\n return function () {\n let t = (a += 0x6d2b79f5)\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\nexport const processing = {\n extractPerimeter,\n extractBoundary,\n extractHoles,\n densify,\n removeSmallHoles,\n generateRandomPoints,\n generateRandomGridPoints,\n pointsOnExterior,\n segmentsOnExterior,\n slice,\n centroidSplit,\n dissolve,\n intersectionPoints,\n}\n","import type { Group, Path, Vec2 } from '../types/index.js'\nimport {\n cloneGroup,\n clonePath,\n group,\n normalizeRing,\n path,\n} from '../types/index.js'\nimport { reducePrecision } from '../morphology/index.js'\n\n/** Deep copy of a path. */\nexport function copy(p: Path): Path {\n return clonePath(p)\n}\n\n/** Flatten a group to a single path list (already flat; returns cloned paths). */\nexport function flatten(g: Group): Path[] {\n return g.paths.map(clonePath)\n}\n\n/** Round all vertex coords (delegates to morphology.reducePrecision). */\nexport function roundVertexCoords(p: Path, decimals: number): Path {\n return reducePrecision(p, decimals)\n}\n\n/** Flat [x0,y0,x1,y1,...] of the exterior ring (holes omitted). */\nexport function toArray(p: Path): number[] {\n const ring = p.rings[0] ?? []\n const out: number[] = []\n for (const v of ring) {\n out.push(v.x, v.y)\n }\n return out\n}\n\n/** Build a closed polygon from flat [x0,y0,...] coords. */\nexport function fromArray(coords: number[], closed = true): Path {\n const ring: Vec2[] = []\n for (let i = 0; i + 1 < coords.length; i += 2) {\n ring.push({ x: coords[i]!, y: coords[i + 1]! })\n }\n return path([normalizeRing(ring)], closed)\n}\n\n/** Exterior + each hole as separate contour paths. */\nexport function toContours(p: Path): Path[] {\n return p.rings\n .filter((r) => r.length >= 3)\n .map((r) => path([normalizeRing(r)], true))\n}\n\n/** Merge contour paths into one multi-ring path (first = exterior). */\nexport function fromContours(contours: Path[]): Path {\n if (contours.length === 0) return path([], true)\n const rings = contours.map((c) => normalizeRing(c.rings[0] ?? []))\n return path(rings, true)\n}\n\nexport const conversion = {\n copy,\n flatten,\n roundVertexCoords,\n toArray,\n fromArray,\n toContours,\n fromContours,\n cloneGroup,\n group,\n}\n","import type { Group, Path } from '../types/index.js'\nimport { buffer } from '../morphology/buffer.js'\n\n/**\n * Offset the path outward by `distance` (positive buffer).\n * Returns possibly multiple closed contours.\n */\nexport function offsetCurvesOutward(p: Path, distance: number): Group {\n return buffer(p, Math.abs(distance))\n}\n\n/**\n * Offset the path inward by `distance` (negative buffer / erosion).\n * May return empty group if distance exceeds inradius.\n */\nexport function offsetCurvesInward(p: Path, distance: number): Group {\n return buffer(p, -Math.abs(distance))\n}\n\nexport const contour = {\n offsetCurvesOutward,\n offsetCurvesInward,\n}\n","import type { Path, Vec2 } from '../types/index.js'\nimport { polygon } from '../types/index.js'\nimport { bounds } from '../predicates/index.js'\n\n/** Andrew's monotone-chain convex hull of a point set. */\nexport function convexHull(points: Vec2[]): Path {\n const pts = uniquePoints(points)\n if (pts.length < 3) return polygon(pts)\n\n pts.sort((a, b) => (a.x === b.x ? a.y - b.y : a.x - b.x))\n\n const lower: Vec2[] = []\n for (const p of pts) {\n while (\n lower.length >= 2 &&\n cross(lower[lower.length - 2]!, lower[lower.length - 1]!, p) <= 0\n ) {\n lower.pop()\n }\n lower.push(p)\n }\n\n const upper: Vec2[] = []\n for (let i = pts.length - 1; i >= 0; i--) {\n const p = pts[i]!\n while (\n upper.length >= 2 &&\n cross(upper[upper.length - 2]!, upper[upper.length - 1]!, p) <= 0\n ) {\n upper.pop()\n }\n upper.push(p)\n }\n\n lower.pop()\n upper.pop()\n return polygon([...lower, ...upper])\n}\n\n/** Convex hull of all vertices in a path (exterior + holes). */\nexport function convexHullPath(p: Path): Path {\n const pts: Vec2[] = []\n for (const ring of p.rings) pts.push(...ring)\n return convexHull(pts)\n}\n\n/** Axis-aligned bounding box of a path as a closed rectangle. */\nexport function boundingBox(p: Path): Path {\n const b = bounds(p)\n return polygon([\n { x: b.minX, y: b.minY },\n { x: b.maxX, y: b.minY },\n { x: b.maxX, y: b.maxY },\n { x: b.minX, y: b.maxY },\n ])\n}\n\nfunction cross(o: Vec2, a: Vec2, b: Vec2): number {\n return (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x)\n}\n\nfunction uniquePoints(points: Vec2[]): Vec2[] {\n const seen = new Set<string>()\n const out: Vec2[] = []\n for (const p of points) {\n const key = `${p.x},${p.y}`\n if (seen.has(key)) continue\n seen.add(key)\n out.push({ x: p.x, y: p.y })\n }\n return out\n}\n\nexport const hull = {\n convexHull,\n convexHullPath,\n boundingBox,\n}\n","import type { Vec2 } from '../types/index.js'\n\n/** Seeded uniform random points in an axis-aligned box. */\nexport function random(\n count: number,\n minX: number,\n minY: number,\n maxX: number,\n maxY: number,\n seed = 1,\n): Vec2[] {\n const rng = mulberry32(seed >>> 0)\n const out: Vec2[] = []\n for (let i = 0; i < count; i++) {\n out.push({\n x: minX + rng() * (maxX - minX),\n y: minY + rng() * (maxY - minY),\n })\n }\n return out\n}\n\n/** Square lattice points covering [minX,maxX] × [minY,maxY]. */\nexport function squareGrid(\n spacing: number,\n minX: number,\n minY: number,\n maxX: number,\n maxY: number,\n): Vec2[] {\n const s = Math.max(spacing, 1e-9)\n const out: Vec2[] = []\n for (let x = minX; x <= maxX + 1e-12; x += s) {\n for (let y = minY; y <= maxY + 1e-12; y += s) {\n out.push({ x, y })\n }\n }\n return out\n}\n\n/** Hexagonal lattice points covering the box. */\nexport function hexGrid(\n spacing: number,\n minX: number,\n minY: number,\n maxX: number,\n maxY: number,\n): Vec2[] {\n const s = Math.max(spacing, 1e-9)\n const dx = s\n const dy = s * Math.sqrt(3) * 0.5\n const out: Vec2[] = []\n let row = 0\n for (let y = minY; y <= maxY + 1e-12; y += dy, row++) {\n const x0 = minX + (row % 2 === 0 ? 0 : s * 0.5)\n for (let x = x0; x <= maxX + 1e-12; x += dx) {\n out.push({ x, y })\n }\n }\n return out\n}\n\n/** Ring of `count` points around `center` with `radius`. */\nexport function ring(\n count: number,\n center: Vec2,\n radius: number,\n): Vec2[] {\n const out: Vec2[] = []\n for (let i = 0; i < count; i++) {\n const t = (i / count) * Math.PI * 2\n out.push({\n x: center.x + Math.cos(t) * radius,\n y: center.y + Math.sin(t) * radius,\n })\n }\n return out\n}\n\nfunction mulberry32(a: number): () => number {\n return function () {\n let t = (a += 0x6d2b79f5)\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\n/** Bridson-ish Poisson disk sample in a box (seeded). */\nexport function poisson(\n minDistance: number,\n minX: number,\n minY: number,\n maxX: number,\n maxY: number,\n seed = 1,\n maxAttempts = 30,\n): Vec2[] {\n const rng = mulberry32(seed >>> 0)\n const r = Math.max(minDistance, 1e-9)\n const cell = r / Math.SQRT2\n const w = maxX - minX\n const h = maxY - minY\n const gw = Math.max(1, Math.ceil(w / cell))\n const gh = Math.max(1, Math.ceil(h / cell))\n const grid: (number | null)[] = Array(gw * gh).fill(null)\n const points: Vec2[] = []\n const active: number[] = []\n\n const gx = (p: Vec2) => Math.min(gw - 1, Math.floor((p.x - minX) / cell))\n const gy = (p: Vec2) => Math.min(gh - 1, Math.floor((p.y - minY) / cell))\n\n const emit = (p: Vec2) => {\n const i = points.length\n points.push(p)\n active.push(i)\n grid[gy(p) * gw + gx(p)] = i\n }\n\n emit({\n x: minX + rng() * w,\n y: minY + rng() * h,\n })\n\n while (active.length > 0) {\n const ai = Math.floor(rng() * active.length)\n const i = active[ai]!\n const src = points[i]!\n let found = false\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const ang = rng() * Math.PI * 2\n const rad = r * (1 + rng())\n const cand = {\n x: src.x + Math.cos(ang) * rad,\n y: src.y + Math.sin(ang) * rad,\n }\n if (\n cand.x < minX ||\n cand.x > maxX ||\n cand.y < minY ||\n cand.y > maxY\n ) {\n continue\n }\n const cx = gx(cand)\n const cy = gy(cand)\n let ok = true\n for (let yy = Math.max(0, cy - 2); yy <= Math.min(gh - 1, cy + 2) && ok; yy++) {\n for (let xx = Math.max(0, cx - 2); xx <= Math.min(gw - 1, cx + 2); xx++) {\n const j = grid[yy * gw + xx]\n if (j == null) continue\n const q = points[j]!\n if (Math.hypot(cand.x - q.x, cand.y - q.y) < r) {\n ok = false\n break\n }\n }\n }\n if (ok) {\n emit(cand)\n found = true\n break\n }\n }\n if (!found) active.splice(ai, 1)\n }\n return points\n}\n\n/** Drop points closer than `minDistance` (greedy keep-first). */\nexport function prunePointsWithinDistance(\n points: Vec2[],\n minDistance: number,\n): Vec2[] {\n const r = Math.max(minDistance, 0)\n const out: Vec2[] = []\n for (const p of points) {\n if (out.every((q) => Math.hypot(p.x - q.x, p.y - q.y) >= r)) {\n out.push(p)\n }\n }\n return out\n}\n\nexport const pointSet = {\n random,\n squareGrid,\n hexGrid,\n ring,\n poisson,\n prunePointsWithinDistance,\n}\n","import { triangulateD } from 'clipper2-ts'\nimport { Delaunay } from 'd3-delaunay'\nimport type { Path, Vec2 } from '../types/index.js'\nimport { polygon } from '../types/index.js'\nimport { pathToPathsD, pathDToRing } from '../clipper/convert.js'\nimport { bounds, containsPoint } from '../predicates/index.js'\nimport { poisson } from '../pointSet/index.js'\n\n/**\n * Triangulate a closed path into triangle polygons (Clipper2).\n * Holes are supported when present on the path. `useDelaunay` prefers\n * better-shaped triangles when Clipper can apply it.\n */\nexport function earCutTriangulation(\n p: Path,\n options: { useDelaunay?: boolean; precision?: number } = {},\n): Path[] {\n if (!p.closed || p.rings.length === 0) return []\n const { solution } = triangulateD(\n pathToPathsD(p),\n options.precision ?? 8,\n options.useDelaunay ?? false,\n )\n const tris: Path[] = []\n for (const pd of solution) {\n const ring = pathDToRing(pd)\n if (ring.length >= 3) tris.push(polygon(ring.slice(0, 3)))\n }\n return tris\n}\n\n/** Alias matching PGS naming for Clipper/Delaunay triangulation of a polygon. */\nexport function delaunayTriangulation(p: Path): Path[] {\n return earCutTriangulation(p, { useDelaunay: true })\n}\n\n/** Delaunay triangulation of a point set (d3-delaunay). */\nexport function delaunayTriangulationPoints(points: Vec2[]): Path[] {\n if (points.length < 3) return []\n const delaunay = Delaunay.from(\n points,\n (d) => d.x,\n (d) => d.y,\n )\n const tris: Path[] = []\n const { triangles } = delaunay\n for (let i = 0; i < triangles.length; i += 3) {\n const a = points[triangles[i]!]!\n const b = points[triangles[i + 1]!]!\n const c = points[triangles[i + 2]!]!\n tris.push(polygon([a, b, c]))\n }\n return tris\n}\n\n/**\n * Boundary vertices plus Poisson-disk Steiner points inside `path`.\n */\nexport function poissonTriangulationPoints(\n path: Path,\n minDistance: number,\n seed = 1,\n): Vec2[] {\n if (!path.closed || path.rings.length === 0) return []\n const b = bounds(path)\n const samples = poisson(\n minDistance,\n b.minX,\n b.minY,\n b.maxX,\n b.maxY,\n seed,\n ).filter((pt) => containsPoint(path, pt))\n return dedupePoints([...pathVertices(path), ...samples])\n}\n\n/**\n * Delaunay triangulation of a path with Poisson Steiner points inserted.\n * Triangles whose centroid falls outside the path (or in a hole) are dropped.\n */\nexport function poissonTriangulation(\n path: Path,\n minDistance: number,\n seed = 1,\n): Path[] {\n const pts = poissonTriangulationPoints(path, minDistance, seed)\n return trianglesInsidePath(delaunayTriangulationPoints(pts), path)\n}\n\nexport type RefineOptions = {\n /** Minimum allowed interior angle (radians). Default ≈ 20°. */\n minAngle?: number\n /** Safety cap on Steiner insertions. Default `200`. */\n maxIterations?: number\n}\n\n/**\n * Ruppert-inspired angle refinement for plotter meshes.\n * Clean-room approximation (not a full constrained CDT): insert circumcenters\n * of skinny triangles when they lie inside the path; otherwise split the\n * longest edge of that triangle (simple encroachment stand-in).\n */\nexport function refine(path: Path, options: RefineOptions = {}): Path[] {\n if (!path.closed || path.rings.length === 0) return []\n const minAngle = options.minAngle ?? (20 * Math.PI) / 180\n const maxIterations = Math.max(1, options.maxIterations ?? 200)\n const points = dedupePoints(pathVertices(path))\n if (points.length < 3) return []\n\n for (let iter = 0; iter < maxIterations; iter++) {\n const tris = trianglesInsidePath(\n delaunayTriangulationPoints(points),\n path,\n )\n if (tris.length === 0) break\n\n let skinny: Path | null = null\n let worst = minAngle\n for (const t of tris) {\n const a = minTriangleAngle(t)\n if (a < worst) {\n worst = a\n skinny = t\n }\n }\n if (!skinny) break\n\n const ring = skinny.rings[0]!\n const cc = circumcenter(ring[0]!, ring[1]!, ring[2]!)\n if (!cc) break\n\n const insert = containsPoint(path, cc)\n ? cc\n : longestEdgeMidpoint(ring[0]!, ring[1]!, ring[2]!)\n if (\n points.some((p) => Math.hypot(p.x - insert.x, p.y - insert.y) < 1e-9)\n ) {\n break\n }\n points.push(insert)\n }\n\n return trianglesInsidePath(delaunayTriangulationPoints(points), path)\n}\n\nfunction pathVertices(path: Path): Vec2[] {\n const out: Vec2[] = []\n for (const ring of path.rings) {\n for (const v of ring) out.push({ x: v.x, y: v.y })\n }\n return out\n}\n\nfunction dedupePoints(points: Vec2[], eps = 1e-9): Vec2[] {\n const out: Vec2[] = []\n for (const p of points) {\n if (out.some((q) => Math.hypot(q.x - p.x, q.y - p.y) < eps)) continue\n out.push(p)\n }\n return out\n}\n\nfunction triangleCentroid(t: Path): Vec2 | null {\n const r = t.rings[0]\n if (!r || r.length < 3) return null\n return {\n x: (r[0]!.x + r[1]!.x + r[2]!.x) / 3,\n y: (r[0]!.y + r[1]!.y + r[2]!.y) / 3,\n }\n}\n\nfunction trianglesInsidePath(tris: Path[], path: Path): Path[] {\n return tris.filter((t) => {\n const c = triangleCentroid(t)\n return c != null && containsPoint(path, c)\n })\n}\n\nfunction minTriangleAngle(t: Path): number {\n const r = t.rings[0]\n if (!r || r.length < 3) return 0\n const a = r[0]!\n const b = r[1]!\n const c = r[2]!\n return Math.min(angleAt(a, b, c), angleAt(b, c, a), angleAt(c, a, b))\n}\n\nfunction angleAt(vertex: Vec2, p: Vec2, q: Vec2): number {\n const ux = p.x - vertex.x\n const uy = p.y - vertex.y\n const vx = q.x - vertex.x\n const vy = q.y - vertex.y\n const lu = Math.hypot(ux, uy)\n const lv = Math.hypot(vx, vy)\n if (lu < 1e-18 || lv < 1e-18) return 0\n const cos = Math.max(-1, Math.min(1, (ux * vx + uy * vy) / (lu * lv)))\n return Math.acos(cos)\n}\n\nfunction circumcenter(a: Vec2, b: Vec2, c: Vec2): Vec2 | null {\n const d =\n 2 * (a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y))\n if (Math.abs(d) < 1e-18) return null\n const a2 = a.x * a.x + a.y * a.y\n const b2 = b.x * b.x + b.y * b.y\n const c2 = c.x * c.x + c.y * c.y\n return {\n x: (a2 * (b.y - c.y) + b2 * (c.y - a.y) + c2 * (a.y - b.y)) / d,\n y: (a2 * (c.x - b.x) + b2 * (a.x - c.x) + c2 * (b.x - a.x)) / d,\n }\n}\n\nfunction longestEdgeMidpoint(a: Vec2, b: Vec2, c: Vec2): Vec2 {\n const edges: [Vec2, Vec2][] = [\n [a, b],\n [b, c],\n [c, a],\n ]\n let best = edges[0]!\n let bestLen = -1\n for (const e of edges) {\n const len = Math.hypot(e[0].x - e[1].x, e[0].y - e[1].y)\n if (len > bestLen) {\n bestLen = len\n best = e\n }\n }\n return { x: (best[0].x + best[1].x) / 2, y: (best[0].y + best[1].y) / 2 }\n}\n\nexport const triangulation = {\n earCutTriangulation,\n delaunayTriangulation,\n delaunayTriangulationPoints,\n poissonTriangulation,\n poissonTriangulationPoints,\n refine,\n}\n","import type { Circle, Path, Vec2 } from '../types/index.js'\nimport { circle, polygon } from '../types/index.js'\nimport { bounds, containsPoint } from '../predicates/index.js'\nimport { boundingBox, convexHull } from '../hull/index.js'\nimport {\n maximumInscribedPack,\n maximumInscribedPackUntil,\n} from '../circlePacking/index.js'\n\n/** Axis-aligned envelope (alias of hull.boundingBox). */\nexport function envelope(p: Path): Path {\n return boundingBox(p)\n}\n\n/** Largest inscribed circle (fully contained). */\nexport function maximumInscribedCircle(\n p: Path,\n tolerance = 1,\n): Circle | null {\n return maximumInscribedPack(p, 1, tolerance)[0] ?? null\n}\n\n/** Alias: successive LECs until radius drops below `minRadius`. */\nexport function largestEmptyCircles(\n p: Path,\n minRadius: number,\n tolerance = 1,\n): Circle[] {\n return maximumInscribedPackUntil(p, minRadius, tolerance)\n}\n\n/** Single largest empty circle (no obstacle circles). */\nexport function largestEmptyCircle(\n p: Path,\n tolerance = 1,\n): Circle | null {\n return maximumInscribedCircle(p, tolerance)\n}\n\n/**\n * Heuristic maximum axis-aligned inscribed rectangle: inset the AABB until all\n * four corners lie inside. If the AABB corners are already inside, returns the envelope.\n */\nexport function maximumInscribedAARectangle(p: Path): Path {\n const b = bounds(p)\n const w = b.maxX - b.minX\n const h = b.maxY - b.minY\n if (w < 1e-12 || h < 1e-12) return envelope(p)\n\n const fits = (m: number) => {\n const rect = [\n { x: b.minX + m, y: b.minY + m },\n { x: b.maxX - m, y: b.minY + m },\n { x: b.maxX - m, y: b.maxY - m },\n { x: b.minX + m, y: b.maxY - m },\n ]\n return rect.every((pt) => containsPoint(p, pt))\n }\n\n if (fits(0)) return envelope(p)\n\n let lo = 0\n let hi = Math.min(w, h) / 2\n let best = hi\n for (let i = 0; i < 40; i++) {\n const mid = (lo + hi) / 2\n if (fits(mid)) {\n best = mid\n hi = mid\n } else {\n lo = mid\n }\n }\n const m = best\n return polygon([\n { x: b.minX + m, y: b.minY + m },\n { x: b.maxX - m, y: b.minY + m },\n { x: b.maxX - m, y: b.maxY - m },\n { x: b.minX + m, y: b.maxY - m },\n ])\n}\n\n/** Closest point on the path boundary to `point`. */\nexport function closestPoint(p: Path, point: Vec2): Vec2 {\n let best = point\n let bestD = Infinity\n for (const ring of p.rings) {\n const n = ring.length\n const edges = p.closed ? n : Math.max(0, n - 1)\n for (let i = 0; i < edges; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % n]!\n const q = projectPointToSegment(point, a, b)\n const d = Math.hypot(q.x - point.x, q.y - point.y)\n if (d < bestD) {\n bestD = d\n best = q\n }\n }\n }\n return best\n}\n\n/** Closest vertex of the path to `point`. */\nexport function closestVertex(p: Path, point: Vec2): Vec2 {\n let best = p.rings[0]?.[0] ?? point\n let bestD = Infinity\n for (const ring of p.rings) {\n for (const v of ring) {\n const d = Math.hypot(v.x - point.x, v.y - point.y)\n if (d < bestD) {\n bestD = d\n best = v\n }\n }\n }\n return { ...best }\n}\n\n/** Closest pair among a point set (O(n²); fine for small sets). */\nexport function closestPointPair(points: Vec2[]): [Vec2, Vec2] | null {\n if (points.length < 2) return null\n let best: [Vec2, Vec2] = [points[0]!, points[1]!]\n let bestD = Infinity\n for (let i = 0; i < points.length; i++) {\n for (let j = i + 1; j < points.length; j++) {\n const d = Math.hypot(\n points[i]!.x - points[j]!.x,\n points[i]!.y - points[j]!.y,\n )\n if (d < bestD) {\n bestD = d\n best = [points[i]!, points[j]!]\n }\n }\n }\n return best\n}\n\n/** Farthest pair among a point set (O(n²)). */\nexport function farthestPointPair(points: Vec2[]): [Vec2, Vec2] | null {\n if (points.length < 2) return null\n let best: [Vec2, Vec2] = [points[0]!, points[1]!]\n let bestD = -1\n for (let i = 0; i < points.length; i++) {\n for (let j = i + 1; j < points.length; j++) {\n const d = Math.hypot(\n points[i]!.x - points[j]!.x,\n points[i]!.y - points[j]!.y,\n )\n if (d > bestD) {\n bestD = d\n best = [points[i]!, points[j]!]\n }\n }\n }\n return best\n}\n\n/**\n * Minimum bounding circle of a path's vertices (Welzl on convex hull).\n */\nexport function minimumBoundingCircle(p: Path): Circle {\n const pts: Vec2[] = []\n for (const ring of p.rings) pts.push(...ring)\n const hull = convexHull(pts).rings[0] ?? pts\n return minDisk(hull)\n}\n\nfunction minDisk(points: Vec2[]): Circle {\n // Deterministic Welzl (no shuffle); fine for typical vertex counts.\n return welzl(points.map((p) => ({ ...p })), [], 0)\n}\n\nfunction welzl(P: Vec2[], R: Vec2[], i: number): Circle {\n if (i === P.length || R.length === 3) return diskFromBoundary(R)\n const d = welzl(P, R, i + 1)\n const p = P[i]!\n if (Math.hypot(p.x - d.x, p.y - d.y) <= d.r + 1e-9) return d\n return welzl(P, [...R, p], i + 1)\n}\n\nfunction diskFromBoundary(R: Vec2[]): Circle {\n if (R.length === 0) return circle(0, 0, 0)\n if (R.length === 1) return circle(R[0]!.x, R[0]!.y, 0)\n if (R.length === 2) {\n const a = R[0]!\n const b = R[1]!\n return circle(\n (a.x + b.x) / 2,\n (a.y + b.y) / 2,\n Math.hypot(a.x - b.x, a.y - b.y) / 2,\n )\n }\n return circumcircle(R[0]!, R[1]!, R[2]!)\n}\n\nfunction circumcircle(a: Vec2, b: Vec2, c: Vec2): Circle {\n const d =\n 2 * (a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y))\n if (Math.abs(d) < 1e-14) {\n // collinear — diameter of farthest pair\n const pair = farthestPointPair([a, b, c])!\n return circle(\n (pair[0].x + pair[1].x) / 2,\n (pair[0].y + pair[1].y) / 2,\n Math.hypot(pair[0].x - pair[1].x, pair[0].y - pair[1].y) / 2,\n )\n }\n const ux =\n ((a.x * a.x + a.y * a.y) * (b.y - c.y) +\n (b.x * b.x + b.y * b.y) * (c.y - a.y) +\n (c.x * c.x + c.y * c.y) * (a.y - b.y)) /\n d\n const uy =\n ((a.x * a.x + a.y * a.y) * (c.x - b.x) +\n (b.x * b.x + b.y * b.y) * (a.x - c.x) +\n (c.x * c.x + c.y * c.y) * (b.x - a.x)) /\n d\n return circle(ux, uy, Math.hypot(ux - a.x, uy - a.y))\n}\n\nfunction projectPointToSegment(p: Vec2, a: Vec2, b: Vec2): Vec2 {\n const abx = b.x - a.x\n const aby = b.y - a.y\n const len2 = abx * abx + aby * aby\n if (len2 < 1e-18) return { ...a }\n let t = ((p.x - a.x) * abx + (p.y - a.y) * aby) / len2\n t = Math.max(0, Math.min(1, t))\n return { x: a.x + t * abx, y: a.y + t * aby }\n}\n\nexport const optimisation = {\n envelope,\n maximumInscribedCircle,\n largestEmptyCircle,\n largestEmptyCircles,\n maximumInscribedAARectangle,\n closestPoint,\n closestVertex,\n closestPointPair,\n farthestPointPair,\n minimumBoundingCircle,\n}\n","import { Delaunay } from 'd3-delaunay'\nimport type { Group, Path, Vec2 } from '../types/index.js'\nimport { group, polygon } from '../types/index.js'\nimport { bounds } from '../predicates/index.js'\nimport { intersect } from '../shapeBoolean/index.js'\n\nexport type VoronoiOptions = {\n /** Clip cells to this bbox; default padded bounds of the sites. */\n bounds?: { minX: number; minY: number; maxX: number; maxY: number }\n}\n\n/**\n * Voronoi cells for a point set as closed polygons (clipped to a bbox).\n * PGS `compoundVoronoi` analogue — one path per site.\n */\nexport function compoundVoronoi(\n sites: Vec2[],\n options: VoronoiOptions = {},\n): Group {\n if (sites.length === 0) return group([])\n if (sites.length === 1) {\n const b = options.bounds ?? padBounds(sites, 1)\n return group([\n polygon([\n { x: b.minX, y: b.minY },\n { x: b.maxX, y: b.minY },\n { x: b.maxX, y: b.maxY },\n { x: b.minX, y: b.maxY },\n ]),\n ])\n }\n\n const b = options.bounds ?? padBounds(sites, 0.1)\n const delaunay = Delaunay.from(\n sites,\n (d) => d.x,\n (d) => d.y,\n )\n const voronoi = delaunay.voronoi([b.minX, b.minY, b.maxX, b.maxY])\n const paths: Path[] = []\n for (let i = 0; i < sites.length; i++) {\n const poly = voronoi.cellPolygon(i)\n if (!poly || poly.length < 3) continue\n // d3 closes the ring by repeating the first point\n const ring = poly.slice(0, -1).map(([x, y]) => ({ x, y }))\n if (ring.length >= 3) paths.push(polygon(ring))\n }\n return group(paths)\n}\n\n/**\n * Voronoi clipped to the interior of `container` (intersect each cell).\n */\nexport function innerVoronoi(\n sites: Vec2[],\n container: Path,\n options: VoronoiOptions = {},\n): Group {\n const b = options.bounds ?? {\n ...bounds(container),\n }\n const cells = compoundVoronoi(sites, { bounds: b })\n const clipped: Path[] = []\n for (const cell of cells.paths) {\n clipped.push(...intersect(cell, container).paths)\n }\n return group(clipped)\n}\n\n/** Raw cell polygons without container clip (same as compoundVoronoi). */\nexport function innerVoronoiRaw(\n sites: Vec2[],\n options: VoronoiOptions = {},\n): Group {\n return compoundVoronoi(sites, options)\n}\n\nfunction padBounds(\n sites: Vec2[],\n padRatio: number,\n): { minX: number; minY: number; maxX: number; maxY: number } {\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const s of sites) {\n minX = Math.min(minX, s.x)\n minY = Math.min(minY, s.y)\n maxX = Math.max(maxX, s.x)\n maxY = Math.max(maxY, s.y)\n }\n const pad =\n Math.max(maxX - minX, maxY - minY, 1) * padRatio + 1e-6\n return {\n minX: minX - pad,\n minY: minY - pad,\n maxX: maxX + pad,\n maxY: maxY + pad,\n }\n}\n\nexport const voronoi = {\n compoundVoronoi,\n innerVoronoi,\n innerVoronoiRaw,\n}\n","import type { Path, Vec2 } from '../types/index.js'\nimport { path, polygon, polyline } from '../types/index.js'\n\n/** Regular n-gon approximating a circle. */\nexport function createCircle(\n cx: number,\n cy: number,\n radius: number,\n segments = 64,\n): Path {\n return createRegularPolygon(cx, cy, radius, Math.max(3, Math.floor(segments)))\n}\n\nexport function createRect(\n x: number,\n y: number,\n width: number,\n height: number,\n): Path {\n return polygon([\n { x, y },\n { x: x + width, y },\n { x: x + width, y: y + height },\n { x, y: y + height },\n ])\n}\n\nexport function createRegularPolygon(\n cx: number,\n cy: number,\n radius: number,\n sides: number,\n rotation = -Math.PI / 2,\n): Path {\n const n = Math.max(3, Math.floor(sides))\n const ring: Vec2[] = []\n for (let i = 0; i < n; i++) {\n const t = rotation + (i / n) * Math.PI * 2\n ring.push({ x: cx + Math.cos(t) * radius, y: cy + Math.sin(t) * radius })\n }\n return polygon(ring)\n}\n\n/** Annulus as exterior + hole. */\nexport function createRing(\n cx: number,\n cy: number,\n outerRadius: number,\n innerRadius: number,\n segments = 64,\n): Path {\n const outer = createCircle(cx, cy, outerRadius, segments).rings[0]!\n const inner = createCircle(cx, cy, Math.min(innerRadius, outerRadius), segments)\n .rings[0]!\n // hole winding opposite for Clipper\n return path([outer, [...inner].reverse()], true)\n}\n\n/** Open circular arc polyline from `startAngle` to `endAngle` (radians). */\nexport function createArc(\n cx: number,\n cy: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n segments = 32,\n): Path {\n const n = Math.max(2, Math.floor(segments))\n const pts: Vec2[] = []\n for (let i = 0; i <= n; i++) {\n const t = startAngle + ((endAngle - startAngle) * i) / n\n pts.push({ x: cx + Math.cos(t) * radius, y: cy + Math.sin(t) * radius })\n }\n return polyline(pts)\n}\n\n/** Star polygon (outer/inner radius alternating). */\nexport function createStar(\n cx: number,\n cy: number,\n outerRadius: number,\n innerRadius: number,\n points = 5,\n rotation = -Math.PI / 2,\n): Path {\n const n = Math.max(3, Math.floor(points))\n const ring: Vec2[] = []\n for (let i = 0; i < n * 2; i++) {\n const r = i % 2 === 0 ? outerRadius : innerRadius\n const t = rotation + (i / (n * 2)) * Math.PI * 2\n ring.push({ x: cx + Math.cos(t) * r, y: cy + Math.sin(t) * r })\n }\n return polygon(ring)\n}\n\n/** Koch snowflake after `iterations` refinement (0 = equilateral triangle). */\nexport function createKochSnowflake(\n cx: number,\n cy: number,\n radius: number,\n iterations = 3,\n): Path {\n const tri = createRegularPolygon(cx, cy, radius, 3)\n let ring = tri.rings[0]!\n const iters = Math.max(0, Math.min(6, Math.floor(iterations)))\n for (let i = 0; i < iters; i++) {\n ring = kochRefine(ring)\n }\n return polygon(ring)\n}\n\nfunction kochRefine(ring: Vec2[]): Vec2[] {\n const out: Vec2[] = []\n const n = ring.length\n for (let i = 0; i < n; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % n]!\n const dx = b.x - a.x\n const dy = b.y - a.y\n const p1 = { x: a.x + dx / 3, y: a.y + dy / 3 }\n const p2 = { x: a.x + (2 * dx) / 3, y: a.y + (2 * dy) / 3 }\n // outward peak (left of directed edge in Y-down SVG coords = rotate +90 for CCW tri)\n const px = a.x + dx / 2 - dy * (Math.sqrt(3) / 6)\n const py = a.y + dy / 2 + dx * (Math.sqrt(3) / 6)\n out.push(a, p1, { x: px, y: py }, p2)\n }\n return out\n}\n\nexport const construction = {\n createCircle,\n createRect,\n createRegularPolygon,\n createRing,\n createArc,\n createStar,\n createKochSnowflake,\n}\n","import type { Group, Path, Vec2 } from '../types/index.js'\nimport { group, polygon } from '../types/index.js'\nimport { bounds } from '../predicates/index.js'\nimport { createRect } from '../construction/index.js'\nimport { intersect } from '../shapeBoolean/index.js'\nimport { slice } from '../processing/index.js'\n\n/** Axis-aligned square cells covering a box. */\nexport function squareGrid(\n spacing: number,\n minX: number,\n minY: number,\n maxX: number,\n maxY: number,\n): Group {\n const s = Math.max(spacing, 1e-9)\n const paths: Path[] = []\n for (let x = minX; x < maxX - 1e-12; x += s) {\n for (let y = minY; y < maxY - 1e-12; y += s) {\n const w = Math.min(s, maxX - x)\n const h = Math.min(s, maxY - y)\n if (w > 1e-12 && h > 1e-12) paths.push(createRect(x, y, w, h))\n }\n }\n return group(paths)\n}\n\n/** Pointy-top hex cells covering a box (flat radii ≈ spacing/2). */\nexport function hexTiling(\n spacing: number,\n minX: number,\n minY: number,\n maxX: number,\n maxY: number,\n): Group {\n const s = Math.max(spacing, 1e-9)\n const r = s / 2\n const dx = s * 0.75\n const dy = s * Math.sqrt(3) * 0.5\n const paths: Path[] = []\n let row = 0\n for (let y = minY + r; y <= maxY + r; y += dy, row++) {\n const x0 = minX + r + (row % 2 === 0 ? 0 : dx * 0.5)\n for (let x = x0; x <= maxX + r; x += dx) {\n paths.push(hexagon(x, y, r))\n }\n }\n return group(paths)\n}\n\nfunction hexagon(cx: number, cy: number, r: number): Path {\n const ring: Vec2[] = []\n for (let i = 0; i < 6; i++) {\n const t = (Math.PI / 180) * (60 * i - 30)\n ring.push({ x: cx + Math.cos(t) * r, y: cy + Math.sin(t) * r })\n }\n return polygon(ring)\n}\n\n/** Split a rectangle into an `nx` × `ny` grid of cells. */\nexport function rectSubdivision(p: Path, nx: number, ny: number): Group {\n const b = bounds(p)\n const cols = Math.max(1, Math.floor(nx))\n const rows = Math.max(1, Math.floor(ny))\n const dw = (b.maxX - b.minX) / cols\n const dh = (b.maxY - b.minY) / rows\n const paths: Path[] = []\n for (let i = 0; i < cols; i++) {\n for (let j = 0; j < rows; j++) {\n const cell = createRect(\n b.minX + i * dw,\n b.minY + j * dh,\n dw,\n dh,\n )\n paths.push(...intersect(p, cell).paths)\n }\n }\n return group(paths)\n}\n\n/** Recursively split each quad face into 4 by edge midpoints (`depth` times). */\nexport function quadSubdivision(faces: Path[], depth = 1): Group {\n let cur = faces\n const d = Math.max(0, Math.floor(depth))\n for (let i = 0; i < d; i++) {\n const next: Path[] = []\n for (const f of cur) {\n next.push(...subdivideQuad(f))\n }\n cur = next\n }\n return group(cur)\n}\n\nfunction subdivideQuad(p: Path): Path[] {\n const ring = p.rings[0]\n if (!ring || ring.length < 4) return [p]\n const [a, b, c, d] = ring\n if (!a || !b || !c || !d) return [p]\n const mab = mid(a, b)\n const mbc = mid(b, c)\n const mcd = mid(c, d)\n const mda = mid(d, a)\n const cen = mid(mid(a, c), mid(b, d))\n return [\n polygon([a, mab, cen, mda]),\n polygon([mab, b, mbc, cen]),\n polygon([cen, mbc, c, mcd]),\n polygon([mda, cen, mcd, d]),\n ]\n}\n\n/** Split each triangle into 4 by edge midpoints. */\nexport function triangleSubdivision(faces: Path[], depth = 1): Group {\n let cur = faces\n const d = Math.max(0, Math.floor(depth))\n for (let i = 0; i < d; i++) {\n const next: Path[] = []\n for (const f of cur) {\n next.push(...subdivideTriangle(f))\n }\n cur = next\n }\n return group(cur)\n}\n\nfunction subdivideTriangle(p: Path): Path[] {\n const ring = p.rings[0]\n if (!ring || ring.length < 3) return [p]\n const a = ring[0]!\n const b = ring[1]!\n const c = ring[2]!\n const mab = mid(a, b)\n const mbc = mid(b, c)\n const mca = mid(c, a)\n return [\n polygon([a, mab, mca]),\n polygon([mab, b, mbc]),\n polygon([mca, mbc, c]),\n polygon([mab, mbc, mca]),\n ]\n}\n\n/**\n * Slice a path into strips with parallel cuts spaced by `spacing`.\n * Angle in radians (0 = vertical cuts).\n */\nexport function sliceDivision(\n p: Path,\n spacing: number,\n angle = 0,\n): Group {\n const s = Math.max(spacing, 1e-9)\n const b = bounds(p)\n const cx = (b.minX + b.maxX) / 2\n const cy = (b.minY + b.maxY) / 2\n const diag = Math.hypot(b.maxX - b.minX, b.maxY - b.minY) + s\n const ux = Math.cos(angle)\n const uy = Math.sin(angle)\n // normal for cut lines\n const nx = -uy\n const ny = ux\n const parts: Path[] = [p]\n for (let t = -diag; t <= diag; t += s) {\n const a = { x: cx + nx * t - ux * diag, y: cy + ny * t - uy * diag }\n const bb = { x: cx + nx * t + ux * diag, y: cy + ny * t + uy * diag }\n const next: Path[] = []\n for (const piece of parts) {\n const g = slice(piece, a, bb)\n next.push(...(g.paths.length ? g.paths : [piece]))\n }\n parts.length = 0\n parts.push(...next)\n }\n return group(parts)\n}\n\n/** Parallel hatch-like strip division (alias of sliceDivision). */\nexport function hatchSubdivision(\n p: Path,\n spacing: number,\n angle = 0,\n): Group {\n return sliceDivision(p, spacing, angle)\n}\n\nfunction mid(a: Vec2, b: Vec2): Vec2 {\n return { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 }\n}\n\nexport const tiling = {\n squareGrid,\n hexTiling,\n rectSubdivision,\n quadSubdivision,\n triangleSubdivision,\n sliceDivision,\n hatchSubdivision,\n}\n","import type { Path, Vec2 } from '../types/index.js'\nimport { polygon } from '../types/index.js'\nimport { convexHull } from '../hull/index.js'\nimport { area } from '../predicates/index.js'\n\n/** Convex hull (largest-area simple polygonisation for a point cloud). */\nexport function maxArea(points: Vec2[]): Path {\n return convexHull(points)\n}\n\n/**\n * Minimum-area triangle covering the points among hull edges\n * (O(h²) rotating-calipers style brute force on hull).\n * Falls back to hull if fewer than 3 hull vertices.\n */\nexport function minArea(points: Vec2[]): Path {\n const hull = convexHull(points).rings[0] ?? []\n if (hull.length < 3) return convexHull(points)\n if (hull.length === 3) return polygon(hull)\n\n let best: Path | null = null\n let bestA = Infinity\n const h = hull\n const n = h.length\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n for (let k = j + 1; k < n; k++) {\n const tri = polygon([h[i]!, h[j]!, h[k]!])\n if (!coversPoints(tri, points)) continue\n const a = area(tri)\n if (a < bestA) {\n bestA = a\n best = tri\n }\n }\n }\n }\n return best ?? convexHull(points)\n}\n\n/** Closed polygon connecting points in order of minimum spanning path heuristic (NN tour). */\nexport function minPerimeter(points: Vec2[]): Path {\n if (points.length === 0) return polygon([])\n if (points.length < 3) return polygon(points)\n const remaining = points.map((p) => ({ ...p }))\n const ordered: Vec2[] = [remaining.shift()!]\n while (remaining.length) {\n const last = ordered[ordered.length - 1]!\n let bestI = 0\n let bestD = Infinity\n for (let i = 0; i < remaining.length; i++) {\n const d = Math.hypot(\n remaining[i]!.x - last.x,\n remaining[i]!.y - last.y,\n )\n if (d < bestD) {\n bestD = d\n bestI = i\n }\n }\n ordered.push(remaining.splice(bestI, 1)[0]!)\n }\n return polygon(ordered)\n}\n\n/** Connect points sorted by x then y. */\nexport function horizontal(points: Vec2[]): Path {\n const pts = [...points].sort((a, b) =>\n a.y === b.y ? a.x - b.x : a.y - b.y,\n )\n return polygon(pts)\n}\n\n/** Connect points sorted by y then x. */\nexport function vertical(points: Vec2[]): Path {\n const pts = [...points].sort((a, b) =>\n a.x === b.x ? a.y - b.y : a.x - b.x,\n )\n return polygon(pts)\n}\n\n/** Connect by polar angle around centroid. */\nexport function angular(points: Vec2[]): Path {\n if (points.length === 0) return polygon([])\n const c = centroidOf(points)\n const pts = [...points].sort(\n (a, b) =>\n Math.atan2(a.y - c.y, a.x - c.x) - Math.atan2(b.y - c.y, b.x - c.x),\n )\n return polygon(pts)\n}\n\n/** Alias of angular. */\nexport function circular(points: Vec2[]): Path {\n return angular(points)\n}\n\n/**\n * Onion layers: successive convex hulls. Returns the outermost hull polygon;\n * use `onionLayers` for all peels.\n */\nexport function onion(points: Vec2[]): Path {\n const layers = onionLayers(points)\n return layers[0] ?? polygon([])\n}\n\n/** Convex onion peels from outside in. */\nexport function onionLayers(points: Vec2[]): Path[] {\n let remaining = points.map((p) => ({ ...p }))\n const layers: Path[] = []\n while (remaining.length >= 3) {\n const hull = convexHull(remaining)\n const ring = hull.rings[0] ?? []\n if (ring.length < 3) break\n layers.push(hull)\n const onHull = new Set(ring.map((v) => `${v.x},${v.y}`))\n remaining = remaining.filter((p) => !onHull.has(`${p.x},${p.y}`))\n }\n return layers\n}\n\n/** Connect points ordered by 2D Hilbert curve index. */\nexport function hilbert(points: Vec2[]): Path {\n if (points.length === 0) return polygon([])\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n for (const p of points) {\n minX = Math.min(minX, p.x)\n minY = Math.min(minY, p.y)\n maxX = Math.max(maxX, p.x)\n maxY = Math.max(maxY, p.y)\n }\n const span = Math.max(maxX - minX, maxY - minY, 1e-9)\n const order = 10\n const n = 1 << order\n const scored = points.map((p) => {\n const x = Math.min(\n n - 1,\n Math.max(0, Math.floor(((p.x - minX) / span) * (n - 1))),\n )\n const y = Math.min(\n n - 1,\n Math.max(0, Math.floor(((p.y - minY) / span) * (n - 1))),\n )\n return { p, h: xy2d(order, x, y) }\n })\n scored.sort((a, b) => a.h - b.h)\n return polygon(scored.map((s) => s.p))\n}\n\nfunction coversPoints(poly: Path, points: Vec2[]): boolean {\n // triangle cover check via barycentric\n const r = poly.rings[0]\n if (!r || r.length < 3) return false\n const a = r[0]!\n const b = r[1]!\n const c = r[2]!\n for (const p of points) {\n if (!pointInTriangle(p, a, b, c)) return false\n }\n return true\n}\n\nfunction pointInTriangle(p: Vec2, a: Vec2, b: Vec2, c: Vec2): boolean {\n const v0x = c.x - a.x\n const v0y = c.y - a.y\n const v1x = b.x - a.x\n const v1y = b.y - a.y\n const v2x = p.x - a.x\n const v2y = p.y - a.y\n const dot00 = v0x * v0x + v0y * v0y\n const dot01 = v0x * v1x + v0y * v1y\n const dot02 = v0x * v2x + v0y * v2y\n const dot11 = v1x * v1x + v1y * v1y\n const dot12 = v1x * v2x + v1y * v2y\n const inv = 1 / (dot00 * dot11 - dot01 * dot01 || 1e-18)\n const u = (dot11 * dot02 - dot01 * dot12) * inv\n const v = (dot00 * dot12 - dot01 * dot02) * inv\n return u >= -1e-9 && v >= -1e-9 && u + v <= 1 + 1e-9\n}\n\nfunction centroidOf(points: Vec2[]): Vec2 {\n let sx = 0\n let sy = 0\n for (const p of points) {\n sx += p.x\n sy += p.y\n }\n return { x: sx / points.length, y: sy / points.length }\n}\n\n/** Hilbert index for (x,y) in [0, 2^order). */\nfunction xy2d(order: number, x: number, y: number): number {\n let rx\n let ry\n let s\n let d = 0\n for (s = 1 << (order - 1); s > 0; s >>= 1) {\n rx = (x & s) > 0 ? 1 : 0\n ry = (y & s) > 0 ? 1 : 0\n d += s * s * ((3 * rx) ^ ry)\n ;({ x, y } = rot(s, x, y, rx, ry))\n }\n return d\n}\n\nfunction rot(\n n: number,\n x: number,\n y: number,\n rx: number,\n ry: number,\n): { x: number; y: number } {\n if (ry === 0) {\n if (rx === 1) {\n x = n - 1 - x\n y = n - 1 - y\n }\n return { x: y, y: x }\n }\n return { x, y }\n}\n\nexport const polygonisation = {\n maxArea,\n minArea,\n minPerimeter,\n horizontal,\n vertical,\n angular,\n circular,\n onion,\n onionLayers,\n hilbert,\n}\n","import type { Group, Path, Segment, Vec2 } from '../types/index.js'\nimport { group, polygon, polyline, segment } from '../types/index.js'\nimport { centroid, containsPoint, area } from '../predicates/index.js'\nimport { delaunayTriangulationPoints } from '../triangulation/index.js'\nimport { union } from '../shapeBoolean/index.js'\nimport { simplify as simplifyPath } from '../morphology/index.js'\n\n// ---------------------------------------------------------------------------\n// Shared mesh primitives\n// ---------------------------------------------------------------------------\n\ntype EdgeRec = { a: Vec2; b: Vec2; faceIds: number[] }\n\nfunction edgeKey(a: Vec2, b: Vec2): string {\n const aKey = `${a.x},${a.y}`\n const bKey = `${b.x},${b.y}`\n return aKey < bKey ? `${aKey}|${bKey}` : `${bKey}|${aKey}`\n}\n\nfunction vertKey(v: Vec2): string {\n return `${v.x},${v.y}`\n}\n\nfunction same(a: Vec2, b: Vec2, eps = 1e-12): boolean {\n return Math.abs(a.x - b.x) < eps && Math.abs(a.y - b.y) < eps\n}\n\nfunction dist(a: Vec2, b: Vec2): number {\n return Math.hypot(a.x - b.x, a.y - b.y)\n}\n\nfunction mid(a: Vec2, b: Vec2): Vec2 {\n return { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 }\n}\n\nfunction lerp(a: Vec2, b: Vec2, t: number): Vec2 {\n return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t }\n}\n\nfunction unique(points: Vec2[]): Vec2[] {\n const seen = new Set<string>()\n const out: Vec2[] = []\n for (const p of points) {\n const k = vertKey(p)\n if (seen.has(k)) continue\n seen.add(k)\n out.push({ ...p })\n }\n return out\n}\n\nfunction cross(o: Vec2, a: Vec2, b: Vec2): number {\n return (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x)\n}\n\nfunction ringOf(face: Path): Vec2[] {\n return face.rings[0] ?? []\n}\n\n/** Build undirected edge → incident face indices for exterior rings. */\nfunction buildEdgeMap(faces: Path[]): Map<string, EdgeRec> {\n const edges = new Map<string, EdgeRec>()\n faces.forEach((f, fi) => {\n const ring = ringOf(f)\n if (ring.length < 2) return\n const n = ring.length\n const closed = f.closed !== false && n >= 3\n const lim = closed ? n : n - 1\n for (let i = 0; i < lim; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % n]!\n const key = edgeKey(a, b)\n const rec = edges.get(key)\n if (rec) rec.faceIds.push(fi)\n else edges.set(key, { a: { ...a }, b: { ...b }, faceIds: [fi] })\n }\n })\n return edges\n}\n\nfunction perimeterKeys(edgeMap: Map<string, EdgeRec>): Set<string> {\n const out = new Set<string>()\n for (const [k, e] of edgeMap) {\n if (e.faceIds.length === 1) out.add(k)\n }\n return out\n}\n\nfunction faceAdjacency(faces: Path[]): number[][] {\n const edgeMap = buildEdgeMap(faces)\n const adj: number[][] = faces.map(() => [])\n for (const e of edgeMap.values()) {\n if (e.faceIds.length === 2) {\n const [i, j] = e.faceIds\n adj[i!]!.push(j!)\n adj[j!]!.push(i!)\n }\n }\n return adj\n}\n\n/** Collect unique sites from triangulation faces. */\nfunction sitesFromFaces(faces: Path[]): Vec2[] {\n return unique(faces.flatMap((f) => ringOf(f)))\n}\n\n/**\n * Merge triangles that share a removed (non-kept) edge into polygonal faces.\n * Kept edges (and perimeter) form the resulting face boundaries.\n */\nfunction facesFromKeptEdges(\n tris: Path[],\n kept: Set<string>,\n): Path[] {\n if (tris.length === 0) return []\n const parent = tris.map((_, i) => i)\n const find = (i: number): number => {\n let x = i\n while (parent[x] !== x) {\n parent[x] = parent[parent[x]!]!\n x = parent[x]!\n }\n return x\n }\n const unite = (a: number, b: number) => {\n const ra = find(a)\n const rb = find(b)\n if (ra !== rb) parent[rb] = ra\n }\n\n const edgeMap = buildEdgeMap(tris)\n for (const [key, e] of edgeMap) {\n if (e.faceIds.length === 2 && !kept.has(key)) {\n unite(e.faceIds[0]!, e.faceIds[1]!)\n }\n }\n\n const components = new Map<number, number[]>()\n for (let i = 0; i < tris.length; i++) {\n const r = find(i)\n const list = components.get(r) ?? []\n list.push(i)\n components.set(r, list)\n }\n\n const out: Path[] = []\n for (const members of components.values()) {\n const ring = boundaryRingOfComponent(tris, members)\n if (ring && ring.length >= 3) out.push(polygon(ring))\n }\n return out\n}\n\n/** Exterior ring of a set of triangles (edges appearing once in the set). */\nfunction boundaryRingOfComponent(\n tris: Path[],\n members: number[],\n): Vec2[] | null {\n const edgeCount = new Map<string, { a: Vec2; b: Vec2; n: number }>()\n for (const fi of members) {\n const ring = ringOf(tris[fi]!)\n if (ring.length < 3) continue\n for (let i = 0; i < ring.length; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % ring.length]!\n const key = edgeKey(a, b)\n const rec = edgeCount.get(key)\n if (rec) rec.n++\n else edgeCount.set(key, { a: { ...a }, b: { ...b }, n: 1 })\n }\n }\n const boundary: { a: Vec2; b: Vec2 }[] = []\n for (const e of edgeCount.values()) {\n if (e.n === 1) boundary.push({ a: e.a, b: e.b })\n }\n if (boundary.length < 3) return null\n return orderEdgesIntoRing(boundary)\n}\n\nfunction orderEdgesIntoRing(edges: { a: Vec2; b: Vec2 }[]): Vec2[] | null {\n if (edges.length === 0) return null\n const adj = new Map<string, Vec2[]>()\n const add = (from: Vec2, to: Vec2) => {\n const k = vertKey(from)\n const list = adj.get(k) ?? []\n list.push(to)\n adj.set(k, list)\n }\n for (const e of edges) {\n add(e.a, e.b)\n add(e.b, e.a)\n }\n\n const start = edges[0]!.a\n const ring: Vec2[] = [{ ...start }]\n let prev = start\n let curr = edges[0]!.b\n const maxSteps = edges.length + 2\n for (let step = 0; step < maxSteps; step++) {\n ring.push({ ...curr })\n if (same(curr, start) && ring.length > 2) {\n ring.pop()\n return ring\n }\n const nbrs = adj.get(vertKey(curr)) ?? []\n let next: Vec2 | null = null\n for (const n of nbrs) {\n if (!same(n, prev)) {\n next = n\n break\n }\n }\n if (!next) break\n prev = curr\n curr = next\n }\n return ring.length >= 3 ? ring : null\n}\n\nfunction applyEdgeFilter(\n tris: Path[],\n shouldKeep: (a: Vec2, b: Vec2, perimeter: boolean) => boolean,\n preservePerimeter: boolean,\n): Path[] {\n const edgeMap = buildEdgeMap(tris)\n const peri = perimeterKeys(edgeMap)\n const kept = new Set<string>()\n for (const [key, e] of edgeMap) {\n const isPeri = peri.has(key)\n if (isPeri && preservePerimeter) {\n kept.add(key)\n continue\n }\n if (shouldKeep(e.a, e.b, isPeri)) kept.add(key)\n }\n return facesFromKeptEdges(tris, kept)\n}\n\nfunction asTriFaces(input: Vec2[] | Path[]): Path[] {\n if (input.length === 0) return []\n const first = input[0]!\n if ('rings' in first) return input as Path[]\n return delaunayTriangulationPoints(input as Vec2[])\n}\n\nfunction pointsOf(input: Vec2[] | Path[]): Vec2[] {\n if (input.length === 0) return []\n const first = input[0]!\n if ('rings' in first) return sitesFromFaces(input as Path[])\n return input as Vec2[]\n}\n\n// ---------------------------------------------------------------------------\n// Extract / query\n// ---------------------------------------------------------------------------\n\n/** Edges shared by at least two faces (excludes perimeter and hole boundaries). */\nexport function extractInnerEdges(faces: Path[]): Segment[] {\n const edgeMap = buildEdgeMap(faces)\n const out: Segment[] = []\n for (const e of edgeMap.values()) {\n if (e.faceIds.length >= 2) out.push(segment(e.a, e.b))\n }\n return out\n}\n\n/** Vertices not on the mesh perimeter. */\nexport function extractInnerVertices(faces: Path[]): Vec2[] {\n const edgeMap = buildEdgeMap(faces)\n const peri = perimeterKeys(edgeMap)\n const periVerts = new Set<string>()\n for (const key of peri) {\n const e = edgeMap.get(key)!\n periVerts.add(vertKey(e.a))\n periVerts.add(vertKey(e.b))\n }\n const out: Vec2[] = []\n const seen = new Set<string>()\n for (const f of faces) {\n for (const v of ringOf(f)) {\n const k = vertKey(v)\n if (periVerts.has(k) || seen.has(k)) continue\n seen.add(k)\n out.push({ ...v })\n }\n }\n return out\n}\n\n/** First face that contains `point`, or null. */\nexport function findContainingFace(\n faces: Path[],\n point: Vec2,\n): Path | null {\n for (const f of faces) {\n if (containsPoint(f, point)) return f\n }\n return null\n}\n\n/** Split every face edge longer than `maxLen` by inserting subdivision points. */\nexport function splitEdges(faces: Path[], maxLen: number): Group {\n const lim = Math.max(maxLen, 1e-9)\n const out: Path[] = []\n for (const f of faces) {\n out.push(\n polygon(\n densifyRing(ringOf(f), lim),\n f.rings.slice(1).map((r) => densifyRing(r, lim)),\n ),\n )\n }\n return group(out)\n}\n\nfunction densifyRing(ring: Vec2[], maxLen: number): Vec2[] {\n if (ring.length < 2) return ring.map((v) => ({ ...v }))\n const out: Vec2[] = []\n const n = ring.length\n for (let i = 0; i < n; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % n]!\n out.push({ ...a })\n const d = dist(a, b)\n const steps = Math.floor(d / maxLen)\n for (let s = 1; s < steps; s++) out.push(lerp(a, b, s / steps))\n }\n return out\n}\n\n// ---------------------------------------------------------------------------\n// Graph faces (Urquhart / Gabriel / RNG / Spanner / Dual)\n// ---------------------------------------------------------------------------\n\nfunction isGabriel(a: Vec2, b: Vec2, points: Vec2[]): boolean {\n const m = mid(a, b)\n const r = dist(a, b) / 2\n for (const p of points) {\n if (same(p, a) || same(p, b)) continue\n if (dist(p, m) < r - 1e-9) return false\n }\n return true\n}\n\nfunction isRelativeNeighbor(a: Vec2, b: Vec2, points: Vec2[]): boolean {\n const dab = dist(a, b)\n for (const p of points) {\n if (same(p, a) || same(p, b)) continue\n if (Math.max(dist(p, a), dist(p, b)) < dab - 1e-9) return false\n }\n return true\n}\n\n/** Urquhart faces: remove longest edge of each triangle, then polygonize. */\nexport function urquhartFaces(\n input: Vec2[] | Path[],\n preservePerimeter = false,\n): Group {\n const tris = asTriFaces(input)\n const edgeMap = buildEdgeMap(tris)\n const peri = perimeterKeys(edgeMap)\n const removed = new Set<string>()\n for (const t of tris) {\n const r = ringOf(t)\n if (r.length < 3) continue\n let longestKey = ''\n let longestLen = -1\n for (let i = 0; i < 3; i++) {\n const a = r[i]!\n const b = r[(i + 1) % 3]!\n const d = dist(a, b)\n if (d > longestLen) {\n longestLen = d\n longestKey = edgeKey(a, b)\n }\n }\n if (longestKey && !(preservePerimeter && peri.has(longestKey))) {\n removed.add(longestKey)\n }\n }\n const kept = new Set<string>()\n for (const key of edgeMap.keys()) {\n if (!removed.has(key)) kept.add(key)\n }\n return group(facesFromKeptEdges(tris, kept))\n}\n\n/** Gabriel graph faces from a point set or triangulation. */\nexport function gabrielFaces(\n input: Vec2[] | Path[],\n preservePerimeter = false,\n): Group {\n const tris = asTriFaces(input)\n const pts = pointsOf(input)\n return group(\n applyEdgeFilter(\n tris,\n (a, b) => isGabriel(a, b, pts),\n preservePerimeter,\n ),\n )\n}\n\n/** Relative-neighborhood graph faces. */\nexport function relativeNeighborFaces(\n input: Vec2[] | Path[],\n preservePerimeter = false,\n): Group {\n const tris = asTriFaces(input)\n const pts = pointsOf(input)\n return group(\n applyEdgeFilter(\n tris,\n (a, b) => isRelativeNeighbor(a, b, pts),\n preservePerimeter,\n ),\n )\n}\n\n/**\n * Greedy sparse spanner faces. Higher `k` allows longer detours, so more edges\n * are collapsed → larger faces.\n */\nexport function spannerFaces(\n input: Vec2[] | Path[],\n k = 1,\n preservePerimeter = false,\n): Group {\n const tris = asTriFaces(input)\n const edgeMap = buildEdgeMap(tris)\n const peri = perimeterKeys(edgeMap)\n const stretch = Math.max(1, k)\n const edges = [...edgeMap.entries()].map(([key, e]) => ({\n key,\n a: e.a,\n b: e.b,\n len: dist(e.a, e.b),\n peri: peri.has(key),\n }))\n edges.sort((a, b) => a.len - b.len)\n\n const adj = new Map<string, { to: string; w: number }[]>()\n const link = (a: Vec2, b: Vec2, w: number) => {\n const ka = vertKey(a)\n const kb = vertKey(b)\n if (!adj.has(ka)) adj.set(ka, [])\n if (!adj.has(kb)) adj.set(kb, [])\n adj.get(ka)!.push({ to: kb, w })\n adj.get(kb)!.push({ to: ka, w })\n }\n const shortest = (from: Vec2, to: Vec2): number => {\n const start = vertKey(from)\n const goal = vertKey(to)\n const distMap = new Map<string, number>([[start, 0]])\n const pq: { k: string; d: number }[] = [{ k: start, d: 0 }]\n while (pq.length) {\n pq.sort((x, y) => x.d - y.d)\n const cur = pq.shift()!\n if (cur.k === goal) return cur.d\n if (cur.d > (distMap.get(cur.k) ?? Infinity)) continue\n for (const e of adj.get(cur.k) ?? []) {\n const nd = cur.d + e.w\n if (nd < (distMap.get(e.to) ?? Infinity)) {\n distMap.set(e.to, nd)\n pq.push({ k: e.to, d: nd })\n }\n }\n }\n return Infinity\n }\n\n const kept = new Set<string>()\n for (const e of edges) {\n if (e.peri && preservePerimeter) {\n kept.add(e.key)\n link(e.a, e.b, e.len)\n continue\n }\n const pathLen = shortest(e.a, e.b)\n if (pathLen > stretch * e.len + 1e-9) {\n kept.add(e.key)\n link(e.a, e.b, e.len)\n } else if (e.peri) {\n // Keep perimeter even when stretch would drop it, so faces stay bounded.\n kept.add(e.key)\n link(e.a, e.b, e.len)\n }\n }\n return group(facesFromKeptEdges(tris, kept))\n}\n\n/**\n * Dual faces of a triangulation: closed polygons connecting centroids of\n * triangles around each interior primal vertex.\n */\nexport function dualFaces(faces: Path[]): Group {\n if (faces.length === 0) return group([])\n const edgeMap = buildEdgeMap(faces)\n const peri = perimeterKeys(edgeMap)\n const periVerts = new Set<string>()\n for (const key of peri) {\n const e = edgeMap.get(key)!\n periVerts.add(vertKey(e.a))\n periVerts.add(vertKey(e.b))\n }\n\n // vertex → list of (faceIndex, angle of face centroid from vertex)\n const incident = new Map<string, { fi: number; ang: number; v: Vec2 }[]>()\n faces.forEach((f, fi) => {\n const c = centroid(f)\n for (const v of ringOf(f)) {\n const k = vertKey(v)\n if (periVerts.has(k)) continue\n const list = incident.get(k) ?? []\n list.push({ fi, ang: Math.atan2(c.y - v.y, c.x - v.x), v })\n incident.set(k, list)\n }\n })\n\n const out: Path[] = []\n for (const list of incident.values()) {\n if (list.length < 3) continue\n // Dedupe by face index\n const byFace = new Map<number, (typeof list)[0]>()\n for (const item of list) byFace.set(item.fi, item)\n const uniqueList = [...byFace.values()]\n if (uniqueList.length < 3) continue\n uniqueList.sort((a, b) => a.ang - b.ang)\n const ring = uniqueList.map((item) => centroid(faces[item.fi]!))\n out.push(polygon(ring))\n }\n return group(out)\n}\n\n// ---------------------------------------------------------------------------\n// Quadrangulations\n// ---------------------------------------------------------------------------\n\nfunction triVerts(t: Path): [Vec2, Vec2, Vec2] | null {\n const r = ringOf(t)\n if (r.length < 3) return null\n return [r[0]!, r[1]!, r[2]!]\n}\n\n/** Midpoint cache keyed by edge. */\nfunction midpointMap(faces: Path[]): Map<string, Vec2> {\n const mids = new Map<string, Vec2>()\n const edgeMap = buildEdgeMap(faces)\n for (const [key, e] of edgeMap) {\n mids.set(key, mid(e.a, e.b))\n }\n return mids\n}\n\n/**\n * Centroid quadrangulation: one quad per triangulation edge using the\n * centroids of the one or two incident triangles.\n */\nexport function centroidQuadrangulation(\n input: Vec2[] | Path[],\n preservePerimeter = true,\n): Group {\n const tris = asTriFaces(input)\n const edgeMap = buildEdgeMap(tris)\n const centers = tris.map((t) => centroid(t))\n const out: Path[] = []\n const peri = perimeterKeys(edgeMap)\n\n for (const [key, e] of edgeMap) {\n const ids = e.faceIds\n if (ids.length === 2) {\n const c0 = centers[ids[0]!]!\n const c1 = centers[ids[1]!]!\n out.push(polygon([e.a, c0, e.b, c1]))\n } else if (ids.length === 1 && preservePerimeter) {\n const c0 = centers[ids[0]!]!\n out.push(polygon([e.a, e.b, c0]))\n } else if (ids.length === 1 && !preservePerimeter && peri.has(key)) {\n // drop perimeter-only triangles when not preserving\n }\n }\n return group(out)\n}\n\n/**\n * Split (Catmull–Clark) quadrangulation: 3 quads per triangle via edge\n * midpoints and the face centroid.\n */\nexport function splitQuadrangulation(input: Vec2[] | Path[]): Group {\n const tris = asTriFaces(input)\n const mids = midpointMap(tris)\n const out: Path[] = []\n for (const t of tris) {\n const v = triVerts(t)\n if (!v) continue\n const [a, b, c] = v\n const g = centroid(t)\n const mab = mids.get(edgeKey(a, b)) ?? mid(a, b)\n const mbc = mids.get(edgeKey(b, c)) ?? mid(b, c)\n const mca = mids.get(edgeKey(c, a)) ?? mid(c, a)\n out.push(polygon([a, mab, g, mca]))\n out.push(polygon([b, mbc, g, mab]))\n out.push(polygon([c, mca, g, mbc]))\n }\n return group(out)\n}\n\n/**\n * Edge-collapse quadrangulation: greedy pairing of adjacent triangles into quads\n * (edge-coloring style collapse of shared edges).\n */\nexport function edgeCollapseQuadrangulation(\n input: Vec2[] | Path[],\n preservePerimeter = true,\n): Group {\n const tris = asTriFaces(input)\n const edgeMap = buildEdgeMap(tris)\n const candidates: { key: string; a: Vec2; b: Vec2; i: number; j: number; q: number }[] =\n []\n for (const [key, e] of edgeMap) {\n if (e.faceIds.length !== 2) continue\n const [i, j] = e.faceIds\n const quad = mergeTriPair(tris[i!]!, tris[j!]!, e.a, e.b)\n if (!quad) continue\n candidates.push({\n key,\n a: e.a,\n b: e.b,\n i: i!,\n j: j!,\n q: quadQuality(quad),\n })\n }\n candidates.sort((x, y) => y.q - x.q)\n\n const used = new Set<number>()\n const out: Path[] = []\n for (const c of candidates) {\n if (used.has(c.i) || used.has(c.j)) continue\n const quad = mergeTriPair(tris[c.i]!, tris[c.j]!, c.a, c.b)\n if (!quad) continue\n out.push(quad)\n used.add(c.i)\n used.add(c.j)\n }\n for (let i = 0; i < tris.length; i++) {\n if (used.has(i)) continue\n if (preservePerimeter) out.push(tris[i]!)\n }\n return group(out)\n}\n\n/**\n * Matching quadrangulation: quality-weighted greedy matching of triangles\n * (Blossom-Quad first step; leftover triangles retained).\n */\nexport function matchingQuadrangulation(input: Vec2[] | Path[]): Group {\n return edgeCollapseQuadrangulation(input, true)\n}\n\nfunction mergeTriPair(\n t0: Path,\n t1: Path,\n ea: Vec2,\n eb: Vec2,\n): Path | null {\n const opp0 = oppositeVertex(t0, ea, eb)\n const opp1 = oppositeVertex(t1, ea, eb)\n if (!opp0 || !opp1) return null\n // Order: opp0 → ea → opp1 → eb (convex quad when possible)\n return polygon([opp0, ea, opp1, eb])\n}\n\nfunction oppositeVertex(t: Path, ea: Vec2, eb: Vec2): Vec2 | null {\n for (const v of ringOf(t)) {\n if (!same(v, ea) && !same(v, eb)) return v\n }\n return null\n}\n\nfunction quadQuality(q: Path): number {\n const r = ringOf(q)\n if (r.length < 4) return 0\n // Prefer near-square: maximize min edge / max edge and prefer angles near 90°.\n const lens: number[] = []\n for (let i = 0; i < 4; i++) {\n lens.push(dist(r[i]!, r[(i + 1) % 4]!))\n }\n const minL = Math.min(...lens)\n const maxL = Math.max(...lens)\n if (maxL < 1e-12) return 0\n return minL / maxL\n}\n\n/**\n * Spiral quadrangulation from a point set (characteristic spiral pattern).\n */\nexport function spiralQuadrangulation(points: Vec2[]): Group {\n if (points.length < 4) return group([])\n const pts = unique(points)\n const cx = pts.reduce((s, p) => s + p.x, 0) / pts.length\n const cy = pts.reduce((s, p) => s + p.y, 0) / pts.length\n\n // Sort by angle, then assign to radial rings by distance rank.\n const withMeta = pts.map((p) => ({\n p,\n ang: Math.atan2(p.y - cy, p.x - cx),\n rad: Math.hypot(p.x - cx, p.y - cy),\n }))\n withMeta.sort((a, b) => a.rad - b.rad || a.ang - b.ang)\n\n const ringCount = Math.max(2, Math.ceil(Math.sqrt(pts.length)))\n const rings: Vec2[][] = Array.from({ length: ringCount }, () => [])\n withMeta.forEach((item, i) => {\n const ri = Math.min(\n ringCount - 1,\n Math.floor((i / withMeta.length) * ringCount),\n )\n rings[ri]!.push(item.p)\n })\n for (const ring of rings) {\n ring.sort(\n (a, b) =>\n Math.atan2(a.y - cy, a.x - cx) - Math.atan2(b.y - cy, b.x - cx),\n )\n }\n\n const out: Path[] = []\n for (let r = 0; r < rings.length - 1; r++) {\n const inner = rings[r]!\n const outer = rings[r + 1]!\n if (inner.length === 0 || outer.length === 0) continue\n const n = Math.max(inner.length, outer.length)\n for (let i = 0; i < n; i++) {\n const a = inner[i % inner.length]!\n const b = inner[(i + 1) % inner.length]!\n const c = outer[(i + 1) % outer.length]!\n const d = outer[i % outer.length]!\n // Skip degenerate\n const verts = unique([a, b, c, d])\n if (verts.length >= 3) out.push(polygon(verts.length === 3 ? verts : [a, b, c, d]))\n }\n }\n return group(out)\n}\n\n// ---------------------------------------------------------------------------\n// Mesh process\n// ---------------------------------------------------------------------------\n\nfunction vertexNeighborhood(faces: Path[]): {\n positions: Map<string, Vec2>\n neighbors: Map<string, Set<string>>\n perimeter: Set<string>\n} {\n const edgeMap = buildEdgeMap(faces)\n const peri = perimeterKeys(edgeMap)\n const perimeter = new Set<string>()\n for (const key of peri) {\n const e = edgeMap.get(key)!\n perimeter.add(vertKey(e.a))\n perimeter.add(vertKey(e.b))\n }\n const positions = new Map<string, Vec2>()\n const neighbors = new Map<string, Set<string>>()\n const link = (a: Vec2, b: Vec2) => {\n const ka = vertKey(a)\n const kb = vertKey(b)\n positions.set(ka, { ...a })\n positions.set(kb, { ...b })\n if (!neighbors.has(ka)) neighbors.set(ka, new Set())\n if (!neighbors.has(kb)) neighbors.set(kb, new Set())\n neighbors.get(ka)!.add(kb)\n neighbors.get(kb)!.add(ka)\n }\n for (const e of edgeMap.values()) link(e.a, e.b)\n return { positions, neighbors, perimeter }\n}\n\nfunction remapFaces(\n faces: Path[],\n positions: Map<string, Vec2>,\n): Path[] {\n return faces.map((f) =>\n polygon(\n ringOf(f).map((v) => {\n const p = positions.get(vertKey(v))\n return p ? { ...p } : { ...v }\n }),\n f.rings.slice(1).map((r) =>\n r.map((v) => {\n const p = positions.get(vertKey(v))\n return p ? { ...p } : { ...v }\n }),\n ),\n ),\n )\n}\n\n/** Weighted Laplacian mesh smoothing. */\nexport function smoothMesh(\n faces: Path[],\n iterationsOrCutoff: number,\n preservePerimeter = true,\n): Group {\n if (faces.length === 0) return group([])\n let { positions, neighbors, perimeter } = vertexNeighborhood(faces)\n const maxIter =\n iterationsOrCutoff >= 1 && Number.isInteger(iterationsOrCutoff)\n ? iterationsOrCutoff\n : 200\n const cutoff =\n iterationsOrCutoff > 0 && iterationsOrCutoff < 1\n ? iterationsOrCutoff\n : 0\n\n for (let iter = 0; iter < maxIter; iter++) {\n const next = new Map<string, Vec2>()\n let maxDisp = 0\n for (const [k, p] of positions) {\n if (preservePerimeter && perimeter.has(k)) {\n next.set(k, p)\n continue\n }\n const nbrs = neighbors.get(k)\n if (!nbrs || nbrs.size === 0) {\n next.set(k, p)\n continue\n }\n let sx = 0\n let sy = 0\n for (const nk of nbrs) {\n const n = positions.get(nk)!\n sx += n.x\n sy += n.y\n }\n const np = { x: sx / nbrs.size, y: sy / nbrs.size }\n maxDisp = Math.max(maxDisp, dist(p, np))\n next.set(k, np)\n }\n positions = next\n if (cutoff > 0 && maxDisp < cutoff) break\n }\n return group(remapFaces(faces, positions))\n}\n\n/**\n * Catmull–Clark-style subdivision: split each edge at `edgeSplitRatio` and\n * connect to the face centroid (N subfaces per N-gon).\n */\nexport function subdivideMesh(\n faces: Path[],\n edgeSplitRatio = 0.5,\n): Group {\n const t = Math.min(1, Math.max(0, edgeSplitRatio))\n const out: Path[] = []\n for (const f of faces) {\n const ring = ringOf(f)\n if (ring.length < 3) continue\n const c = centroid(f)\n const n = ring.length\n const splits: Vec2[] = []\n for (let i = 0; i < n; i++) {\n const a = ring[i]!\n const b = ring[(i + 1) % n]!\n splits.push(lerp(a, b, t))\n }\n for (let i = 0; i < n; i++) {\n const v = ring[i]!\n const sPrev = splits[(i - 1 + n) % n]!\n const sNext = splits[i]!\n out.push(polygon([v, sNext, c, sPrev]))\n }\n }\n return group(out)\n}\n\n/**\n * Simplify face boundaries while preserving mesh topology (shared edges\n * simplified once, then faces rebuilt).\n */\nexport function simplifyMesh(\n faces: Path[],\n tolerance: number,\n preservePerimeter = true,\n): Group {\n if (tolerance <= 0 || faces.length === 0) return group(faces.map((f) => polygon(ringOf(f), f.rings.slice(1))))\n const edgeMap = buildEdgeMap(faces)\n const peri = perimeterKeys(edgeMap)\n\n // Simplify each unique edge as a 2-point segment is a no-op; for faces with\n // more than 3 verts, simplify the full ring then re-snap shared vertices.\n const simplified = faces.map((f) => {\n const ring = ringOf(f)\n if (ring.length <= 3) return polygon(ring)\n if (preservePerimeter) {\n // Only simplify interior-only vertices: use path simplify then restore peri verts.\n const s = simplifyPath(f, tolerance)\n const sr = ringOf(s)\n if (sr.length < 3) return polygon(ring)\n return polygon(sr, s.rings.slice(1))\n }\n return simplifyPath(f, tolerance)\n })\n\n // Snap nearly-coincident vertices across faces for topology\n const all = unique(simplified.flatMap((f) => ringOf(f)))\n const snapped = clusterSnap(all, Math.max(tolerance * 0.5, 1e-9))\n const remap = (v: Vec2): Vec2 => {\n let best = v\n let bestD = Infinity\n for (const s of snapped) {\n const d = dist(v, s)\n if (d < bestD) {\n bestD = d\n best = s\n }\n }\n return { ...best }\n }\n // Preserve perimeter vertices exactly when requested\n const periVerts = new Set<string>()\n if (preservePerimeter) {\n for (const key of peri) {\n const e = edgeMap.get(key)!\n periVerts.add(vertKey(e.a))\n periVerts.add(vertKey(e.b))\n }\n }\n\n return group(\n simplified.map((f, i) => {\n const original = ringOf(faces[i]!)\n const ring = ringOf(f).map((v, vi) => {\n if (preservePerimeter && original[vi] && periVerts.has(vertKey(original[vi]!))) {\n return { ...original[vi]! }\n }\n // also check if v matches a peri vert\n for (const ov of original) {\n if (periVerts.has(vertKey(ov)) && dist(v, ov) < tolerance * 2) {\n return { ...ov }\n }\n }\n return remap(v)\n })\n return polygon(unique(ring).length >= 3 ? ring : original)\n }),\n )\n}\n\nfunction clusterSnap(points: Vec2[], tol: number): Vec2[] {\n const clusters: Vec2[][] = []\n for (const p of points) {\n let found = false\n for (const c of clusters) {\n if (dist(p, c[0]!) <= tol) {\n c.push(p)\n found = true\n break\n }\n }\n if (!found) clusters.push([p])\n }\n return clusters.map((c) => ({\n x: c.reduce((s, p) => s + p.x, 0) / c.length,\n y: c.reduce((s, p) => s + p.y, 0) / c.length,\n }))\n}\n\n/** Randomly dissolve adjacent faces that share a class id. */\nexport function stochasticMerge(\n faces: Path[],\n nClasses: number,\n seed = 1,\n): Group {\n if (faces.length === 0) return group([])\n const classes = Math.max(1, Math.floor(nClasses))\n const rng = mulberry32(seed >>> 0)\n const label = faces.map(() => Math.floor(rng() * classes))\n const adj = faceAdjacency(faces)\n const parent = faces.map((_, i) => i)\n const find = (i: number): number => {\n let x = i\n while (parent[x] !== x) {\n parent[x] = parent[parent[x]!]!\n x = parent[x]!\n }\n return x\n }\n const unite = (a: number, b: number) => {\n const ra = find(a)\n const rb = find(b)\n if (ra !== rb) parent[rb] = ra\n }\n for (let i = 0; i < faces.length; i++) {\n for (const j of adj[i]!) {\n if (j > i && label[i] === label[j]) unite(i, j)\n }\n }\n const comps = new Map<number, number[]>()\n for (let i = 0; i < faces.length; i++) {\n const r = find(i)\n const list = comps.get(r) ?? []\n list.push(i)\n comps.set(r, list)\n }\n const out: Path[] = []\n for (const members of comps.values()) {\n if (members.length === 1) {\n out.push(faces[members[0]!]!)\n continue\n }\n const merged = dissolveFaces(members.map((i) => faces[i]!))\n out.push(...merged)\n }\n return group(out)\n}\n\nfunction dissolveFaces(faces: Path[]): Path[] {\n if (faces.length === 0) return []\n if (faces.length === 1) return [faces[0]!]\n try {\n let acc = faces[0]!\n for (let i = 1; i < faces.length; i++) {\n const u = union(acc, faces[i]!)\n if (u.paths.length === 0) continue\n // Prefer largest piece if union fragments\n acc = u.paths.reduce((best, p) =>\n area(p) > area(best) ? p : best,\n )\n }\n return [acc]\n } catch {\n // Fallback: convex hull of vertices\n return [convexHullOf(faces.flatMap((f) => ringOf(f)))]\n }\n}\n\n/**\n * Merge faces below `minArea` into adjacent neighbors, or merge until at most\n * `remainingFaces` remain when options use `{ remainingFaces }`.\n */\nexport function areaMerge(\n faces: Path[],\n minAreaOrOptions: number | { minArea?: number; remainingFaces?: number },\n): Group {\n let working = [...faces]\n if (working.length === 0) return group([])\n\n if (typeof minAreaOrOptions === 'object' && minAreaOrOptions.remainingFaces != null) {\n const target = Math.max(1, Math.floor(minAreaOrOptions.remainingFaces))\n while (working.length > target) {\n const next = mergeSmallestAdjacent(working)\n if (next.length >= working.length) break\n working = next\n }\n return group(working)\n }\n\n const minArea =\n typeof minAreaOrOptions === 'number'\n ? minAreaOrOptions\n : (minAreaOrOptions.minArea ?? 0)\n\n let guard = 0\n while (guard++ < working.length + 10) {\n const smallIdx = working.findIndex((f) => area(f) < minArea)\n if (smallIdx < 0) break\n const next = mergeFaceIntoNeighbor(working, smallIdx)\n if (!next) break\n working = next\n }\n return group(working)\n}\n\nfunction mergeSmallestAdjacent(faces: Path[]): Path[] {\n let best = -1\n let bestA = Infinity\n for (let i = 0; i < faces.length; i++) {\n const a = area(faces[i]!)\n if (a < bestA) {\n bestA = a\n best = i\n }\n }\n if (best < 0) return faces\n return mergeFaceIntoNeighbor(faces, best) ?? faces\n}\n\nfunction mergeFaceIntoNeighbor(\n faces: Path[],\n idx: number,\n): Path[] | null {\n const adj = faceAdjacency(faces)\n const nbrs = adj[idx] ?? []\n if (nbrs.length === 0) {\n // No adjacency — drop tiny island or keep\n return faces.filter((_, i) => i !== idx)\n }\n // Prefer largest neighbor\n let bestN = nbrs[0]!\n let bestA = -1\n for (const n of nbrs) {\n const a = area(faces[n]!)\n if (a > bestA) {\n bestA = a\n bestN = n\n }\n }\n const merged = dissolveFaces([faces[idx]!, faces[bestN]!])\n const out: Path[] = []\n for (let i = 0; i < faces.length; i++) {\n if (i === idx || i === bestN) continue\n out.push(faces[i]!)\n }\n out.push(...merged)\n return out\n}\n\nfunction convexHullOf(points: Vec2[]): Path {\n const pts = unique(points)\n if (pts.length < 3) return polygon(pts)\n pts.sort((a, b) => (a.x === b.x ? a.y - b.y : a.x - b.x))\n const lower: Vec2[] = []\n for (const p of pts) {\n while (\n lower.length >= 2 &&\n cross(lower[lower.length - 2]!, lower[lower.length - 1]!, p) <= 0\n ) {\n lower.pop()\n }\n lower.push(p)\n }\n const upper: Vec2[] = []\n for (let i = pts.length - 1; i >= 0; i--) {\n const p = pts[i]!\n while (\n upper.length >= 2 &&\n cross(upper[upper.length - 2]!, upper[upper.length - 1]!, p) <= 0\n ) {\n upper.pop()\n }\n upper.push(p)\n }\n lower.pop()\n upper.pop()\n return polygon([...lower, ...upper])\n}\n\nfunction mulberry32(a: number): () => number {\n return () => {\n a |= 0\n a = (a + 0x6d2b79f5) | 0\n let t = Math.imul(a ^ (a >>> 15), 1 | a)\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\n// ---------------------------------------------------------------------------\n// Repair\n// ---------------------------------------------------------------------------\n\n/**\n * Locate near-miss gaps between faces that should form a valid mesh\n * (boundary segments without a matching twin within a tiny tolerance).\n */\nexport function findBreaks(faces: Path[]): Group {\n const edgeMap = buildEdgeMap(faces)\n const segs: Path[] = []\n // Soft-match: perimeter edges that have a near-parallel nearby perimeter edge\n const peri: EdgeRec[] = []\n for (const e of edgeMap.values()) {\n if (e.faceIds.length === 1) peri.push(e)\n }\n const used = new Set<number>()\n for (let i = 0; i < peri.length; i++) {\n if (used.has(i)) continue\n const a = peri[i]!\n for (let j = i + 1; j < peri.length; j++) {\n if (used.has(j)) continue\n const b = peri[j]!\n if (nearDuplicateEdge(a, b, 1e-3)) {\n segs.push(polyline([a.a, a.b]))\n segs.push(polyline([b.a, b.b]))\n used.add(i)\n used.add(j)\n break\n }\n }\n }\n return group(segs)\n}\n\nfunction nearDuplicateEdge(a: EdgeRec, b: EdgeRec, tol: number): boolean {\n const d1 = dist(a.a, b.a) + dist(a.b, b.b)\n const d2 = dist(a.a, b.b) + dist(a.b, b.a)\n const len = dist(a.a, a.b)\n return Math.min(d1, d2) < tol * 2 + len * 0.05 && Math.min(d1, d2) > 1e-9\n}\n\n/**\n * Clean inter-face gaps/overlaps/slivers toward a valid coverage by snapping\n * vertices within `maxGapWidth` and dissolving overlaps.\n */\nexport function fixBreaks(faces: Path[], maxGapWidth: number): Group {\n if (faces.length === 0) return group([])\n const tol = Math.max(maxGapWidth, 1e-9)\n const verts = unique(faces.flatMap((f) => ringOf(f)))\n const snapped = clusterSnap(verts, tol)\n const remap = (v: Vec2): Vec2 => {\n let best = snapped[0]!\n let bestD = Infinity\n for (const s of snapped) {\n const d = dist(v, s)\n if (d < bestD) {\n bestD = d\n best = s\n }\n }\n return { ...best }\n }\n const fixed = faces.map((f) => {\n const ring = unique(ringOf(f).map(remap))\n return ring.length >= 3 ? polygon(ring) : f\n })\n // Dissolve overlaps via pairwise union of intersecting faces\n try {\n return group(dissolveOverlaps(fixed))\n } catch {\n return group(fixed)\n }\n}\n\nfunction dissolveOverlaps(faces: Path[]): Path[] {\n // Simple O(n²): if two faces overlap significantly, union them\n let working = [...faces]\n let changed = true\n let guard = 0\n while (changed && guard++ < working.length) {\n changed = false\n outer: for (let i = 0; i < working.length; i++) {\n for (let j = i + 1; j < working.length; j++) {\n const a = working[i]!\n const b = working[j]!\n const u = union(a, b)\n const ua = u.paths.reduce((s, p) => s + area(p), 0)\n if (ua < area(a) + area(b) - 1e-6) {\n // overlap — replace with union pieces\n const next = working.filter((_, k) => k !== i && k !== j)\n next.push(...u.paths)\n working = next\n changed = true\n break outer\n }\n }\n }\n }\n return working\n}\n\n/**\n * Endpoint-only snap within `tolerance`, then optionally polygonize linework\n * into faces.\n */\nexport function fixBrokenFaces(\n coverage: Path[],\n tolerance: number,\n polygonise = true,\n): Group {\n const tol = Math.max(tolerance, 1e-9)\n // Collect endpoints of open paths + all polygon verts as anchors\n const anchors: Vec2[] = []\n const endpoints: { pathIdx: number; end: 0 | 1; v: Vec2 }[] = []\n\n coverage.forEach((p, pi) => {\n const ring = ringOf(p)\n if (ring.length === 0) return\n if (p.closed) {\n for (const v of ring) anchors.push(v)\n } else {\n endpoints.push({ pathIdx: pi, end: 0, v: ring[0]! })\n endpoints.push({\n pathIdx: pi,\n end: 1,\n v: ring[ring.length - 1]!,\n })\n }\n })\n\n const snapTargets = clusterSnap(\n [...anchors, ...endpoints.map((e) => e.v)],\n tol,\n )\n\n const snapTo = (v: Vec2, preferAnchor: boolean): Vec2 => {\n // Prefer anchors if in cluster\n let best = v\n let bestD = Infinity\n for (const s of snapTargets) {\n const d = dist(v, s)\n if (d <= tol && d < bestD) {\n bestD = d\n best = s\n }\n }\n if (preferAnchor) {\n for (const a of anchors) {\n if (dist(v, a) <= tol) return { ...a }\n }\n }\n return { ...best }\n }\n\n const snappedPaths = coverage.map((p) => {\n const ring = ringOf(p)\n if (ring.length === 0) return p\n if (p.closed) return p\n const next = ring.map((v) => ({ ...v }))\n next[0] = snapTo(ring[0]!, true)\n next[next.length - 1] = snapTo(ring[ring.length - 1]!, true)\n return polyline(next)\n })\n\n if (!polygonise) return group(snappedPaths)\n\n // Closed rings stay; try to close open paths whose ends meet\n const out: Path[] = []\n for (const p of snappedPaths) {\n const ring = ringOf(p)\n if (p.closed) {\n out.push(p)\n continue\n }\n if (ring.length >= 3 && same(ring[0]!, ring[ring.length - 1]!, tol * 2)) {\n out.push(polygon(ring.slice(0, -1)))\n } else if (ring.length >= 3 && dist(ring[0]!, ring[ring.length - 1]!) <= tol * 2) {\n out.push(polygon(ring))\n } else {\n out.push(p)\n }\n }\n return group(out)\n}\n\n/** Disconnected face islands sorted by face count descending. */\nexport function findIslands(faces: Path[]): Group[] {\n if (faces.length === 0) return []\n const adj = faceAdjacency(faces)\n const seen = new Set<number>()\n const islands: number[][] = []\n for (let i = 0; i < faces.length; i++) {\n if (seen.has(i)) continue\n const stack = [i]\n const members: number[] = []\n seen.add(i)\n while (stack.length) {\n const cur = stack.pop()!\n members.push(cur)\n for (const n of adj[cur]!) {\n if (!seen.has(n)) {\n seen.add(n)\n stack.push(n)\n }\n }\n }\n islands.push(members)\n }\n islands.sort((a, b) => b.length - a.length)\n return islands.map((m) => group(m.map((i) => faces[i]!)))\n}\n\n// ---------------------------------------------------------------------------\n// Sort helpers\n// ---------------------------------------------------------------------------\n\n/** Sort faces by centroid angle around their collective centroid. */\nexport function radialSortFaces(faces: Path[]): Path[] {\n if (faces.length === 0) return []\n const cs = faces.map((f) => centroid(f))\n const cx = cs.reduce((s, p) => s + p.x, 0) / cs.length\n const cy = cs.reduce((s, p) => s + p.y, 0) / cs.length\n return faces\n .map((f, i) => ({ f, a: Math.atan2(cs[i]!.y - cy, cs[i]!.x - cx) }))\n .sort((a, b) => a.a - b.a)\n .map((x) => x.f)\n}\n\n/** Sort faces by centroid x then y. */\nexport function centroidSortFaces(faces: Path[]): Path[] {\n return [...faces].sort((a, b) => {\n const ca = centroid(a)\n const cb = centroid(b)\n return ca.x === cb.x ? ca.y - cb.y : ca.x - cb.x\n })\n}\n\nexport const meshing = {\n extractInnerEdges,\n extractInnerVertices,\n findContainingFace,\n splitEdges,\n urquhartFaces,\n gabrielFaces,\n relativeNeighborFaces,\n spannerFaces,\n dualFaces,\n centroidQuadrangulation,\n edgeCollapseQuadrangulation,\n splitQuadrangulation,\n spiralQuadrangulation,\n matchingQuadrangulation,\n smoothMesh,\n subdivideMesh,\n simplifyMesh,\n stochasticMerge,\n areaMerge,\n radialSortFaces,\n centroidSortFaces,\n findBreaks,\n fixBreaks,\n fixBrokenFaces,\n findIslands,\n}\n"]}