@logomarks/core 0.1.9 → 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 (133) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +10 -1
  3. package/package.json +59 -4
  4. package/src/batch/args.d.ts +18 -0
  5. package/src/batch/args.js +44 -0
  6. package/src/batch/index.d.ts +7 -0
  7. package/src/batch/index.js +10 -0
  8. package/src/batch/run.d.ts +53 -0
  9. package/src/batch/run.js +92 -0
  10. package/src/batch/slug.d.ts +2 -0
  11. package/src/batch/slug.js +12 -0
  12. package/src/batch/source.d.ts +12 -0
  13. package/src/batch/source.js +23 -0
  14. package/src/fit/index.d.ts +4 -0
  15. package/src/fit/index.js +29 -5
  16. package/src/font/glyphs.d.ts +31 -0
  17. package/src/font/glyphs.js +228 -0
  18. package/src/font/index.d.ts +10 -0
  19. package/src/font/index.js +10 -0
  20. package/src/font/measure.d.ts +16 -0
  21. package/src/font/measure.js +201 -0
  22. package/src/font/moves.d.ts +42 -0
  23. package/src/font/moves.js +263 -0
  24. package/src/forms/discs.d.ts +20 -0
  25. package/src/forms/discs.js +114 -0
  26. package/src/forms/emblems.d.ts +22 -0
  27. package/src/forms/emblems.js +109 -0
  28. package/src/forms/flow.d.ts +21 -0
  29. package/src/forms/flow.js +80 -0
  30. package/src/forms/folds.d.ts +18 -0
  31. package/src/forms/folds.js +147 -0
  32. package/src/forms/geo.d.ts +46 -0
  33. package/src/forms/geo.js +233 -0
  34. package/src/forms/hooks.d.ts +40 -0
  35. package/src/forms/hooks.js +204 -0
  36. package/src/forms/index.d.ts +22 -0
  37. package/src/forms/index.js +24 -0
  38. package/src/forms/jog.d.ts +33 -0
  39. package/src/forms/jog.js +162 -0
  40. package/src/forms/lines.d.ts +32 -0
  41. package/src/forms/lines.js +233 -0
  42. package/src/forms/ref.d.ts +41 -0
  43. package/src/forms/ref.js +246 -0
  44. package/src/forms/shatter.d.ts +40 -0
  45. package/src/forms/shatter.js +341 -0
  46. package/src/forms/slats.d.ts +35 -0
  47. package/src/forms/slats.js +78 -0
  48. package/src/forms/swash.d.ts +23 -0
  49. package/src/forms/swash.js +74 -0
  50. package/src/forms/tech.d.ts +40 -0
  51. package/src/forms/tech.js +293 -0
  52. package/src/forms/tracks.d.ts +36 -0
  53. package/src/forms/tracks.js +121 -0
  54. package/src/geometry/index.d.ts +1 -0
  55. package/src/geometry/index.js +1 -0
  56. package/src/geometry/mitre.d.ts +8 -0
  57. package/src/geometry/mitre.js +64 -0
  58. package/src/geometry/modular.d.ts +1 -1
  59. package/src/index.js +2 -1
  60. package/src/iso/index.d.ts +5 -0
  61. package/src/iso/index.js +13 -0
  62. package/src/iso/objects.d.ts +168 -0
  63. package/src/iso/objects.js +1042 -0
  64. package/src/iso/planes.d.ts +27 -0
  65. package/src/iso/planes.js +138 -0
  66. package/src/iso/voxels.d.ts +43 -0
  67. package/src/iso/voxels.js +255 -0
  68. package/src/letters/blackletter.d.ts +31 -0
  69. package/src/letters/blackletter.js +199 -0
  70. package/src/letters/dotstroke.d.ts +16 -0
  71. package/src/letters/dotstroke.js +77 -0
  72. package/src/letters/echo.d.ts +42 -0
  73. package/src/letters/echo.js +246 -0
  74. package/src/letters/frame.d.ts +6 -0
  75. package/src/letters/frame.js +14 -0
  76. package/src/letters/index.d.ts +16 -0
  77. package/src/letters/index.js +18 -0
  78. package/src/letters/inktrap.d.ts +66 -0
  79. package/src/letters/inktrap.js +244 -0
  80. package/src/letters/mono.d.ts +145 -0
  81. package/src/letters/mono.js +684 -0
  82. package/src/letters/pillar.d.ts +31 -0
  83. package/src/letters/pillar.js +257 -0
  84. package/src/letters/serif.d.ts +109 -0
  85. package/src/letters/serif.js +666 -0
  86. package/src/letters/stair.d.ts +8 -0
  87. package/src/letters/stair.js +43 -0
  88. package/src/letters/stem.d.ts +29 -0
  89. package/src/letters/stem.js +205 -0
  90. package/src/objects/animals.d.ts +105 -0
  91. package/src/objects/animals.js +469 -0
  92. package/src/objects/bio.d.ts +14 -0
  93. package/src/objects/bio.js +76 -0
  94. package/src/objects/devglyphs.d.ts +34 -0
  95. package/src/objects/devglyphs.js +226 -0
  96. package/src/objects/devices.d.ts +31 -0
  97. package/src/objects/devices.js +114 -0
  98. package/src/objects/faces.d.ts +94 -0
  99. package/src/objects/faces.js +344 -0
  100. package/src/objects/food.d.ts +12 -0
  101. package/src/objects/food.js +74 -0
  102. package/src/objects/index.d.ts +13 -0
  103. package/src/objects/index.js +18 -0
  104. package/src/objects/rosettes.d.ts +14 -0
  105. package/src/objects/rosettes.js +64 -0
  106. package/src/objects/sport.d.ts +8 -0
  107. package/src/objects/sport.js +37 -0
  108. package/src/objects/weapons.d.ts +31 -0
  109. package/src/objects/weapons.js +179 -0
  110. package/src/parts/index.d.ts +2 -0
  111. package/src/parts/index.js +2 -0
  112. package/src/parts/pixels.d.ts +11 -0
  113. package/src/parts/pixels.js +74 -0
  114. package/src/parts/run.js +4 -2
  115. package/src/parts/span.d.ts +13 -0
  116. package/src/parts/span.js +100 -0
  117. package/src/pixels/dither.d.ts +78 -0
  118. package/src/pixels/dither.js +399 -0
  119. package/src/pixels/emote.d.ts +6 -0
  120. package/src/pixels/emote.js +76 -0
  121. package/src/pixels/index.d.ts +7 -0
  122. package/src/pixels/index.js +8 -0
  123. package/src/sdf/fields.js +135 -0
  124. package/src/sdf/gap.js +42 -0
  125. package/src/sdf/index.d.ts +58 -0
  126. package/src/sdf/index.js +14 -0
  127. package/src/sdf/ops.js +102 -0
  128. package/src/sdf/trace.js +90 -0
  129. package/src/sdf/y2k.d.ts +12 -0
  130. package/src/sdf/y2k.js +80 -0
  131. package/src/skill/bundle.js +1 -1
  132. package/src/util/vec.d.ts +14 -0
  133. package/src/util/vec.js +61 -0
@@ -16,6 +16,7 @@ export { signedArea, area, perimeter, ringBox, bbox, winding, dedupe, openRing,
16
16
  export { seeded } from './random.js';
17
17
  export { circle, ellipse, rect, regular, annulus, sector, arcBand, rotN, bar, ring, roundPoly, rr, lens, drop, squircle, pill, egg } from './shapes.js';
18
18
  export { stroke, weave, offsetPts, fillet, tracks, filletClosed, trackLoop, walk, balloon, linePts, arcPts, joinPts } from './stroke.js';
19
+ export { mitreOffset, mitreBand, offsetPolygon } from './mitre.js';
19
20
  export { toPath, svg, write } from './path.js';
20
21
  export { grow, soften, grown, over, slices } from './offset.js';
21
22
  export { iso, cubes, isoPrism, isoBlock, isoRing, isoPile } from './iso.js';
@@ -9,6 +9,7 @@ export { signedArea, area, perimeter, ringBox, bbox, winding, dedupe, openRing,
9
9
  export { seeded } from './random.js';
10
10
  export { circle, ellipse, rect, regular, annulus, sector, arcBand, rotN, bar, ring, roundPoly, rr, lens, drop, squircle, pill, egg } from './shapes.js';
11
11
  export { stroke, weave, offsetPts, fillet, tracks, filletClosed, trackLoop, walk, balloon, linePts, arcPts, joinPts } from './stroke.js';
12
+ export { mitreOffset, mitreBand, offsetPolygon } from './mitre.js';
12
13
  export { toPath, svg, write } from './path.js';
13
14
  export { grow, soften, grown, over, slices } from './offset.js';
14
15
  export { iso, cubes, isoPrism, isoBlock, isoRing, isoPile } from './iso.js';
@@ -0,0 +1,8 @@
1
+ import type { Point, Shape } from './types.js';
2
+
3
+ /** An open polyline offset d to its left (y down), corners mitred so it runs exactly parallel; d < 0 goes right. */
4
+ export function mitreOffset(pts: readonly (readonly number[])[], d: number): Point[];
5
+ /** A solid band w wide along an open polyline, corners mitred, ends square. */
6
+ export function mitreBand(pts: readonly (readonly number[])[], w: number): Shape;
7
+ /** A closed polygon grown (d > 0) or shrunk (d < 0), corners mitred; either winding. */
8
+ export function offsetPolygon(pts: readonly (readonly number[])[], d: number): Point[];
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Exact offsets with mitred corners: a polyline's parallel, a band along it, and a polygon grown or shrunk.
3
+ */
4
+ import { poly } from './core.js';
5
+
6
+ /**
7
+ * The unit left normal (y down) of the step a → b.
8
+ *
9
+ * @param {readonly number[]} a From.
10
+ * @param {readonly number[]} b To.
11
+ * @returns {number[]} The normal.
12
+ */
13
+ const leftNormal = (a, b) => {
14
+ const v = [b[0] - a[0], b[1] - a[1]], l = Math.hypot(...v) || 1;
15
+ return [v[1] / l, -(v[0] / l)];
16
+ };
17
+
18
+ /**
19
+ * An open polyline offset to its left (y down) by d, every corner mitred, so the offset runs exactly parallel to it
20
+ * (d < 0 offsets to the right). The ends move square to their segments.
21
+ *
22
+ * @param {readonly (readonly number[])[]} pts The polyline.
23
+ * @param {number} d How far.
24
+ * @returns {number[][]} The offset polyline, a point for each point.
25
+ */
26
+ export const mitreOffset = (pts, d) => pts.map((p, i) => {
27
+ const n1 = i > 0 ? leftNormal(pts[i - 1], p) : null, n2 = i < pts.length - 1 ? leftNormal(p, pts[i + 1]) : null;
28
+ if (!n1) return [p[0] + /** @type {number[]} */ (n2)[0] * d, p[1] + /** @type {number[]} */ (n2)[1] * d];
29
+ if (!n2) return [p[0] + n1[0] * d, p[1] + n1[1] * d];
30
+ const s = [n1[0] + n2[0], n1[1] + n2[1]], l = Math.hypot(...s) || 1, m = [s[0] / l, s[1] / l], k = d / (m[0] * n1[0] + m[1] * n1[1]);
31
+ return [p[0] + m[0] * k, p[1] + m[1] * k];
32
+ });
33
+
34
+ /**
35
+ * A solid band w wide along an open polyline, every corner mitred sharp and both ends cut square.
36
+ *
37
+ * @param {readonly (readonly number[])[]} pts The polyline (its centre line).
38
+ * @param {number} w The width.
39
+ * @returns {import('./types.js').Shape} The band.
40
+ */
41
+ export const mitreBand = (pts, w) => poly([...mitreOffset(pts, w / 2), ...mitreOffset(pts, -w / 2).reverse()]);
42
+
43
+ /**
44
+ * A closed polygon grown (d > 0) or shrunk (d < 0) by d, every corner mitred: each edge moves out along its normal and
45
+ * neighbouring edges meet where their lines cross. Either winding. Shrinking past a corner's reach turns it inside out,
46
+ * so keep |d| under the shortest edge's reach.
47
+ *
48
+ * @param {readonly (readonly number[])[]} pts The polygon's corners, in order (open: no repeated first point).
49
+ * @param {number} d How far.
50
+ * @returns {number[][]} The offset polygon, a corner for each corner.
51
+ */
52
+ export const offsetPolygon = (pts, d) => {
53
+ const n = pts.length;
54
+ let a = 0;
55
+ for (let i = 0; i < n; i++) { const p = pts[i], q = pts[(i + 1) % n]; a += p[0] * q[1] - q[0] * p[1]; }
56
+ const sg = a > 0 ? 1 : -1, L = pts.map((p, i) => {
57
+ const q = pts[(i + 1) % n], dx = q[0] - p[0], dy = q[1] - p[1], l = Math.hypot(dx, dy), nx = sg * dy / l, ny = -sg * dx / l;
58
+ return [p[0] + nx * d, p[1] + ny * d, dx, dy];
59
+ });
60
+ return L.map((b, i) => {
61
+ const a2 = L[(i + n - 1) % n], den = a2[2] * b[3] - a2[3] * b[2], t = ((b[0] - a2[0]) * b[3] - (b[1] - a2[1]) * b[2]) / den;
62
+ return [a2[0] + a2[2] * t, a2[1] + a2[3] * t];
63
+ });
64
+ };
@@ -9,6 +9,6 @@ export function isoPieces(pieces: [Point3, Point3][], u?: number, g?: number, ox
9
9
  /** Blocks [x, y, w, h] on a W × H grid, scaled to 448 and parted by g. */
10
10
  export function blocks(list: [number, number, number, number][], W: number, H: number, g?: number): Shape;
11
11
  /** A nested subdivision for blocks(): n − 1 blocks peeled off the sides named in turn (l t r b), each `cut` of what's left. */
12
- export function nest(W: number, H: number, n: number, sides: string, cut: number | ((i: number) => number)): [number, number, number, number][];
12
+ export function nest(W: number, H: number, n: number, sides: string, cut: (w: number, h: number, side: string) => number): [number, number, number, number][];
13
13
  /** Capsules w wide pinned together, back to front, each cut free by g; pin holes at `pins`. */
14
14
  export function linkage(bars: [Point, Point][], pins?: Point[], o?: { w?: number; g?: number; pin?: number }): Shape;
package/src/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * @logomarks/core: geometry, SVG reading, fitting, analysis, similarity, shape edits and stitch plans for logomarks
3
3
  * on a 512 grid. Each area is also its own subpath (`/geometry`, `/svg`, `/fit`, `/raster`, `/analyse`, `/similar`, `/edit`, `/stitch`,
4
- * and `/parts` for the industry-symbol parts, which needs Node for its batch writer).
4
+ * and `/parts` for the industry-symbol parts, which needs Node for its batch writer). The parts subpaths (`/iso`, `/letters`,
5
+ * `/font`, `/pixels`, `/objects`, `/forms`) and `/batch` are imported on their own: their names would clash here.
5
6
  */
6
7
  export * from './geometry/index.js';
7
8
  export { parsePath, bezierAt, arcOf, arcAt, attr, shapes, viewBox, body, outlinePoints, bounds, rings, filledShape } from './svg/index.js';
@@ -0,0 +1,5 @@
1
+ export * from './objects.js';
2
+ export * from './planes.js';
3
+ export * from './voxels.js';
4
+ export type { Part, Flat } from './objects.js';
5
+ export type { PlaneView } from './planes.js';
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @module @logomarks/core/iso
3
+ *
4
+ * Iso parts on top of the parts' solid engine (`scene()` in /parts): iso objects (cylinders, frustums, lathes, roofs,
5
+ * shops with their trade feature, openings cut on the fitted faces, cut-outs square to the viewer drawn by isoFlat(),
6
+ * tipped slabs), flat planes hinged and folded into a scene (planeScene(), iso or oblique), and voxels (sprites and
7
+ * plans as boxes, a pixel sprite with one step of depth, slabs with square gaps, corner monograms). x runs to the front
8
+ * right, y to the front left, z up. The 2D outline helpers here (rect, rr, disc, circ, ell, lens, rot, stroke, band)
9
+ * return point lists for flat() and cuts, not kit shapes.
10
+ */
11
+ export * from './objects.js';
12
+ export * from './planes.js';
13
+ export * from './voxels.js';
@@ -0,0 +1,168 @@
1
+ import type { Point, Point3, Shape } from '../geometry/types.js';
2
+ import type { FittedProjection, Piece } from '../parts/iso.js';
3
+
4
+ export { cross3 } from '../util/vec.js';
5
+
6
+ /** A part: one convex piece, or a list of pieces drawn as one solid. */
7
+ export type Part = Piece | Piece[];
8
+ /** 2D points on a face or a plane. */
9
+ type Pts = readonly (readonly number[])[];
10
+ /** A cut-out square to the viewer, from flat(): its outlines and holes on the facing plane and its depth. */
11
+ export interface Flat {
12
+ outer: number[][][];
13
+ holes: number[][][];
14
+ back: number[];
15
+ }
16
+
17
+ /** The projection scene() fits round these parts. */
18
+ export function fitOf(parts: readonly Part[]): FittedProjection;
19
+ /** The house gap in model units for these parts. */
20
+ export function gapIn(parts: readonly Part[], g: number): number;
21
+ /** 2D points on the face of axis ax at at, as 3D points. */
22
+ export function onFace(ax: 'x' | 'y' | 'z', at: number, pts: Pts): Point3[];
23
+ /** 2D points on the plane o + a·u + b·v, as 3D points. */
24
+ export function onPlane(o: readonly number[], u: readonly number[], v: readonly number[], pts: Pts): Point3[];
25
+ /** Rectangles [a0, b0, a1, b1] on a face, as 3D quads. */
26
+ export function quads(ax: 'x' | 'y' | 'z', at: number, rects: Pts): Point3[][];
27
+ /** A disc of radius r at (a, b) on a face. */
28
+ export function discOn(ax: 'x' | 'y' | 'z', at: number, a: number, b: number, r: number, n?: number): Point3[];
29
+ /** A 2D shape as 3D outlines on the +x or +y face, f model units a canvas unit, centred on (ca, cb). */
30
+ export function shapeOn(ax: 'x' | 'y', at: number, shape: Shape, f: number, ca: number, cb: number): Point3[][];
31
+ /** Iso parts drawn, the 3D outlines in holes cut through them and those in keep put back. */
32
+ export function isoCut(parts: readonly Part[], g: number, holes?: readonly Pts[], keep?: readonly Pts[]): Shape;
33
+ /** A cylinder along x. */
34
+ export function cylX(cy: number, cz: number, r: number, x0: number, x1: number, n?: number): Piece;
35
+ /** A cylinder along y. */
36
+ export function cylY(cx: number, cz: number, r: number, y0: number, y1: number, n?: number): Piece;
37
+ /** An upright frustum, radius r0 at z0 to r1 at z1, n sides turned deg. */
38
+ export function frustum(cx: number, cy: number, r0: number, r1: number, z0: number, z1: number, n?: number, deg?: number): Piece;
39
+ /** A slab hinged on a line along y, leaning back by deg. */
40
+ export function leaning(x: number, z: number, y0: number, y1: number, h: number, t: number, deg: number): Piece;
41
+ /** A flap hinged on the edge p0–p1, folded out along out by deg. */
42
+ export function flap(p0: readonly number[], p1: readonly number[], out: readonly number[], deg: number, L: number, t: number): Piece;
43
+ /** A square-section bar between two 3D points. */
44
+ export function rod(a: readonly number[], b: readonly number[], w: number): Piece;
45
+ /** A round bar between two 3D points, one smooth side. */
46
+ export function tube(a: readonly number[], b: readonly number[], r: number, n?: number): Piece;
47
+ /** A vehicle's wheels on its +y side at y = W. */
48
+ export function wheels(xs: readonly number[], W: number, r?: number, z?: number): Piece[];
49
+ /** A rectangle on the tangent plane at the front of an upright cylinder. */
50
+ export function cylFront(cx: number, cy: number, r: number, w: number, z0: number, z1: number): Point3[];
51
+ /** A ball as one part: rings of frustums, squashed and cut between two latitudes. */
52
+ export function ball(cx: number, cy: number, cz: number, r: number, o?: { squash?: number; rings?: number; from?: number; to?: number }): Piece[];
53
+ /** A band along an arc in a side profile (x, z), pushed along y. */
54
+ export function arcSide(cx: number, cz: number, r0: number, r1: number, a0: number, a1: number, y0: number, y1: number, n?: number): Piece[];
55
+ /** A band along an arc in a front profile (y, z), pushed along x. */
56
+ export function arcFront(cy: number, cz: number, r0: number, r1: number, a0: number, a1: number, x0: number, x1: number, n?: number): Piece[];
57
+ /** A gable roof, its ridge along y. */
58
+ export function roofY(x0: number, x1: number, y0: number, y1: number, z0: number, rise: number): Piece;
59
+ /** A gable roof, its ridge along x. */
60
+ export function roofX(x0: number, x1: number, y0: number, y1: number, z0: number, rise: number): Piece;
61
+ /** A shop block with its shopfront cuts and its roof's centre. */
62
+ export function shop(W: number, D: number, H: number, o?: { win?: boolean; door?: number | null; dh?: number }): { parts: Piece[]; cuts: Point3[][]; c: Point3 };
63
+ /** A flat convex profile standing on the roof facing +y. */
64
+ export function sign(pts: Pts, yc: number, t?: number): Piece;
65
+ /** A disc on edge facing +y. */
66
+ export function discY(x: number, z: number, r: number, yc: number, t?: number): Piece;
67
+ /** A disc on edge facing +x. */
68
+ export function discX(y: number, z: number, r: number, xc: number, t?: number): Piece;
69
+ /** 3D points scaled about o by k. */
70
+ export function sc3(pts: Pts, o: readonly number[], k: number): number[][];
71
+ /** A part scaled about o by k. */
72
+ export function scalePart<T extends Part>(part: T, o: readonly number[], k: number): T;
73
+ /** A shop with its trade feature, as a build (g) => shape. */
74
+ export function shopMark(size: readonly number[], feat: (c: number[], W: number, D: number, H: number, k: number) => unknown[], o?: { win?: boolean; door?: number | null; dh?: number; big?: number }): (g: number) => Shape;
75
+ /** A box tapering from w × d at z0 to W × D at z1. */
76
+ export function taper(cx: number, cy: number, w: number, d: number, W: number, D: number, z0: number, z1: number): Piece;
77
+ /** An open box's floor and walls. */
78
+ export function tray(x0: number, y0: number, x1: number, y1: number, h: number, t: number, z0?: number): Piece[];
79
+ /** The facing plane's right-hand axis, along (1, −1, 0). */
80
+ export const FU: Point3;
81
+ /** The facing plane's normal, along (1, 1, 0). */
82
+ export const FN: Point3;
83
+ /** 2D points on the facing plane through o, pushed s towards the viewer. */
84
+ export function onFacing(o: readonly number[], pts: Pts, s?: number): Point3[];
85
+ /** A convex profile on the facing plane, t deep. */
86
+ export function facing(o: readonly number[], pts: Pts, t: number, smooth?: boolean): Piece;
87
+ /** An annulus band on the facing plane, t deep, as convex pieces. */
88
+ export function facingArc(o: readonly number[], c: readonly number[], r0: number, r1: number, a0: number, a1: number, t: number, n?: number): Piece[];
89
+ /** A lathe through a [radius, height] profile. */
90
+ export function lathe(cx: number, cy: number, prof: Pts, n?: number): Piece[];
91
+ /** A cut-out square to the viewer, for isoFlat(). */
92
+ export function flat(o: readonly number[], outer: readonly Pts[], t: number, holes?: readonly Pts[]): Flat;
93
+ /** A 2D outline turned anticlockwise. */
94
+ export function ccw<T extends Pts>(pts: T): T;
95
+ /** flat() with every outline and hole turned anticlockwise. */
96
+ export function flatCcw(o: readonly number[], outer: readonly Pts[], t: number, holes?: readonly Pts[]): Flat;
97
+ /** A flat() scaled about o by k. */
98
+ export function scaleFlat(f: Flat, o: readonly number[], k: number): Flat;
99
+ /** A 2D shape swept along the screen vector v. */
100
+ export function sweep(sh: Shape, v: readonly number[]): Shape;
101
+ /** isoCut() with flat() cut-outs in front of the parts. */
102
+ export function isoFlat(parts: readonly Part[], g: number, flats: readonly Flat[], holes?: readonly Pts[], keep?: readonly Pts[]): Shape;
103
+ /** Points round an ellipse from d0 to d1 degrees (2D, both ends). */
104
+ export function arcPts(a: number, b: number, ra: number, rb: number, d0: number, d1: number, n?: number): Point[];
105
+ /** A slot w wide along p–q, as a quad. */
106
+ export function slot2(p: readonly number[], q: readonly number[], w: number): Point[];
107
+ /** A ring of gap w wide at radius r, as small quads. */
108
+ export function ring2(a: number, b: number, r: number, w: number, n?: number): Point[][];
109
+ /** A part re-aimed: each point to T + x·e1 + y·e2 + z·e3. */
110
+ export function turned<T extends Part>(part: T, T: readonly number[], e1: readonly number[], e2: readonly number[], e3: readonly number[]): T;
111
+ /** A capsule's lathe profile. */
112
+ export function capsule(r: number, L: number, both?: boolean): number[][];
113
+ /** A part built up z turned so its z axis runs from a towards b. */
114
+ export function aimed<T extends Part>(part: T, a: readonly number[], b: readonly number[]): T;
115
+ /** A round pole from a to b. */
116
+ export function pole(a: readonly number[], b: readonly number[], r: number): Piece;
117
+ /** A lathe laid along the horizontal unit vector u, its middle at c. */
118
+ export function lying<T extends Part>(part: T, c: readonly number[], u: readonly number[], len: number): T;
119
+ /** The gap in model units for parts plus flat() cut-outs. */
120
+ export function gapWith(parts: readonly Part[], flats: readonly Flat[], g: number): number;
121
+ /** A circle as n 2D points. */
122
+ export function circ(a: number, b: number, r: number, n?: number): Point[];
123
+ /** A quad along an arm at d degrees from r0 to r1. */
124
+ export function arm(cx: number, cy: number, d: number, r0: number, r1: number, w: number, w1?: number): Point[];
125
+ /** 2D points turned deg anticlockwise about c. */
126
+ export function rot(pts: Pts, deg: number, c?: readonly number[]): Point[];
127
+ /** An ellipse as 2D points, turned deg. */
128
+ export function ell(a: number, b: number, ra: number, rb: number, deg?: number, n?: number): Point[];
129
+ /** The facing plane's vertical foreshortening, √(2/3). */
130
+ export const SQ: number;
131
+ /** A circle on the facing plane that projects round. */
132
+ export function rnd(a: number, b: number, r: number, n?: number): Point[];
133
+ /** A disc's outline as 2D points. */
134
+ export function disc(a: number, b: number, r: number, n?: number): Point[];
135
+ /** A rectangle with rounded corners, as 2D points. */
136
+ export function rr(a0: number, b0: number, a1: number, b1: number, r: number, n?: number): Point[];
137
+ /** An almond from p to q, w wide. */
138
+ export function lens(p: readonly number[], q: readonly number[], w: number, n?: number): Point[];
139
+ /** A slot along a polyline, one quad a segment. */
140
+ export function path2(pts: Pts, w: number): Point[][];
141
+ /** 2D outlines as cuts on the front face of a flat(). */
142
+ export function flatCuts(o: readonly number[], t: number, list: readonly Pts[]): Point3[][];
143
+ /** A roof feature of flat() cut-outs, as shopMark()'s feat. */
144
+ export function roofFlats(fn: (o: number[], k: number) => { flats: Flat[]; cuts?: unknown[]; keep?: unknown[] }): (c: number[], W: number, D: number, H: number, k: number) => unknown[];
145
+ /** A spiral slot as 2D quads. */
146
+ export function spiral(a: number, b: number, r0: number, r1: number, turns: number, w: number, n?: number): Point[][];
147
+ /** Pieces whose side faces merge into one surface. */
148
+ export function smooth(ps: readonly Piece[]): Piece[];
149
+ /** A flame outline, about its foot. */
150
+ export function flame(a: number, b: number, h: number): Point[];
151
+ /** A thick 2D stroke as convex pieces. */
152
+ export function stroke(pts: Pts, w: number): Point[][];
153
+ /** An annulus band as convex 2D quads. */
154
+ export function band(a: number, b: number, r0: number, r1: number, d0: number, d1: number, n?: number): Point[][];
155
+ /** 2D points moved by (da, db). */
156
+ export function mv(pts: Pts, da: number, db: number): Point[];
157
+ /** A rectangle a0–a1 × b0–b1, as four 2D points. */
158
+ export function rect(a0: number, b0: number, a1: number, b1: number): Point[];
159
+ /** A kit glyph on a plane: its outlines to cut and counters to keep. */
160
+ export function glyphOn(k: string, o: readonly number[], u: readonly number[], v: readonly number[], h: number, T?: number): { cut: Point3[][]; keep: Point3[][] };
161
+ /** A 3D point moved by k times v. */
162
+ export function add3(p: readonly number[], v: readonly number[], k?: number): number[];
163
+ /** A ring of gap round a 3D outline, measured on the canvas. */
164
+ export function ringIn(parts: readonly Part[], s: Shape, q: Pts, g: number): Shape;
165
+ /** Keys tiling a 3D outline, cut as islands a canvas gap apart. */
166
+ export function keysIn(parts: readonly Part[], s: Shape, area: Pts, keys: readonly Pts[], g: number): Shape;
167
+ /** A slab tipped back by deg from upright. */
168
+ export function slab(o: readonly number[], deg: number, outline: Pts, t: number, o2?: { dir?: 'x' | 'y'; smooth?: boolean }): { part: Piece; on: (pts: Pts) => number[][]; n: Point3 };