@faicad/faijs 0.18.2 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +4 -1
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/brep-mirror/joinery-brep.d.ts +1 -1
- package/dist/api/brep-mirror/joinery-brep.d.ts.map +1 -1
- package/dist/api/brep-mirror/joinery-brep.js +19 -19
- package/dist/api/brep-mirror/joinery-brep.js.map +1 -1
- package/dist/api/index.d.ts +4 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +3 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/profile.d.ts.map +1 -1
- package/dist/api/profile.js +113 -182
- package/dist/api/profile.js.map +1 -1
- package/dist/api/punch-hole.d.ts +74 -0
- package/dist/api/punch-hole.d.ts.map +1 -0
- package/dist/api/punch-hole.js +207 -0
- package/dist/api/punch-hole.js.map +1 -0
- package/dist/api/sketch-on-face.d.ts +85 -0
- package/dist/api/sketch-on-face.d.ts.map +1 -0
- package/dist/api/sketch-on-face.js +136 -0
- package/dist/api/sketch-on-face.js.map +1 -0
- package/dist/api/sketch-on-plane.d.ts +81 -0
- package/dist/api/sketch-on-plane.d.ts.map +1 -0
- package/dist/api/sketch-on-plane.js +103 -0
- package/dist/api/sketch-on-plane.js.map +1 -0
- package/dist/boolean/csg-backend.d.ts +6 -6
- package/dist/boolean/csg-backend.d.ts.map +1 -1
- package/dist/boolean/csg-backend.js +9 -9
- package/dist/boolean/csg-backend.js.map +1 -1
- package/dist/boolean/csg-core.d.ts +10 -10
- package/dist/boolean/csg-core.d.ts.map +1 -1
- package/dist/boolean/csg-core.js +24 -24
- package/dist/boolean/csg-core.js.map +1 -1
- package/dist/boolean/extrude-helpers.d.ts +8 -8
- package/dist/boolean/extrude-helpers.d.ts.map +1 -1
- package/dist/boolean/extrude-helpers.js +13 -13
- package/dist/boolean/extrude-helpers.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +20 -6
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +38 -12
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/browser-host/csg-worker-protocol.d.ts +3 -3
- package/dist/browser-host/csg-worker-protocol.d.ts.map +1 -1
- package/dist/browser-host/csg-worker-protocol.js.map +1 -1
- package/dist/browser-host/csg-worker.js +3 -3
- package/dist/browser-host/csg-worker.js.map +1 -1
- package/dist/browser-host/inline-csg-backend.d.ts +3 -3
- package/dist/browser-host/inline-csg-backend.d.ts.map +1 -1
- package/dist/browser-host/inline-csg-backend.js +3 -3
- package/dist/browser-host/inline-csg-backend.js.map +1 -1
- package/dist/browser-host/worker-csg-backend.d.ts +3 -3
- package/dist/browser-host/worker-csg-backend.d.ts.map +1 -1
- package/dist/browser-host/worker-csg-backend.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +3 -3
- package/dist/cad-runtime/ports.d.ts.map +1 -1
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/geometry2d/adapt.d.ts +46 -0
- package/dist/geometry2d/adapt.d.ts.map +1 -0
- package/dist/geometry2d/adapt.js +41 -0
- package/dist/geometry2d/adapt.js.map +1 -0
- package/dist/geometry2d/bbox2d.d.ts +82 -0
- package/dist/geometry2d/bbox2d.d.ts.map +1 -0
- package/dist/geometry2d/bbox2d.js +123 -0
- package/dist/geometry2d/bbox2d.js.map +1 -0
- package/dist/geometry2d/blueprint-sketcher.d.ts +27 -0
- package/dist/geometry2d/blueprint-sketcher.d.ts.map +1 -0
- package/dist/geometry2d/blueprint-sketcher.js +29 -0
- package/dist/geometry2d/blueprint-sketcher.js.map +1 -0
- package/dist/geometry2d/blueprint.d.ts +102 -0
- package/dist/geometry2d/blueprint.d.ts.map +1 -0
- package/dist/geometry2d/blueprint.js +225 -0
- package/dist/geometry2d/blueprint.js.map +1 -0
- package/dist/geometry2d/blueprints.d.ts +58 -0
- package/dist/geometry2d/blueprints.d.ts.map +1 -0
- package/dist/geometry2d/blueprints.js +72 -0
- package/dist/geometry2d/blueprints.js.map +1 -0
- package/dist/geometry2d/bridge/lift-on-plane.d.ts +50 -0
- package/dist/geometry2d/bridge/lift-on-plane.d.ts.map +1 -0
- package/dist/geometry2d/bridge/lift-on-plane.js +72 -0
- package/dist/geometry2d/bridge/lift-on-plane.js.map +1 -0
- package/dist/geometry2d/bridge/on-surface.d.ts +98 -0
- package/dist/geometry2d/bridge/on-surface.d.ts.map +1 -0
- package/dist/geometry2d/bridge/on-surface.js +94 -0
- package/dist/geometry2d/bridge/on-surface.js.map +1 -0
- package/dist/geometry2d/bridge/plane.d.ts +69 -0
- package/dist/geometry2d/bridge/plane.d.ts.map +1 -0
- package/dist/geometry2d/bridge/plane.js +96 -0
- package/dist/geometry2d/bridge/plane.js.map +1 -0
- package/dist/geometry2d/canned-blueprints.d.ts +44 -0
- package/dist/geometry2d/canned-blueprints.d.ts.map +1 -0
- package/dist/geometry2d/canned-blueprints.js +94 -0
- package/dist/geometry2d/canned-blueprints.js.map +1 -0
- package/dist/geometry2d/compound-blueprint.d.ts +72 -0
- package/dist/geometry2d/compound-blueprint.d.ts.map +1 -0
- package/dist/geometry2d/compound-blueprint.js +95 -0
- package/dist/geometry2d/compound-blueprint.js.map +1 -0
- package/dist/geometry2d/curve2d.d.ts +298 -0
- package/dist/geometry2d/curve2d.d.ts.map +1 -0
- package/dist/geometry2d/curve2d.js +1110 -0
- package/dist/geometry2d/curve2d.js.map +1 -0
- package/dist/geometry2d/index.d.ts +22 -0
- package/dist/geometry2d/index.d.ts.map +1 -0
- package/dist/geometry2d/index.js +21 -0
- package/dist/geometry2d/index.js.map +1 -0
- package/dist/geometry2d/organise.d.ts +28 -0
- package/dist/geometry2d/organise.d.ts.map +1 -0
- package/dist/geometry2d/organise.js +108 -0
- package/dist/geometry2d/organise.js.map +1 -0
- package/dist/geometry2d/pen-sketcher.d.ts +340 -0
- package/dist/geometry2d/pen-sketcher.d.ts.map +1 -0
- package/dist/geometry2d/pen-sketcher.js +477 -0
- package/dist/geometry2d/pen-sketcher.js.map +1 -0
- package/dist/geometry2d/point.d.ts +44 -0
- package/dist/geometry2d/point.d.ts.map +1 -0
- package/dist/geometry2d/point.js +57 -0
- package/dist/geometry2d/point.js.map +1 -0
- package/dist/geometry2d/svg-ellipse.d.ts +74 -0
- package/dist/geometry2d/svg-ellipse.d.ts.map +1 -0
- package/dist/geometry2d/svg-ellipse.js +163 -0
- package/dist/geometry2d/svg-ellipse.js.map +1 -0
- package/dist/lang/symbol-table.generated.d.ts +3 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +3 -0
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/mesh/types.d.ts +1 -1
- package/dist/mesh/types.d.ts.map +1 -1
- package/dist/mesh/types.js.map +1 -1
- package/package.json +9 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curve2d.js","sourceRoot":"","sources":["../../src/geometry2d/curve2d.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure-TypeScript 2D analytic curve model (faijs port of brepjs).\n *\n * Adapted from brepjs `src/kernel/geometry2d.ts` (Apache-2.0), preserving core\n * algorithms and naming. Differences from brepjs:\n * - discriminant field renamed `__bk2d` → `kind2d` (2026-09-27 decision),\n * bbox discriminant `__bk2d_bbox` → `kind2d_b`.\n * - All curves are plain data objects (no kernel handles, no dispose), per the\n * faijs \"2D curves are pure objects\" design (docs/plans/2d-sketching: A1/B1).\n *\n * Pure TS, zero WASM, zero external deps. All 2D curves represented as plain\n * objects with a `kind2d` discriminant.\n *\n * License: adapted from brepjs (Apache-2.0). Retained per faijs convention for\n * brepjs-ported files (cf. svg-to-solid.ts).\n *\n * @module\n */\n// ---------------------------------------------------------------------------\n// Evaluation\n// ---------------------------------------------------------------------------\n\n/** Line: origin + unit direction + length. */\nexport interface Line2d {\n readonly kind2d: 'line'\n readonly ox: number\n readonly oy: number\n readonly dx: number\n readonly dy: number\n readonly len: number\n}\n/** Full circle. sense=true → CCW. */\nexport interface Circle2d {\n readonly kind2d: 'circle'\n readonly cx: number\n readonly cy: number\n readonly radius: number\n readonly sense: boolean\n}\n/** Ellipse (or arc of one, via trim). */\nexport interface Ellipse2d {\n readonly kind2d: 'ellipse'\n readonly cx: number\n readonly cy: number\n readonly majorRadius: number\n readonly minorRadius: number\n readonly xDirAngle: number\n readonly sense: boolean\n}\n/** Bezier curve (De Casteljau). */\nexport interface Bezier2d {\n readonly kind2d: 'bezier'\n readonly poles: [number, number][]\n}\n/** B-spline (De Boor). */\nexport interface BSpline2d {\n readonly kind2d: 'bspline'\n readonly poles: [number, number][]\n readonly knots: number[]\n readonly multiplicities: number[]\n readonly degree: number\n readonly isPeriodic: boolean\n}\n/** Trimmed wrapper over another curve. */\nexport interface TrimmedCurve2d {\n readonly kind2d: 'trimmed'\n readonly basis: Curve2dObj\n readonly tStart: number\n readonly tEnd: number\n}\n/**\n * A 2D curve expressed as one of the supported analytic or spline kinds.\n * Discriminated by the `kind2d` field.\n */\nexport type Curve2dObj = Line2d | Circle2d | Ellipse2d | Bezier2d | BSpline2d | TrimmedCurve2d\n\n/**\n * Mutable 2D bounding box carried by the curve-specific bbox helpers.\n * `kind2d_b` marks the discriminant used to detect this box type.\n */\nexport interface CurveBBox2d {\n readonly kind2d_b: true\n xMin: number\n yMin: number\n xMax: number\n yMax: number\n}\n\n/**\n * Evaluate a curve at parameter t to a 2D point.\n * @param c - the curve to evaluate.\n * @param t - the parameter value within the curve's domain.\n * @returns the 2D point `[x, y]` on the curve.\n */\nexport function evaluateCurve2d(c: Curve2dObj, t: number): [number, number] {\n switch (c.kind2d) {\n case 'line':\n return [c.ox + c.dx * t, c.oy + c.dy * t]\n case 'circle': {\n const angle = c.sense ? t : -t\n return [c.cx + c.radius * Math.cos(angle), c.cy + c.radius * Math.sin(angle)]\n }\n case 'ellipse': {\n const angle = c.sense ? t : -t\n const cos = Math.cos(c.xDirAngle)\n const sin = Math.sin(c.xDirAngle)\n const x = c.majorRadius * Math.cos(angle)\n const y = c.minorRadius * Math.sin(angle)\n return [c.cx + x * cos - y * sin, c.cy + x * sin + y * cos]\n }\n case 'bezier':\n return evaluateBezier(c.poles, t)\n case 'bspline':\n return evaluateBSpline2d(c, t)\n case 'trimmed': {\n const mapped = c.tStart + t * (c.tEnd - c.tStart)\n return evaluateCurve2d(c.basis, mapped)\n }\n }\n}\n\n/**\n * Tangent (non-normalized direction derivative) at parameter t.\n * @param c - the curve to differentiate.\n * @param t - the parameter value within the curve's domain.\n * @returns the unnormalized tangent vector `[dx, dy]` at `t`.\n */\nexport function tangentCurve2d(c: Curve2dObj, t: number): [number, number] {\n switch (c.kind2d) {\n case 'line':\n return [c.dx, c.dy]\n case 'circle': {\n const angle = c.sense ? t : -t\n const sign = c.sense ? 1 : -1\n return [-c.radius * Math.sin(angle) * sign, c.radius * Math.cos(angle) * sign]\n }\n case 'ellipse': {\n const angle = c.sense ? t : -t\n const sign = c.sense ? 1 : -1\n const cos = Math.cos(c.xDirAngle)\n const sin = Math.sin(c.xDirAngle)\n const dx = -c.majorRadius * Math.sin(angle) * sign\n const dy = c.minorRadius * Math.cos(angle) * sign\n return [dx * cos - dy * sin, dx * sin + dy * cos]\n }\n case 'bezier': {\n // Numerical differentiation\n const h = 1e-8\n const p0 = evaluateBezier(c.poles, Math.max(0, t - h))\n const p1 = evaluateBezier(c.poles, Math.min(1, t + h))\n const dt = Math.min(1, t + h) - Math.max(0, t - h)\n return [(p1[0] - p0[0]) / dt, (p1[1] - p0[1]) / dt]\n }\n case 'bspline': {\n const h = 1e-8\n const kFirst = c.knots[0]!\n const kLast = c.knots[c.knots.length - 1]!\n const p0 = evaluateBSpline2d(c, Math.max(kFirst, t - h))\n const p1 = evaluateBSpline2d(c, Math.min(kLast, t + h))\n const dt = Math.min(kLast, t + h) - Math.max(kFirst, t - h)\n return [(p1[0] - p0[0]) / dt, (p1[1] - p0[1]) / dt]\n }\n case 'trimmed': {\n const mapped = c.tStart + t * (c.tEnd - c.tStart)\n const tan = tangentCurve2d(c.basis, mapped)\n const scale = c.tEnd - c.tStart\n return [tan[0] * scale, tan[1] * scale]\n }\n }\n}\n\n/**\n * Parameter domain of a curve.\n * @param c - the curve whose domain to read.\n * @returns the inclusive `first` and `last` parameter bounds.\n */\nexport function curveBounds(c: Curve2dObj): { first: number; last: number } {\n switch (c.kind2d) {\n case 'line':\n return { first: 0, last: c.len }\n case 'circle':\n case 'ellipse':\n return { first: 0, last: 2 * Math.PI }\n case 'bezier':\n return { first: 0, last: 1 }\n case 'bspline':\n return { first: c.knots[0]!, last: c.knots[c.knots.length - 1]! }\n case 'trimmed':\n return { first: 0, last: 1 }\n }\n}\n\n/**\n * OCCT-style type name of a curve.\n * @param c - the curve to name.\n * @returns the uppercase OCCT type name such as `LINE`, `CIRCLE` or `BSPLINE_CURVE`.\n */\nexport function curveTypeName(c: Curve2dObj): string {\n switch (c.kind2d) {\n case 'line':\n return 'LINE'\n case 'circle':\n return 'CIRCLE'\n case 'ellipse':\n return 'ELLIPSE'\n case 'bezier':\n return 'BEZIER_CURVE'\n case 'bspline':\n return 'BSPLINE_CURVE'\n case 'trimmed':\n return 'TRIMMED_' + curveTypeName(c.basis)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Construction helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Line segment from (x1,y1) to (x2,y2).\n * @param x1 - the x coordinate of the start point.\n * @param y1 - the y coordinate of the start point.\n * @param x2 - the x coordinate of the end point.\n * @param y2 - the y coordinate of the end point.\n * @returns a Line2d describing the segment.\n */\nexport function makeLine2d(x1: number, y1: number, x2: number, y2: number): Line2d {\n const dx = x2 - x1\n const dy = y2 - y1\n const len = Math.sqrt(dx * dx + dy * dy)\n return {\n kind2d: 'line',\n ox: x1,\n oy: y1,\n dx: len > 0 ? dx / len : 1,\n dy: len > 0 ? dy / len : 0,\n len,\n }\n}\n\n/**\n * Full circle with the given center, radius and winding sense.\n * @param cx - the x coordinate of the center.\n * @param cy - the y coordinate of the center.\n * @param radius - the circle radius.\n * @param sense - true for counter-clockwise winding (default true).\n * @returns a Circle2d.\n */\nexport function makeCircle2d(cx: number, cy: number, radius: number, sense: boolean = true): Circle2d {\n return { kind2d: 'circle', cx, cy, radius, sense }\n}\n\n/**\n * Arc through three points; returns a trimmed circle, or a line if collinear.\n * @param x1 - the x coordinate of the start point.\n * @param y1 - the y coordinate of the start point.\n * @param xm - the x coordinate of the mid point.\n * @param ym - the y coordinate of the mid point.\n * @param x2 - the x coordinate of the end point.\n * @param y2 - the y coordinate of the end point.\n * @returns a Curve2dObj: a trimmed arc circle, or a straight line when the points are collinear.\n */\nexport function makeArc2dThreePoints(\n x1: number,\n y1: number,\n xm: number,\n ym: number,\n x2: number,\n y2: number,\n): Curve2dObj {\n // Circumscribed circle through 3 points\n const d = 2 * (x1 * (ym - y2) + xm * (y2 - y1) + x2 * (y1 - ym))\n if (Math.abs(d) < 1e-12) {\n // Degenerate (collinear): return a line\n return makeLine2d(x1, y1, x2, y2)\n }\n const cx =\n ((x1 * x1 + y1 * y1) * (ym - y2) +\n (xm * xm + ym * ym) * (y2 - y1) +\n (x2 * x2 + y2 * y2) * (y1 - ym)) /\n d\n const cy =\n ((x1 * x1 + y1 * y1) * (x2 - xm) +\n (xm * xm + ym * ym) * (x1 - x2) +\n (x2 * x2 + y2 * y2) * (xm - x1)) /\n d\n const radius = Math.sqrt((x1 - cx) ** 2 + (y1 - cy) ** 2)\n // Compute angles for start (p1), mid (pm), and end (p2)\n const a1 = Math.atan2(y1 - cy, x1 - cx)\n const am = Math.atan2(ym - cy, xm - cx)\n const a2 = Math.atan2(y2 - cy, x2 - cx)\n // Determine sense: CCW if mid-point angle is between start and end going CCW\n let da1m = am - a1\n if (da1m < 0) da1m += 2 * Math.PI\n let da12 = a2 - a1\n if (da12 < 0) da12 += 2 * Math.PI\n const sense = da1m < da12 // CCW if midpoint comes before endpoint\n const circle = makeCircle2d(cx, cy, radius, sense)\n if (!sense) {\n // CW circle evaluates angle = -t, so parameter t = -angle.\n const tStart = -a1\n let tEnd = -a2\n if (tEnd < tStart - 1e-9) tEnd += 2 * Math.PI\n return { kind2d: 'trimmed', basis: circle, tStart, tEnd }\n }\n // CCW: ensure tEnd >= tStart\n let tEnd = a2\n if (tEnd < a1 - 1e-9) tEnd += 2 * Math.PI\n return { kind2d: 'trimmed', basis: circle, tStart: a1, tEnd }\n}\n\n/**\n * Arc from a start point through a given tangent direction to an end point.\n * @param sx - the x coordinate of the start point.\n * @param sy - the y coordinate of the start point.\n * @param tx - the x component of the tangent direction at the start.\n * @param ty - the y component of the tangent direction at the start.\n * @param ex - the x coordinate of the end point.\n * @param ey - the y coordinate of the end point.\n * @returns a Curve2dObj: a trimmed circle arc, or a line when degenerate.\n */\nexport function makeArc2dTangent(\n sx: number,\n sy: number,\n tx: number,\n ty: number,\n ex: number,\n ey: number,\n): Curve2dObj {\n const len = Math.sqrt(tx * tx + ty * ty)\n const ntx = len > 0 ? tx / len : 0\n const nty = len > 0 ? ty / len : 0\n const dx = sx - ex\n const dy = sy - ey\n const denom = 2 * (dy * ntx - dx * nty)\n if (Math.abs(denom) < 1e-12) {\n return makeLine2d(sx, sy, ex, ey)\n }\n const chord2 = dx * dx + dy * dy\n const t = -chord2 / denom\n const cx = sx - t * nty\n const cy = sy + t * ntx\n const radius = Math.abs(t)\n const a1 = Math.atan2(sy - cy, sx - cx)\n const a2 = Math.atan2(ey - cy, ex - cx)\n const ccwTanX = -(sy - cy) / radius\n const ccwTanY = (sx - cx) / radius\n const dotCcw = ntx * ccwTanX + nty * ccwTanY\n let aMid\n if (dotCcw > 0) {\n let da = a2 - a1\n if (da <= 0) da += 2 * Math.PI\n aMid = a1 + da / 2\n } else {\n let da = a2 - a1\n if (da >= 0) da -= 2 * Math.PI\n aMid = a1 + da / 2\n }\n const mx = cx + radius * Math.cos(aMid)\n const my = cy + radius * Math.sin(aMid)\n return makeArc2dThreePoints(sx, sy, mx, my, ex, ey)\n}\n\n/**\n * Ellipse with the given center, radii, major-axis direction and sense.\n * @param cx - the x coordinate of the center.\n * @param cy - the y coordinate of the center.\n * @param majorRadius - the semi-major radius.\n * @param minorRadius - the semi-minor radius.\n * @param xDirX - the x component of the major-axis direction (default 1).\n * @param xDirY - the y component of the major-axis direction (default 0).\n * @param sense - true for counter-clockwise winding (default true).\n * @returns an Ellipse2d.\n */\nexport function makeEllipse2d(\n cx: number,\n cy: number,\n majorRadius: number,\n minorRadius: number,\n xDirX: number = 1,\n xDirY: number = 0,\n sense: boolean = true,\n): Ellipse2d {\n return {\n kind2d: 'ellipse',\n cx,\n cy,\n majorRadius,\n minorRadius,\n xDirAngle: Math.atan2(xDirY, xDirX),\n sense,\n }\n}\n\n/**\n * Bezier curve from control poles.\n * @param poles - the ordered control points `[x, y]` for the curve.\n * @returns a Bezier2d holding a copy of the poles.\n */\nexport function makeBezier2d(poles: [number, number][]): Bezier2d {\n return { kind2d: 'bezier', poles: [...poles] }\n}\n\n// ---------------------------------------------------------------------------\n// Transform helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Translate a curve by an offset.\n * @param c - the curve to translate.\n * @param dx - the x offset.\n * @param dy - the y offset.\n * @returns a new Curve2dObj translated by `(dx, dy)`.\n */\nexport function translateCurve2d(c: Curve2dObj, dx: number, dy: number): Curve2dObj {\n switch (c.kind2d) {\n case 'line':\n return { ...c, ox: c.ox + dx, oy: c.oy + dy }\n case 'circle':\n return { ...c, cx: c.cx + dx, cy: c.cy + dy }\n case 'ellipse':\n return { ...c, cx: c.cx + dx, cy: c.cy + dy }\n case 'bezier':\n return { ...c, poles: c.poles.map(([x, y]) => [x + dx, y + dy]) }\n case 'bspline':\n return { ...c, poles: c.poles.map(([x, y]) => [x + dx, y + dy]) }\n case 'trimmed':\n return { ...c, basis: translateCurve2d(c.basis, dx, dy) }\n }\n}\n\n/**\n * Rotate a curve by an angle about a center point.\n * @param c - the curve to rotate.\n * @param angle - the rotation angle in radians.\n * @param cx - the x coordinate of the rotation center.\n * @param cy - the y coordinate of the rotation center.\n * @returns a new Curve2dObj rotated by `angle` about `(cx, cy)`.\n */\nexport function rotateCurve2d(c: Curve2dObj, angle: number, cx: number, cy: number): Curve2dObj {\n const cos = Math.cos(angle)\n const sin = Math.sin(angle)\n const rotatePoint = (x: number, y: number): [number, number] => {\n const rx = x - cx\n const ry = y - cy\n return [cx + rx * cos - ry * sin, cy + rx * sin + ry * cos]\n }\n switch (c.kind2d) {\n case 'line': {\n const [ox, oy] = rotatePoint(c.ox, c.oy)\n const ndx = c.dx * cos - c.dy * sin\n const ndy = c.dx * sin + c.dy * cos\n return { ...c, ox, oy, dx: ndx, dy: ndy }\n }\n case 'circle': {\n const [ncx, ncy] = rotatePoint(c.cx, c.cy)\n return { ...c, cx: ncx, cy: ncy }\n }\n case 'ellipse': {\n const [ncx, ncy] = rotatePoint(c.cx, c.cy)\n return { ...c, cx: ncx, cy: ncy, xDirAngle: c.xDirAngle + angle }\n }\n case 'bezier':\n return { ...c, poles: c.poles.map(([x, y]) => rotatePoint(x, y)) }\n case 'bspline':\n return { ...c, poles: c.poles.map(([x, y]) => rotatePoint(x, y)) }\n case 'trimmed': {\n const basis = rotateCurve2d(c.basis, angle, cx, cy)\n // A circle carries no frame angle, so its rotation must land in the\n // trim range: parameter IS the geometric angle (negated when\n // sense=false). Without this shift, rotating an arc about its own\n // circle center was a silent no-op.\n if (basis.kind2d === 'circle') {\n const shift = basis.sense ? angle : -angle\n return { ...c, basis, tStart: c.tStart + shift, tEnd: c.tEnd + shift }\n }\n return { ...c, basis }\n }\n }\n}\n\n/**\n * Scale a curve by a factor about a center point.\n * @param c - the curve to scale.\n * @param factor - the scale factor (may be negative to mirror-and-scale).\n * @param cx - the x coordinate of the scaling center.\n * @param cy - the y coordinate of the scaling center.\n * @returns a new Curve2dObj scaled by `factor` about `(cx, cy)`.\n */\nexport function scaleCurve2d(c: Curve2dObj, factor: number, cx: number, cy: number): Curve2dObj {\n const scalePoint = (x: number, y: number): [number, number] => [\n cx + (x - cx) * factor,\n cy + (y - cy) * factor,\n ]\n switch (c.kind2d) {\n case 'line': {\n // Scale BOTH endpoints and recompute direction/length (see brepjs notes:\n // scaling only origin left the endpoint wrong for factor != 1, most\n // damagingly for mirror factor=-1 which reflected the origin but kept the\n // original direction).\n const [ox, oy] = scalePoint(c.ox, c.oy)\n const [ex, ey] = scalePoint(c.ox + c.dx * c.len, c.oy + c.dy * c.len)\n const ndx = ex - ox\n const ndy = ey - oy\n const nlen = Math.sqrt(ndx * ndx + ndy * ndy)\n return {\n ...c,\n ox,\n oy,\n dx: nlen > 0 ? ndx / nlen : c.dx,\n dy: nlen > 0 ? ndy / nlen : c.dy,\n len: nlen,\n }\n }\n case 'circle': {\n const [ncx, ncy] = scalePoint(c.cx, c.cy)\n return { ...c, cx: ncx, cy: ncy, radius: c.radius * Math.abs(factor) }\n }\n case 'ellipse': {\n const [ncx, ncy] = scalePoint(c.cx, c.cy)\n return {\n ...c,\n cx: ncx,\n cy: ncy,\n majorRadius: c.majorRadius * Math.abs(factor),\n minorRadius: c.minorRadius * Math.abs(factor),\n }\n }\n case 'bezier':\n return { ...c, poles: c.poles.map(([x, y]) => scalePoint(x, y)) }\n case 'bspline':\n return { ...c, poles: c.poles.map(([x, y]) => scalePoint(x, y)) }\n case 'trimmed':\n return { ...c, basis: scaleCurve2d(c.basis, factor, cx, cy) }\n }\n}\n\n/**\n * Mirror a curve through a center point (a half-turn).\n * @param c - the curve to mirror.\n * @param cx - the x coordinate of the mirror center.\n * @param cy - the y coordinate of the mirror center.\n * @returns a new Curve2dObj rotated 180 degrees about `(cx, cy)`.\n */\nexport function mirrorAtPoint(c: Curve2dObj, cx: number, cy: number): Curve2dObj {\n // A point mirror IS a half-turn. Routing through rotate keeps every curve\n // type's parameterization exact: scale(-1) reflected conic centers but left\n // their angular parameterization behind.\n return rotateCurve2d(c, Math.PI, cx, cy)\n}\n\n/**\n * Mirror a curve across an axis defined by a point and a direction vector.\n * @param c - the curve to mirror.\n * @param ox - the x coordinate of a point on the mirror axis.\n * @param oy - the y coordinate of a point on the mirror axis.\n * @param dx - the x component of the axis direction vector.\n * @param dy - the y component of the axis direction vector.\n * @returns a new Curve2dObj reflected across the given axis.\n */\nexport function mirrorAcrossAxis(\n c: Curve2dObj,\n ox: number,\n oy: number,\n dx: number,\n dy: number,\n): Curve2dObj {\n const len = Math.sqrt(dx * dx + dy * dy)\n if (len < 1e-15) return c\n const nx = dx / len\n const ny = dy / len\n const reflectPoint = (x: number, y: number): [number, number] => {\n const rx = x - ox\n const ry = y - oy\n const dot = rx * nx + ry * ny\n return [ox + 2 * dot * nx - rx, oy + 2 * dot * ny - ry]\n }\n switch (c.kind2d) {\n case 'line': {\n const [nox, noy] = reflectPoint(c.ox, c.oy)\n const ndx = 2 * (c.dx * nx + c.dy * ny) * nx - c.dx\n const ndy = 2 * (c.dx * nx + c.dy * ny) * ny - c.dy\n return { ...c, ox: nox, oy: noy, dx: ndx, dy: ndy }\n }\n case 'circle': {\n const [ncx, ncy] = reflectPoint(c.cx, c.cy)\n return { ...c, cx: ncx, cy: ncy, sense: !c.sense }\n }\n case 'ellipse': {\n const [ncx, ncy] = reflectPoint(c.cx, c.cy)\n // Reflect the major-axis direction angle across the mirror axis\n const cos2 = nx * nx - ny * ny\n const sin2 = 2 * nx * ny\n const newAngle = Math.atan2(\n sin2 * Math.cos(c.xDirAngle) - cos2 * Math.sin(c.xDirAngle),\n cos2 * Math.cos(c.xDirAngle) + sin2 * Math.sin(c.xDirAngle),\n )\n return { ...c, cx: ncx, cy: ncy, xDirAngle: newAngle, sense: !c.sense }\n }\n case 'bezier':\n return { ...c, poles: c.poles.map(([x, y]) => reflectPoint(x, y)) }\n case 'bspline':\n return { ...c, poles: c.poles.map(([x, y]) => reflectPoint(x, y)) }\n case 'trimmed': {\n const basis = mirrorAcrossAxis(c.basis, ox, oy, dx, dy)\n // Reflection maps a circle's geometric angle theta to 2*phi - theta\n // (phi = axis angle). The sense flip on the basis absorbs the negation;\n // the 2*phi rotation has nowhere to live on a frameless circle, so it\n // lands in the trim range (sign follows the ORIGINAL sense).\n if (c.basis.kind2d === 'circle' && basis.kind2d === 'circle') {\n const phi = Math.atan2(ny, nx)\n const shift = c.basis.sense ? -2 * phi : 2 * phi\n return { ...c, basis, tStart: c.tStart + shift, tEnd: c.tEnd + shift }\n }\n return { ...c, basis }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// 2D curve–curve intersection\n// ---------------------------------------------------------------------------\n/**\n * Compute intersection points (and overlapping segments) between two 2D curves.\n * Handles analytic cases (line-line, line-circle, circle-circle) and falls back\n * to numerical sampling + Newton refinement for general curves.\n * @param c1 - the first curve.\n * @param c2 - the second curve.\n * @param tolerance - the geometric tolerance used for candidate filtering.\n * @returns the intersection points and any overlapping curve segments.\n */\nexport function intersectCurves2dFn(\n c1: Curve2dObj,\n c2: Curve2dObj,\n tolerance: number,\n): { points: [number, number][]; segments: Curve2dObj[] } {\n const b1 = unwrapCurve(c1)\n const b2 = unwrapCurve(c2)\n // Analytic: line-line\n if (b1.kind2d === 'line' && b2.kind2d === 'line') {\n return intersectLineLine(c1, b1, c2, b2, tolerance)\n }\n // Analytic: line-circle / circle-line\n if (b1.kind2d === 'line' && b2.kind2d === 'circle') {\n return { points: intersectLineCircle(c1, b1, c2, b2, tolerance), segments: [] }\n }\n if (b1.kind2d === 'circle' && b2.kind2d === 'line') {\n return { points: intersectLineCircle(c2, b2, c1, b1, tolerance), segments: [] }\n }\n // Analytic: circle-circle\n if (b1.kind2d === 'circle' && b2.kind2d === 'circle') {\n return { points: intersectCircleCircle(c1, b1, c2, b2, tolerance), segments: [] }\n }\n // General: numerical (with self-intersection handling)\n const isSelf = c1 === c2\n return numericalIntersect(c1, c2, tolerance, isSelf)\n}\n\n/**\n * Serialize a curve (JSON round-trip).\n * @param c - the curve to serialize.\n * @returns the curve as a JSON string.\n */\nexport function serializeCurve2d(c: Curve2dObj): string {\n return JSON.stringify(c)\n}\n/**\n * Deserialize a curve previously produced by {@link serializeCurve2d}.\n * @param data - the JSON string describing the curve.\n * @returns the reconstructed Curve2dObj.\n */\nexport function deserializeCurve2d(data: string): Curve2dObj {\n return JSON.parse(data)\n}\n\n// ---------------------------------------------------------------------------\n// BBox helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Create an empty (inverted) curve bounding box.\n * @returns a fresh CurveBBox2d whose mins are +Infinity and maxes are -Infinity.\n */\nexport function createCurveBBox2d(): CurveBBox2d {\n return { kind2d_b: true, xMin: Infinity, yMin: Infinity, xMax: -Infinity, yMax: -Infinity }\n}\n\n/**\n * Expand a curve bounding box to include a curve's extent.\n * Uses analytic extremes for lines and circles/arcs and sampling otherwise.\n * @param bbox - the box to expand in place.\n * @param c - the curve whose extent is incorporated.\n * @param _tol - reserved tolerance parameter (unused).\n */\nexport function addCurveToBBox(bbox: CurveBBox2d, c: Curve2dObj, _tol: number): void {\n const basis = c.kind2d === 'trimmed' ? c.basis : c\n // Analytic: lines need only 2 endpoints (no sampling)\n if (basis.kind2d === 'line') {\n const bounds = curveBounds(c)\n if (!isFinite(bounds.first) || !isFinite(bounds.last)) return\n const [x0, y0] = evaluateCurve2d(c, bounds.first)\n const [x1, y1] = evaluateCurve2d(c, bounds.last)\n bbox.xMin = Math.min(bbox.xMin, x0, x1)\n bbox.yMin = Math.min(bbox.yMin, y0, y1)\n bbox.xMax = Math.max(bbox.xMax, x0, x1)\n bbox.yMax = Math.max(bbox.yMax, y0, y1)\n return\n }\n // Analytic: circles/arcs — endpoints + axis extremes\n if (basis.kind2d === 'circle') {\n const bounds = curveBounds(c)\n if (!isFinite(bounds.first) || !isFinite(bounds.last)) return\n const { cx, cy, radius, sense } = basis\n const [x0, y0] = evaluateCurve2d(c, bounds.first)\n const [x1, y1] = evaluateCurve2d(c, bounds.last)\n let xMin = Math.min(x0, x1)\n let xMax = Math.max(x0, x1)\n let yMin = Math.min(y0, y1)\n let yMax = Math.max(y0, y1)\n // Check axis-aligned extreme angles within the arc's parameter range\n const tStart = c.kind2d === 'trimmed' ? c.tStart : bounds.first\n const tEnd = c.kind2d === 'trimmed' ? c.tEnd : bounds.last\n for (let k = 0; k < 4; k++) {\n const angle = (k * Math.PI) / 2\n const t = sense ? angle : -angle\n // Check if t (or t + 2π) falls within [tStart, tEnd]\n for (let wrap = 0; wrap <= 1; wrap++) {\n const tt = t + wrap * 2 * Math.PI\n if (tt >= tStart - 1e-10 && tt <= tEnd + 1e-10) {\n const ex = cx + radius * Math.cos(angle)\n const ey = cy + radius * Math.sin(angle)\n xMin = Math.min(xMin, ex)\n xMax = Math.max(xMax, ex)\n yMin = Math.min(yMin, ey)\n yMax = Math.max(yMax, ey)\n break\n }\n }\n }\n bbox.xMin = Math.min(bbox.xMin, xMin)\n bbox.yMin = Math.min(bbox.yMin, yMin)\n bbox.xMax = Math.max(bbox.xMax, xMax)\n bbox.yMax = Math.max(bbox.yMax, yMax)\n return\n }\n // General: sample (bezier, bspline, ellipse)\n const bounds = curveBounds(c)\n if (!isFinite(bounds.first) || !isFinite(bounds.last)) return\n const nSamples = 20\n const dt = (bounds.last - bounds.first) / nSamples\n for (let i = 0; i <= nSamples; i++) {\n const t = bounds.first + i * dt\n const [x, y] = evaluateCurve2d(c, t)\n if (x < bbox.xMin) bbox.xMin = x\n if (y < bbox.yMin) bbox.yMin = y\n if (x > bbox.xMax) bbox.xMax = x\n if (y > bbox.yMax) bbox.yMax = y\n }\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\n/** Unwrap trimmed wrappers to get the basis curve type. */\nfunction unwrapCurve(c: Curve2dObj): Curve2dObj {\n let cur = c\n while (cur.kind2d === 'trimmed') cur = cur.basis\n return cur\n}\n\n/** Check if parameter t is within the curve's domain. */\nfunction inDomain(c: Curve2dObj, t: number, tol: number): boolean {\n const b = curveBounds(c)\n return t >= b.first - tol && t <= b.last + tol\n}\n\n/** Find parameter on curve c closest to point (px, py), searching near tGuess. */\nfunction refineParam(c: Curve2dObj, px: number, py: number, maxRatio = 0.1): number | null {\n const bounds = curveBounds(c)\n if (!isFinite(bounds.first) || !isFinite(bounds.last)) return null\n const N = 80\n const dt = (bounds.last - bounds.first) / N\n let bestT = bounds.first\n let bestD = Infinity\n for (let i = 0; i <= N; i++) {\n const t = bounds.first + i * dt\n const [ex, ey] = evaluateCurve2d(c, t)\n const d = (ex - px) ** 2 + (ey - py) ** 2\n if (d < bestD) {\n bestD = d\n bestT = t\n }\n }\n // bestD is squared geometric distance. Derive a scale-relative threshold\n // from the curve's geometric extent (not parameter span).\n const [sx, sy] = evaluateCurve2d(c, bounds.first)\n const [ex, ey] = evaluateCurve2d(c, bounds.last)\n const [mx, my] = evaluateCurve2d(c, (bounds.first + bounds.last) / 2)\n const geomExtent = Math.max(\n Math.sqrt((ex - sx) ** 2 + (ey - sy) ** 2),\n Math.sqrt((mx - sx) ** 2 + (my - sy) ** 2),\n 1e-6,\n )\n const maxDist = geomExtent * maxRatio\n return bestD < maxDist * maxDist ? bestT : null\n}\n\n/**\n * Parameter on a curve closest to a point.\n *\n * This is the general \"point → parameter\" primitive used by corner/offset work:\n * it searches the curve's domain for the parameter whose evaluated point is\n * nearest to `(px, py)` and returns it when that nearest distance is within a\n * configurable fraction of the curve's geometric extent. Returns `null` when the\n * point lies too far off the curve (the raw gap-vs-extent guard) so callers can\n * distinguish \"on/very near the curve\" from \"clearly off\".\n *\n * @param c - the curve to search (line, arc, ellipse, bezier, bspline, trimmed).\n * @param px - the query point x.\n * @param py - the query point y.\n * @param maxRatio - the maximum acceptable nearest-distance / geometric-extent\n * ratio (default 0.1; raise it to accept points that sit further off the curve).\n * @returns the domain parameter `t`, or `null` when `(px, py)` is off-curve by\n * more than `maxRatio` of the curve's geometric extent.\n */\nexport function parameterOfPoint(c: Curve2dObj, px: number, py: number, maxRatio = 0.1): number | null {\n const bounds = curveBounds(c)\n if (!isFinite(bounds.first) || !isFinite(bounds.last)) return null\n\n // Coarse sample to get within one domain step of the nearest point (semantics,\n // curvature, and per-kernel sensitivity: `refineParam`'s N=80 grid).\n const seed = refineParam(c, px, py, maxRatio)\n if (seed === null) return null\n\n // Refine to the projection foot: for the farthest/nearest parameter the chord\n // `(curve(t) − P)` is perpendicular to the tangent, i.e. g(t)=dot(·)=0. Solve\n // g(t)=0 with Newton on a central-difference derivative.\n const span = bounds.last - bounds.first\n const hbase = span * 1e-6\n let t = seed\n const fixed = new Set<string>()\n for (let i = 0; i < 24; i++) {\n const [ex, ey] = evaluateCurve2d(c, t)\n const [tx, ty] = tangentCurve2d(c, t)\n const g = (ex - px) * tx + (ey - py) * ty\n if (Math.abs(g) < 1e-12) break\n const h = Math.max(hbase, 1e-9)\n const [hx, hy] = evaluateCurve2d(c, Math.min(bounds.last, t + h))\n const [hT, hTy] = tangentCurve2d(c, Math.min(bounds.last, t + h))\n const gp = ((hx - px) * hT + (hy - py) * hTy - g) / h\n if (Math.abs(gp) < 1e-16) break\n const tn = t - g / gp\n t = Math.max(bounds.first, Math.min(bounds.last, tn))\n const key = t.toFixed(12)\n if (fixed.has(key)) break\n fixed.add(key)\n if (okConverge(c, px, py, t)) break\n }\n return t\n}\n\n/** True when `(px, py)` is within `1e-9` of the curve at parameter `t`. */\nfunction okConverge(c: Curve2dObj, px: number, py: number, t: number): boolean {\n const [ex, ey] = evaluateCurve2d(c, t)\n return Math.hypot(ex - px, ey - py) < 1e-9\n}\n\n/** The unwrapped basis curve (strips any nesting of `trimmed` wrappers). */\nfunction basisOf(c: Curve2dObj): Curve2dObj {\n let b = c\n while (b.kind2d === 'trimmed') b = b.basis\n return b\n}\n\n/**\n * Trim a curve to a sub-parameter range given in the basis curve's native domain.\n *\n * The returned `trimmed` curve keeps the full basis; its `t∈[0,1]` domain maps\n * into `[tStart, tEnd]` of the basis (so it is the inverse of `curveBounds` for\n * trimmed curves). Parameters are in the basis's native domain (a line: distance\n * along `[0,len]`; an arc/ellipse: angle `[.., ..]`).\n *\n * @param c - the curve to trim (may itself be already-trimmed; the basis is reused).\n * @param tStart - the basis-domain parameter where the sub-curve starts.\n * @param tEnd - the basis-domain parameter where the sub-curve ends.\n * @returns the trimmed `Curve2dObj`.\n */\nexport function trimCurve(c: Curve2dObj, tStart: number, tEnd: number): Curve2dObj {\n return { kind2d: 'trimmed', basis: basisOf(c), tStart, tEnd }\n}\n\n/**\n * Split a curve at a native-domain parameter into two trimmed sub-curves.\n *\n * This is the splice primitive that D1 boolean-splitting and D3 corner\n * (fillet/chamfer) use: it cuts a single curve at an interior parameter into\n * two `TrimmedCurve2d` sharing the same basis, covering `[first, t]` and\n * `[t, last]`. Returns `null` when `t` is not strictly interior.\n *\n * @param c - the curve to split.\n * @param t - the native-domain split parameter (strictly inside the basis domain).\n * @returns the two sub-curves, or `null` when `t` is outside the interior.\n */\nexport function splitCurveAt(c: Curve2dObj, t: number): [Curve2dObj, Curve2dObj] | null {\n const basis = basisOf(c)\n const { first, last } = curveBounds(basis)\n if (t <= first || t >= last) return null\n return [trimCurve(basis, first, t), trimCurve(basis, t, last)]\n}\n\nfunction intersectLineLine(\n c1: Curve2dObj,\n l1: Line2d,\n c2: Curve2dObj,\n l2: Line2d,\n tol: number,\n): { points: [number, number][]; segments: Curve2dObj[] } {\n const det = l1.dx * l2.dy - l1.dy * l2.dx\n if (Math.abs(det) >= 1e-14) {\n // Non-parallel: solve for intersection\n const ex = l2.ox - l1.ox\n const ey = l2.oy - l1.oy\n const t1 = (ex * l2.dy - ey * l2.dx) / det\n const t2 = (ex * l1.dy - ey * l1.dx) / det\n if (!inDomain(c1, t1, tol) || !inDomain(c2, t2, tol)) return { points: [], segments: [] }\n return { points: [[l1.ox + t1 * l1.dx, l1.oy + t1 * l1.dy]], segments: [] }\n }\n // Parallel — check if collinear and overlapping\n const ex = l2.ox - l1.ox\n const ey = l2.oy - l1.oy\n const cross = ex * l1.dy - ey * l1.dx\n if (Math.abs(cross) > tol) return { points: [], segments: [] } // parallel but not collinear\n // Project c2 endpoints onto c1's parameter space\n const b1 = curveBounds(c1)\n const b2 = curveBounds(c2)\n const p2s = evaluateCurve2d(c2, b2.first)\n const p2e = evaluateCurve2d(c2, b2.last)\n const t2sOn1 = (p2s[0] - l1.ox) * l1.dx + (p2s[1] - l1.oy) * l1.dy\n const t2eOn1 = (p2e[0] - l1.ox) * l1.dx + (p2e[1] - l1.oy) * l1.dy\n const overlapStart = Math.max(b1.first, Math.min(t2sOn1, t2eOn1))\n const overlapEnd = Math.min(b1.last, Math.max(t2sOn1, t2eOn1))\n if (overlapEnd - overlapStart < tol) return { points: [], segments: [] } // no meaningful overlap\n const sx = l1.ox + overlapStart * l1.dx\n const sy = l1.oy + overlapStart * l1.dy\n const ex2 = l1.ox + overlapEnd * l1.dx\n const ey2 = l1.oy + overlapEnd * l1.dy\n const seg = makeLine2d(sx, sy, ex2, ey2)\n return { points: [], segments: [seg] }\n}\n\nfunction intersectLineCircle(\n cLine: Curve2dObj,\n line: Line2d,\n cCirc: Curve2dObj,\n circ: Circle2d,\n tol: number,\n): [number, number][] {\n // Vector from circle center to line origin\n const fx = line.ox - circ.cx\n const fy = line.oy - circ.cy\n // Quadratic: |f + t*d|^2 = r^2\n const a = line.dx * line.dx + line.dy * line.dy // = 1 for normalized\n const b = 2 * (fx * line.dx + fy * line.dy)\n const c = fx * fx + fy * fy - circ.radius * circ.radius\n const disc = b * b - 4 * a * c\n if (disc < -tol) return []\n const results: [number, number][] = []\n const sqrtDisc = Math.sqrt(Math.max(0, disc))\n const t1 = (-b - sqrtDisc) / (2 * a)\n const t2 = (-b + sqrtDisc) / (2 * a)\n for (const tLine of disc < tol * tol ? [t1] : [t1, t2]) {\n if (!inDomain(cLine, tLine, tol)) continue\n const px = line.ox + tLine * line.dx\n const py = line.oy + tLine * line.dy\n // Check that the point is in the circle's domain\n const tCirc = refineParam(cCirc, px, py)\n if (tCirc === null) continue\n const [cx2, cy2] = evaluateCurve2d(cCirc, tCirc)\n if ((cx2 - px) ** 2 + (cy2 - py) ** 2 > tol * tol * 1e6) continue\n results.push([px, py])\n }\n return results\n}\n\nfunction intersectConcentricArcs(c1: Curve2dObj, c2: Curve2dObj, tol: number): [number, number][] {\n const b1 = curveBounds(c1)\n const b2 = curveBounds(c2)\n const isFullCircle1 = Math.abs(b1.last - b1.first - 2 * Math.PI) < 1e-10\n const isFullCircle2 = Math.abs(b2.last - b2.first - 2 * Math.PI) < 1e-10\n if (isFullCircle1 && isFullCircle2) return []\n if (isFullCircle1) {\n return [evaluateCurve2d(c2, b2.first), evaluateCurve2d(c2, b2.last)]\n }\n if (isFullCircle2) {\n return [evaluateCurve2d(c1, b1.first), evaluateCurve2d(c1, b1.last)]\n }\n const pts: [number, number][] = []\n const checks: [Curve2dObj, [number, number]][] = [\n [c2, evaluateCurve2d(c1, b1.first)],\n [c2, evaluateCurve2d(c1, b1.last)],\n [c1, evaluateCurve2d(c2, b2.first)],\n [c1, evaluateCurve2d(c2, b2.last)],\n ]\n for (const [target, pt] of checks) {\n const t = refineParam(target, pt[0], pt[1])\n if (t !== null) {\n const [ex, ey] = evaluateCurve2d(target, t)\n if ((ex - pt[0]) ** 2 + (ey - pt[1]) ** 2 < tol * tol * 100) pts.push(pt)\n }\n }\n const deduped: [number, number][] = []\n for (const p of pts) {\n if (!deduped.some(([ddx, ddy]) => (ddx - p[0]) ** 2 + (ddy - p[1]) ** 2 < tol * tol * 100)) {\n deduped.push(p)\n }\n }\n return deduped\n}\n\nfunction intersectCircleCircle(\n c1: Curve2dObj,\n circ1: Circle2d,\n c2: Curve2dObj,\n circ2: Circle2d,\n tol: number,\n): [number, number][] {\n const dx = circ2.cx - circ1.cx\n const dy = circ2.cy - circ1.cy\n const d = Math.sqrt(dx * dx + dy * dy)\n if (d > circ1.radius + circ2.radius + tol) return []\n if (d < Math.abs(circ1.radius - circ2.radius) - tol) return []\n if (d < 1e-14) {\n if (Math.abs(circ1.radius - circ2.radius) > tol) return []\n return intersectConcentricArcs(c1, c2, tol)\n }\n const a = (circ1.radius * circ1.radius - circ2.radius * circ2.radius + d * d) / (2 * d)\n const h2 = circ1.radius * circ1.radius - a * a\n const h = Math.sqrt(Math.max(0, h2))\n const mx = circ1.cx + (a * dx) / d\n const my = circ1.cy + (a * dy) / d\n const candidates: [number, number][] =\n h < tol\n ? [[mx, my]]\n : [\n [mx + (h * dy) / d, my - (h * dx) / d],\n [mx - (h * dy) / d, my + (h * dx) / d],\n ]\n // Filter candidates that lie within both curves' domains\n const results: [number, number][] = []\n for (const [px, py] of candidates) {\n const t1 = refineParam(c1, px, py)\n const t2 = refineParam(c2, px, py)\n if (t1 === null || t2 === null) continue\n const [x1, y1] = evaluateCurve2d(c1, t1)\n const [x2, y2] = evaluateCurve2d(c2, t2)\n const tolSq = (tol * 10) ** 2\n if ((x1 - px) ** 2 + (y1 - py) ** 2 > tolSq) continue\n if ((x2 - px) ** 2 + (y2 - py) ** 2 > tolSq) continue\n results.push([px, py])\n }\n return results\n}\n\n/**\n * Numerical intersection via sampling + Newton refinement.\n * Samples both curves densely, finds close point pairs, refines with Newton.\n */\nfunction numericalIntersect(\n c1: Curve2dObj,\n c2: Curve2dObj,\n tolerance: number,\n isSelf = false,\n): { points: [number, number][]; segments: Curve2dObj[] } {\n const b1 = curveBounds(c1)\n const b2 = curveBounds(c2)\n if (!isFinite(b1.first) || !isFinite(b1.last) || !isFinite(b2.first) || !isFinite(b2.last)) {\n return { points: [], segments: [] }\n }\n const N = 100\n const pts1: { t: number; x: number; y: number }[] = []\n const pts2: { t: number; x: number; y: number }[] = []\n for (let i = 0; i <= N; i++) {\n const t1 = b1.first + ((b1.last - b1.first) * i) / N\n const [x1, y1] = evaluateCurve2d(c1, t1)\n pts1.push({ t: t1, x: x1, y: y1 })\n const t2 = b2.first + ((b2.last - b2.first) * i) / N\n const [x2, y2] = evaluateCurve2d(c2, t2)\n pts2.push({ t: t2, x: x2, y: y2 })\n }\n // Pre-compute segment bounds for curve2 (avoids recomputing N times in inner loop)\n const crossTol = Math.max(tolerance * 100, 0.5)\n const seg2Bounds = new Float64Array(N * 6) // xmin, xmax, ymin, ymax, tmid, _pad\n for (let j = 0; j < N; j++) {\n const a = pts2[j]!\n const b = pts2[j + 1]!\n const off = j * 6\n seg2Bounds[off] = Math.min(a.x, b.x)\n seg2Bounds[off + 1] = Math.max(a.x, b.x)\n seg2Bounds[off + 2] = Math.min(a.y, b.y)\n seg2Bounds[off + 3] = Math.max(a.y, b.y)\n seg2Bounds[off + 4] = (a.t + b.t) / 2\n }\n // Find segment pairs where the curves are close\n const candidates: { t1: number; t2: number }[] = []\n const selfMinSep = (b1.last - b1.first) / 5\n for (let i = 0; i < N; i++) {\n const p1a = pts1[i]!\n const p1b = pts1[i + 1]!\n // Hoist outer segment AABB (computed once per outer iteration)\n const x1min = Math.min(p1a.x, p1b.x) - crossTol\n const x1max = Math.max(p1a.x, p1b.x) + crossTol\n const y1min = Math.min(p1a.y, p1b.y) - crossTol\n const y1max = Math.max(p1a.y, p1b.y) + crossTol\n const t1mid = (p1a.t + p1b.t) / 2\n for (let j = 0; j < N; j++) {\n const off = j * 6\n if (x1max < seg2Bounds[off] || seg2Bounds[off + 1] < x1min) continue\n if (y1max < seg2Bounds[off + 2] || seg2Bounds[off + 3] < y1min) continue\n const t2mid = seg2Bounds[off + 4]\n if (isSelf && Math.abs(t1mid - t2mid) < selfMinSep) continue\n candidates.push({ t1: t1mid, t2: t2mid })\n }\n }\n // Refine candidates via Newton iteration\n const tol2 = tolerance * tolerance\n const found: [number, number][] = []\n for (const { t1: t1Init, t2: t2Init } of candidates) {\n let t1 = t1Init\n let t2 = t2Init\n for (let iter = 0; iter < 20; iter++) {\n const [x1, y1] = evaluateCurve2d(c1, t1)\n const [x2, y2] = evaluateCurve2d(c2, t2)\n const dx = x1 - x2\n const dy = y1 - y2\n if (dx * dx + dy * dy < tol2) break\n const d1 = tangentCurve2d(c1, t1)\n const d2 = tangentCurve2d(c2, t2)\n // Newton system: J * [dt1, dt2]^T = -[dx, dy]\n const det = d1[0] * -d2[1] - -d2[0] * d1[1]\n if (Math.abs(det) < 1e-14) break\n const dt1 = (-dx * -d2[1] - -dy * -d2[0]) / det\n const dt2 = (d1[0] * -dy - d1[1] * -dx) / det\n t1 += dt1\n t2 += dt2\n t1 = Math.max(b1.first, Math.min(b1.last, t1))\n t2 = Math.max(b2.first, Math.min(b2.last, t2))\n }\n const [x1, y1] = evaluateCurve2d(c1, t1)\n const [x2, y2] = evaluateCurve2d(c2, t2)\n // For self-intersection, only accept points with well-separated params\n if (isSelf && Math.abs(t1 - t2) < (b1.last - b1.first) * 0.05) continue\n if ((x1 - x2) ** 2 + (y1 - y2) ** 2 < tolerance * tolerance * 1e6) {\n const px = (x1 + x2) / 2\n const py = (y1 + y2) / 2\n let dup = false\n for (const [fx, fy] of found) {\n if ((fx - px) ** 2 + (fy - py) ** 2 < tolerance * tolerance * 1e4) {\n dup = true\n break\n }\n }\n if (!dup) found.push([px, py])\n }\n }\n return { points: found, segments: [] }\n}\n\n// ---------------------------------------------------------------------------\n// Private curve evaluators\n// ---------------------------------------------------------------------------\n\nfunction evaluateBezier(poles: [number, number][], t: number): [number, number] {\n // De Casteljau\n const n = poles.length\n const work: [number, number][] = poles.map(([x, y]) => [x, y])\n for (let r = 1; r < n; r++) {\n for (let i = 0; i < n - r; i++) {\n const wi = work[i]!\n const wi1 = work[i + 1]!\n wi[0] = (1 - t) * wi[0] + t * wi1[0]\n wi[1] = (1 - t) * wi[1] + t * wi1[1]\n }\n }\n return work[0]!\n}\n\nfunction evaluateBSpline2d(c: BSpline2d, t: number): [number, number] {\n // Expand knots with multiplicities\n const fullKnots: number[] = []\n for (let i = 0; i < c.knots.length; i++) {\n const mult = c.multiplicities[i] ?? 1\n for (let j = 0; j < mult; j++) {\n fullKnots.push(c.knots[i]!)\n }\n }\n // De Boor evaluation\n const p = c.degree\n const n = c.poles.length\n const k = fullKnots.length\n const tClamped = Math.max(fullKnots[p]!, Math.min(fullKnots[k - p - 1]!, t))\n // Find span\n let span = p\n for (let i = p; i < k - p - 1; i++) {\n if (tClamped >= fullKnots[i]! && tClamped < fullKnots[i + 1]!) {\n span = i\n break\n }\n }\n if (tClamped >= fullKnots[k - p - 1]!) span = k - p - 2\n // Extract relevant control points\n const d: [number, number][] = []\n for (let j = 0; j <= p; j++) {\n const idx = Math.min(span - p + j, n - 1)\n const pole = c.poles[Math.max(0, idx)]!\n d.push([pole[0], pole[1]])\n }\n // De Boor recursion\n for (let r = 1; r <= p; r++) {\n for (let j = p; j >= r; j--) {\n const i = span - p + j\n const left = fullKnots[i] ?? 0\n const right = fullKnots[i + p - r + 1] ?? 1\n const denom = right - left\n const alpha = denom > 1e-15 ? (tClamped - left) / denom : 0\n const dj = d[j]!\n const djPrev = d[j - 1]!\n dj[0] = (1 - alpha) * djPrev[0] + alpha * dj[0]\n dj[1] = (1 - alpha) * djPrev[1] + alpha * dj[1]\n }\n }\n return d[p]!\n}"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* geometry2d — faijs pure-2D analytic curve geometry base (L1).
|
|
3
|
+
*
|
|
4
|
+
* Ported from brepjs (Apache-2.0), discriminant renamed `__bk2d` → `kind2d`.
|
|
5
|
+
* Zero-dependency pure TS used by `cad.profile`, the draw/sketch packages, the
|
|
6
|
+
* 2D→3D bridge, and SVG-oriented processing.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
export * from './curve2d.js';
|
|
11
|
+
export * from './bbox2d.js';
|
|
12
|
+
export * from './point.js';
|
|
13
|
+
export * from './svg-ellipse.js';
|
|
14
|
+
export { BaseSketcher2d } from './pen-sketcher.js';
|
|
15
|
+
export type { SplineOptions, CornerMode } from './pen-sketcher.js';
|
|
16
|
+
export { BlueprintSketcher } from './blueprint-sketcher.js';
|
|
17
|
+
export { polysidesBlueprint, roundedRectangleBlueprint } from './canned-blueprints.js';
|
|
18
|
+
export * from './blueprint.js';
|
|
19
|
+
export * from './compound-blueprint.js';
|
|
20
|
+
export * from './blueprints.js';
|
|
21
|
+
export * from './organise.js';
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/geometry2d/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AACnF,cAAc,aAAa,CAAA;AAC3B,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* geometry2d — faijs pure-2D analytic curve geometry base (L1).
|
|
3
|
+
*
|
|
4
|
+
* Ported from brepjs (Apache-2.0), discriminant renamed `__bk2d` → `kind2d`.
|
|
5
|
+
* Zero-dependency pure TS used by `cad.profile`, the draw/sketch packages, the
|
|
6
|
+
* 2D→3D bridge, and SVG-oriented processing.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
export * from './curve2d.js';
|
|
11
|
+
export * from './bbox2d.js';
|
|
12
|
+
export * from './point.js';
|
|
13
|
+
export * from './svg-ellipse.js';
|
|
14
|
+
export { BaseSketcher2d } from './pen-sketcher.js';
|
|
15
|
+
export { BlueprintSketcher } from './blueprint-sketcher.js';
|
|
16
|
+
export { polysidesBlueprint, roundedRectangleBlueprint } from './canned-blueprints.js';
|
|
17
|
+
export * from './blueprint.js';
|
|
18
|
+
export * from './compound-blueprint.js';
|
|
19
|
+
export * from './blueprints.js';
|
|
20
|
+
export * from './organise.js';
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/geometry2d/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AACnF,cAAc,aAAa,CAAA;AAC3B,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA","sourcesContent":["/**\n * geometry2d — faijs pure-2D analytic curve geometry base (L1).\n *\n * Ported from brepjs (Apache-2.0), discriminant renamed `__bk2d` → `kind2d`.\n * Zero-dependency pure TS used by `cad.profile`, the draw/sketch packages, the\n * 2D→3D bridge, and SVG-oriented processing.\n *\n * @module\n */\nexport * from './curve2d'\nexport * from './bbox2d'\nexport * from './point'\nexport * from './svg-ellipse'\nexport { BaseSketcher2d } from './pen-sketcher'\nexport type { SplineOptions, CornerMode } from './pen-sketcher'\nexport { BlueprintSketcher } from './blueprint-sketcher'\nexport { polysidesBlueprint, roundedRectangleBlueprint } from './canned-blueprints'\nexport * from './blueprint'\nexport * from './compound-blueprint'\nexport * from './blueprints'\nexport * from './organise'"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* organiseBlueprints — classify a set of 2D profiles (outer / holes / disjoint)
|
|
3
|
+
* into Blueprint / CompoundBlueprint / Blueprints (pure-data port of brepjs
|
|
4
|
+
* `2d/blueprints/lib.ts`, Apache-2.0).
|
|
5
|
+
*
|
|
6
|
+
* Adaptation notes:
|
|
7
|
+
* - brepjs uses Flatbush to accelerate bbox-overlap grouping; faijs uses an
|
|
8
|
+
* equivalent union-find over pairwise bbox overlap (O(n²), constant factor at
|
|
9
|
+
* profile scale), documented in an Agent Note. Classification results are
|
|
10
|
+
* identical to brepjs for the non-crossing cases the algorithm handles.
|
|
11
|
+
* - `addContainmentInfo` probes the midpoint of the first curve of each
|
|
12
|
+
* blueprint and runs `isInside` (exact ray-cast via intersectCurves2dFn).
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*/
|
|
16
|
+
import { Blueprint } from './blueprint.js';
|
|
17
|
+
import { CompoundBlueprint } from './compound-blueprint.js';
|
|
18
|
+
import { Blueprints } from './blueprints.js';
|
|
19
|
+
/**
|
|
20
|
+
* Groups blueprints so holes nest inside their outer boundaries.
|
|
21
|
+
* The outer boundary of a CompoundBlueprint is blueprints[0]; holes follow.
|
|
22
|
+
* Does not handle profiles that cross each other (same contract as brepjs).
|
|
23
|
+
* @param blueprints - the profiles to classify into outer boundaries and holes.
|
|
24
|
+
* @returns the organised Blueprints, grouping nested holes into CompoundBlueprint profiles.
|
|
25
|
+
*/
|
|
26
|
+
export declare function organiseBlueprints(blueprints: Blueprint[]): Blueprints;
|
|
27
|
+
export type { Blueprint, CompoundBlueprint, Blueprints };
|
|
28
|
+
//# sourceMappingURL=organise.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organise.d.ts","sourceRoot":"","sources":["../../src/geometry2d/organise.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AA+FzC;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,UAAU,CAStE;AAGD,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAA"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { CompoundBlueprint } from './compound-blueprint.js';
|
|
2
|
+
import { Blueprints } from './blueprints.js';
|
|
3
|
+
import { curveBounds, evaluateCurve2d } from './curve2d.js';
|
|
4
|
+
import { isBBoxOut } from './bbox2d.js';
|
|
5
|
+
/** Group blueprints whose bounding boxes overlap (union-find over overlap graph). */
|
|
6
|
+
function groupByBoundingBoxOverlap(blueprints) {
|
|
7
|
+
if (blueprints.length === 0)
|
|
8
|
+
return [];
|
|
9
|
+
if (blueprints.length === 1)
|
|
10
|
+
return [[blueprints[0]]];
|
|
11
|
+
// Build overlap neighbor lists (only j > i to avoid duplicating each pair)
|
|
12
|
+
const overlaps = blueprints.map(() => []);
|
|
13
|
+
for (let i = 0; i < blueprints.length; i++) {
|
|
14
|
+
const bi = blueprints[i];
|
|
15
|
+
for (let j = i + 1; j < blueprints.length; j++) {
|
|
16
|
+
if (!isBBoxOut(bi.boundingBox, blueprints[j].boundingBox)) {
|
|
17
|
+
overlaps[i].push(j);
|
|
18
|
+
overlaps[j].push(i);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Union-find
|
|
23
|
+
const parent = blueprints.map((_, i) => i);
|
|
24
|
+
const find = (x) => {
|
|
25
|
+
while (parent[x] !== x) {
|
|
26
|
+
parent[x] = parent[parent[x]];
|
|
27
|
+
x = parent[x];
|
|
28
|
+
}
|
|
29
|
+
return x;
|
|
30
|
+
};
|
|
31
|
+
const union = (a, b) => {
|
|
32
|
+
const ra = find(a);
|
|
33
|
+
const rb = find(b);
|
|
34
|
+
if (ra !== rb)
|
|
35
|
+
parent[rb] = ra;
|
|
36
|
+
};
|
|
37
|
+
for (let i = 0; i < overlaps.length; i++) {
|
|
38
|
+
for (const j of overlaps[i])
|
|
39
|
+
union(i, j);
|
|
40
|
+
}
|
|
41
|
+
const byRoot = new Map();
|
|
42
|
+
for (let i = 0; i < blueprints.length; i++) {
|
|
43
|
+
const root = find(i);
|
|
44
|
+
const list = byRoot.get(root);
|
|
45
|
+
if (list)
|
|
46
|
+
list.push(blueprints[i]);
|
|
47
|
+
else
|
|
48
|
+
byRoot.set(root, [blueprints[i]]);
|
|
49
|
+
}
|
|
50
|
+
return [...byRoot.values()];
|
|
51
|
+
}
|
|
52
|
+
/** Probe each blueprint with its first-curve midpoint; gather containing blueprints. */
|
|
53
|
+
function addContainmentInfo(groupedBlueprints) {
|
|
54
|
+
return groupedBlueprints.map((blueprint) => {
|
|
55
|
+
const firstCurve = blueprint.curves[0];
|
|
56
|
+
const b = curveBounds(firstCurve);
|
|
57
|
+
const point = evaluateCurve2d(firstCurve, (b.first + b.last) / 2);
|
|
58
|
+
const isIn = groupedBlueprints.filter((potentialOuter) => {
|
|
59
|
+
if (potentialOuter === blueprint)
|
|
60
|
+
return false;
|
|
61
|
+
return potentialOuter.isInside(point);
|
|
62
|
+
});
|
|
63
|
+
return { blueprint, isIn };
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function splitMultipleOuterBlueprints(outerBlueprint, allGrouped) {
|
|
67
|
+
return outerBlueprint.flatMap(({ blueprint: outerBlueprint }) => {
|
|
68
|
+
return cleanEdgeCases(allGrouped.filter(({ blueprint, isIn }) => blueprint === outerBlueprint || isIn.includes(outerBlueprint)));
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function handleNestedBlueprints(nestedBlueprints, allBlueprints) {
|
|
72
|
+
// First level: all profiles contained in ≤1 ancestor; deeper levels re-grouped.
|
|
73
|
+
const firstLevelOuter = allBlueprints.filter(({ isIn }) => isIn.length <= 1);
|
|
74
|
+
const innerLevels = cleanEdgeCases(addContainmentInfo(nestedBlueprints.map(({ blueprint }) => blueprint)));
|
|
75
|
+
return [firstLevelOuter, ...innerLevels];
|
|
76
|
+
}
|
|
77
|
+
function cleanEdgeCases(groupedBlueprints) {
|
|
78
|
+
if (!groupedBlueprints.length)
|
|
79
|
+
return [];
|
|
80
|
+
const outerBlueprints = groupedBlueprints.filter(({ isIn }) => isIn.length === 0);
|
|
81
|
+
const nestedBlueprints = groupedBlueprints.filter(({ isIn }) => isIn.length > 1);
|
|
82
|
+
if (outerBlueprints.length === 1 && nestedBlueprints.length === 0) {
|
|
83
|
+
return [groupedBlueprints];
|
|
84
|
+
}
|
|
85
|
+
else if (outerBlueprints.length > 1) {
|
|
86
|
+
return splitMultipleOuterBlueprints(outerBlueprints, groupedBlueprints);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
return handleNestedBlueprints(nestedBlueprints, groupedBlueprints);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Groups blueprints so holes nest inside their outer boundaries.
|
|
94
|
+
* The outer boundary of a CompoundBlueprint is blueprints[0]; holes follow.
|
|
95
|
+
* Does not handle profiles that cross each other (same contract as brepjs).
|
|
96
|
+
* @param blueprints - the profiles to classify into outer boundaries and holes.
|
|
97
|
+
* @returns the organised Blueprints, grouping nested holes into CompoundBlueprint profiles.
|
|
98
|
+
*/
|
|
99
|
+
export function organiseBlueprints(blueprints) {
|
|
100
|
+
const basicGrouping = groupByBoundingBoxOverlap(blueprints).map(addContainmentInfo);
|
|
101
|
+
return new Blueprints(basicGrouping.flatMap(cleanEdgeCases).map((compounds) => {
|
|
102
|
+
if (compounds.length === 1)
|
|
103
|
+
return compounds[0].blueprint;
|
|
104
|
+
compounds.sort((a, b) => a.isIn.length - b.isIn.length);
|
|
105
|
+
return new CompoundBlueprint(compounds.map(({ blueprint }) => blueprint));
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=organise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organise.js","sourceRoot":"","sources":["../../src/geometry2d/organise.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * organiseBlueprints — classify a set of 2D profiles (outer / holes / disjoint)\n * into Blueprint / CompoundBlueprint / Blueprints (pure-data port of brepjs\n * `2d/blueprints/lib.ts`, Apache-2.0).\n *\n * Adaptation notes:\n * - brepjs uses Flatbush to accelerate bbox-overlap grouping; faijs uses an\n * equivalent union-find over pairwise bbox overlap (O(n²), constant factor at\n * profile scale), documented in an Agent Note. Classification results are\n * identical to brepjs for the non-crossing cases the algorithm handles.\n * - `addContainmentInfo` probes the midpoint of the first curve of each\n * blueprint and runs `isInside` (exact ray-cast via intersectCurves2dFn).\n *\n * @module\n */\nimport { Blueprint } from './blueprint'\nimport { CompoundBlueprint } from './compound-blueprint'\nimport { Blueprints } from './blueprints'\nimport { curveBounds, evaluateCurve2d } from './curve2d'\nimport { isBBoxOut } from './bbox2d'\n\ninterface Grouped {\n /** original index into the input array (used as identity) */\n blueprint: Blueprint\n /** blueprints that contain this one */\n isIn: Blueprint[]\n}\n\n/** Group blueprints whose bounding boxes overlap (union-find over overlap graph). */\nfunction groupByBoundingBoxOverlap(blueprints: Blueprint[]): Blueprint[][] {\n if (blueprints.length === 0) return []\n if (blueprints.length === 1) return [[blueprints[0]!]]\n // Build overlap neighbor lists (only j > i to avoid duplicating each pair)\n const overlaps: number[][] = blueprints.map(() => [])\n for (let i = 0; i < blueprints.length; i++) {\n const bi = blueprints[i]!\n for (let j = i + 1; j < blueprints.length; j++) {\n if (!isBBoxOut(bi.boundingBox, blueprints[j]!.boundingBox)) {\n overlaps[i]!.push(j)\n overlaps[j]!.push(i)\n }\n }\n }\n // Union-find\n const parent = blueprints.map((_, i) => i)\n const find = (x: number): number => {\n while (parent[x] !== x) {\n parent[x] = parent[parent[x]]!\n x = parent[x]!\n }\n return x\n }\n const union = (a: number, b: number): void => {\n const ra = find(a)\n const rb = find(b)\n if (ra !== rb) parent[rb] = ra\n }\n for (let i = 0; i < overlaps.length; i++) {\n for (const j of overlaps[i]!) union(i, j)\n }\n const byRoot = new Map<number, Blueprint[]>()\n for (let i = 0; i < blueprints.length; i++) {\n const root = find(i)\n const list = byRoot.get(root)\n if (list) list.push(blueprints[i]!)\n else byRoot.set(root, [blueprints[i]!])\n }\n return [...byRoot.values()]\n}\n\n/** Probe each blueprint with its first-curve midpoint; gather containing blueprints. */\nfunction addContainmentInfo(groupedBlueprints: Blueprint[]): Grouped[] {\n return groupedBlueprints.map((blueprint) => {\n const firstCurve = blueprint.curves[0]!\n const b = curveBounds(firstCurve)\n const point = evaluateCurve2d(firstCurve, (b.first + b.last) / 2)\n const isIn = groupedBlueprints.filter((potentialOuter) => {\n if (potentialOuter === blueprint) return false\n return potentialOuter.isInside(point as [number, number])\n })\n return { blueprint, isIn }\n })\n}\n\nfunction splitMultipleOuterBlueprints(outerBlueprint: Grouped[], allGrouped: Grouped[]): Grouped[][] {\n return outerBlueprint.flatMap(({ blueprint: outerBlueprint }) => {\n return cleanEdgeCases(\n allGrouped.filter(({ blueprint, isIn }) => blueprint === outerBlueprint || isIn.includes(outerBlueprint)),\n )\n })\n}\n\nfunction handleNestedBlueprints(nestedBlueprints: Grouped[], allBlueprints: Grouped[]): Grouped[][] {\n // First level: all profiles contained in ≤1 ancestor; deeper levels re-grouped.\n const firstLevelOuter = allBlueprints.filter(({ isIn }) => isIn.length <= 1)\n const innerLevels = cleanEdgeCases(addContainmentInfo(nestedBlueprints.map(({ blueprint }) => blueprint)))\n return [firstLevelOuter, ...innerLevels]\n}\n\nfunction cleanEdgeCases(groupedBlueprints: Grouped[]): Grouped[][] {\n if (!groupedBlueprints.length) return []\n const outerBlueprints = groupedBlueprints.filter(({ isIn }) => isIn.length === 0)\n const nestedBlueprints = groupedBlueprints.filter(({ isIn }) => isIn.length > 1)\n if (outerBlueprints.length === 1 && nestedBlueprints.length === 0) {\n return [groupedBlueprints]\n } else if (outerBlueprints.length > 1) {\n return splitMultipleOuterBlueprints(outerBlueprints, groupedBlueprints)\n } else {\n return handleNestedBlueprints(nestedBlueprints, groupedBlueprints)\n }\n}\n\n/**\n * Groups blueprints so holes nest inside their outer boundaries.\n * The outer boundary of a CompoundBlueprint is blueprints[0]; holes follow.\n * Does not handle profiles that cross each other (same contract as brepjs).\n * @param blueprints - the profiles to classify into outer boundaries and holes.\n * @returns the organised Blueprints, grouping nested holes into CompoundBlueprint profiles.\n */\nexport function organiseBlueprints(blueprints: Blueprint[]): Blueprints {\n const basicGrouping = groupByBoundingBoxOverlap(blueprints).map(addContainmentInfo)\n return new Blueprints(\n basicGrouping.flatMap(cleanEdgeCases).map((compounds) => {\n if (compounds.length === 1) return compounds[0]!.blueprint\n compounds.sort((a, b) => a.isIn.length - b.isIn.length)\n return new CompoundBlueprint(compounds.map(({ blueprint }) => blueprint))\n }),\n )\n}\n\n// re-export container types for convenience\nexport type { Blueprint, CompoundBlueprint, Blueprints }"]}
|