@hatiolab/figure-model 0.7.3 → 0.9.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 (79) hide show
  1. package/dist/authoring-fastening.d.ts +53 -8
  2. package/dist/authoring-fastening.d.ts.map +1 -1
  3. package/dist/authoring-fastening.js +158 -242
  4. package/dist/authoring-fastening.js.map +1 -1
  5. package/dist/authoring-geometry.d.ts +13 -46
  6. package/dist/authoring-geometry.d.ts.map +1 -1
  7. package/dist/authoring-geometry.js +28 -180
  8. package/dist/authoring-geometry.js.map +1 -1
  9. package/dist/authoring-occupancy.d.ts +3 -3
  10. package/dist/authoring-occupancy.d.ts.map +1 -1
  11. package/dist/authoring-occupancy.js +23 -12
  12. package/dist/authoring-occupancy.js.map +1 -1
  13. package/dist/authoring-proportion.d.ts.map +1 -1
  14. package/dist/authoring-proportion.js +15 -3
  15. package/dist/authoring-proportion.js.map +1 -1
  16. package/dist/authoring-types.d.ts +69 -32
  17. package/dist/authoring-types.d.ts.map +1 -1
  18. package/dist/authoring-types.js +14 -0
  19. package/dist/authoring-types.js.map +1 -1
  20. package/dist/command-preview.d.ts +11 -33
  21. package/dist/command-preview.d.ts.map +1 -1
  22. package/dist/command-preview.js +2 -61
  23. package/dist/command-preview.js.map +1 -1
  24. package/dist/contract.d.ts +1 -1
  25. package/dist/contract.d.ts.map +1 -1
  26. package/dist/examples.js +4 -4
  27. package/dist/examples.js.map +1 -1
  28. package/dist/face-overhang.d.ts +105 -0
  29. package/dist/face-overhang.d.ts.map +1 -0
  30. package/dist/face-overhang.js +357 -0
  31. package/dist/face-overhang.js.map +1 -0
  32. package/dist/fasten-place.d.ts +35 -0
  33. package/dist/fasten-place.d.ts.map +1 -0
  34. package/dist/fasten-place.js +91 -0
  35. package/dist/fasten-place.js.map +1 -0
  36. package/dist/gate.d.ts.map +1 -1
  37. package/dist/gate.js +7 -4
  38. package/dist/gate.js.map +1 -1
  39. package/dist/graph.d.ts.map +1 -1
  40. package/dist/graph.js +16 -2
  41. package/dist/graph.js.map +1 -1
  42. package/dist/index.d.ts +7 -3
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +7 -3
  45. package/dist/index.js.map +1 -1
  46. package/dist/joint-fields.d.ts +12 -0
  47. package/dist/joint-fields.d.ts.map +1 -0
  48. package/dist/joint-fields.js +20 -0
  49. package/dist/joint-fields.js.map +1 -0
  50. package/dist/joint-writing.d.ts +7 -2
  51. package/dist/joint-writing.d.ts.map +1 -1
  52. package/dist/joint-writing.js +224 -119
  53. package/dist/joint-writing.js.map +1 -1
  54. package/dist/kernel-version.d.ts +1 -1
  55. package/dist/kernel-version.js +1 -1
  56. package/dist/proposal.js +4 -4
  57. package/dist/proposal.js.map +1 -1
  58. package/dist/recipe.js +1 -1
  59. package/dist/recipe.js.map +1 -1
  60. package/dist/resize-plan.js +1 -1
  61. package/dist/resize-plan.js.map +1 -1
  62. package/dist/robots.d.ts.map +1 -1
  63. package/dist/robots.js +24 -22
  64. package/dist/robots.js.map +1 -1
  65. package/dist/shape-edit.d.ts.map +1 -1
  66. package/dist/shape-edit.js +7 -3
  67. package/dist/shape-edit.js.map +1 -1
  68. package/dist/shape-extreme.d.ts +49 -0
  69. package/dist/shape-extreme.d.ts.map +1 -0
  70. package/dist/shape-extreme.js +262 -0
  71. package/dist/shape-extreme.js.map +1 -0
  72. package/dist/shape-ops.d.ts +6 -7
  73. package/dist/shape-ops.d.ts.map +1 -1
  74. package/dist/shape-ops.js +72 -37
  75. package/dist/shape-ops.js.map +1 -1
  76. package/dist/size-edit.d.ts.map +1 -1
  77. package/dist/size-edit.js +40 -11
  78. package/dist/size-edit.js.map +1 -1
  79. package/package.json +1 -1
@@ -0,0 +1,262 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ /*
5
+ * How far a part's real shape reaches along a direction in its own frame (ADR-0140 3.2, 3.4, stage 1): the outermost
6
+ * point, line or face of the shape itself -- not its box. A fastening stands a part on the face it meets by this, and
7
+ * lines it up by the reaches across the face, whatever the part's pose.
8
+ *
9
+ * Written as a graph expression (ADR-0140 3.3, 3.11): the shape's own values times numbers fixed when the joint is
10
+ * written (the direction is the face's normal seen from the part, which the joint fixes), summed; the largest of such
11
+ * sums where which point reaches furthest turns with the sizes -- a drawn section's corners, a frustum's two ends --
12
+ * (`max@1`); and the root of a sum of squares where an ellipse or a spheroid of two radii is slanted (`hypot@1`). The
13
+ * graph is built when the joint is written; a drag runs the evaluator as it is.
14
+ */
15
+ import { figureExtrudeLayoutOf, figureLoftLayoutOf, figureShapeBoundsOf, figureShapeDescriptionOf } from "./shape-ops.js";
16
+ import { FIGURE_SECTION_PLANE } from "./section.js";
17
+ import { partOf, constantOf } from "./authoring-nodes.js";
18
+ import { ownSpansOf, planeOf } from "./authoring-geometry.js";
19
+ import { figureShapeFaces } from "./graph.js";
20
+ import { AXES } from "./words.js";
21
+ const EPS = 1e-12;
22
+ const clean = (k) => (Math.abs(k) < EPS ? 0 : Math.round(k * 1e12) / 1e12);
23
+ /** Terms with one entry per reference, their factors added, the ones that cancel dropped. */
24
+ function summed(terms) {
25
+ const by = new Map();
26
+ for (const t of terms)
27
+ by.set(t.ref, (by.get(t.ref) ?? 0) + t.k);
28
+ return [...by].map(([ref, k]) => ({ ref, k: clean(k) })).filter(t => t.k !== 0);
29
+ }
30
+ export const lin = (terms, constant = 0) => ({ terms: summed(terms), constant: clean(constant) });
31
+ const isLin = (r) => 'terms' in r;
32
+ /** A reach times a number: a sum's factors times it; anything else as it is, times it. */
33
+ export function times(r, k) {
34
+ if (k === 1)
35
+ return r;
36
+ if (isLin(r))
37
+ return lin(r.terms.map(t => ({ ref: t.ref, k: t.k * k })), r.constant * k);
38
+ if ('add' in r)
39
+ return plus(...r.add.map(p => times(p, k)));
40
+ if ('scaled' in r)
41
+ return times(r.scaled, r.k * k);
42
+ return { scaled: r, k: clean(k) };
43
+ }
44
+ /** Sums fold into one; anything else stays a sum of parts. */
45
+ export function plus(...parts) {
46
+ const flat = parts.flatMap(p => ('add' in p ? p.add : [p]));
47
+ const sums = flat.filter(isLin);
48
+ const rest = flat.filter(p => !isLin(p));
49
+ const folded = lin(sums.flatMap(s => s.terms), sums.reduce((c, s) => c + s.constant, 0));
50
+ if (!rest.length)
51
+ return folded;
52
+ return { add: [...(folded.terms.length || folded.constant ? [folded] : []), ...rest] };
53
+ }
54
+ /** The largest of candidates: one candidate is itself; the same sum twice is one. */
55
+ function largest(candidates) {
56
+ const seen = new Map(candidates.map(c => [JSON.stringify(c), c]));
57
+ const unique = [...seen.values()];
58
+ return unique.length === 1 ? unique[0] : { max: unique };
59
+ }
60
+ /** √(a² + b² + …) of reaches: a zero one drops, one left is its own size. */
61
+ function root(parts) {
62
+ const live = parts.filter(p => !(isLin(p) && !p.terms.length && !p.constant));
63
+ if (live.length === 1 && isLin(live[0])) {
64
+ const only = live[0];
65
+ /* |k·r| for a positive radius r: the factor's size. */
66
+ return lin(only.terms.map(t => ({ ref: t.ref, k: Math.abs(t.k) })), Math.abs(only.constant));
67
+ }
68
+ return live.length ? { hypot: live } : lin([]);
69
+ }
70
+ /** The reach of a shape along `d` -- a unit vector in its own frame -- from its origin: the one rule (ADR-0140 3.2). */
71
+ function reachOf(input, d) {
72
+ const at = (axis) => d[AXES.indexOf(axis)];
73
+ if (input.kind === 'box')
74
+ return plus(...AXES.filter(x => Math.abs(at(x)) >= EPS).map(x => times(at(x) > 0 ? input.hi[x] : input.lo[x], at(x))));
75
+ if (input.kind === 'sphere') {
76
+ const across = Math.hypot(...AXES.filter(x => x !== input.axis).map(at));
77
+ return ellipseReach(input.radial, input.axial, across, at(input.axis));
78
+ }
79
+ const dl = at(input.axis);
80
+ /* Along the push: the end the direction goes toward. */
81
+ const toward = (end) => times(input.ends[end], dl);
82
+ if (input.kind === 'taper') {
83
+ const across = Math.hypot(...AXES.filter(x => x !== input.axis).map(at));
84
+ /* The rim that reaches further, with the sizes. */
85
+ return largest([plus(toward('lo'), times(input.radii[0], across)), plus(toward('hi'), times(input.radii[1], across))]);
86
+ }
87
+ const [a, b] = input.plane;
88
+ const da = at(a), db = at(b);
89
+ const corner = ([pa, pb]) => plus(times(pa, da), times(pb, db));
90
+ if (input.kind === 'loft') {
91
+ /* A pyramid: its base's corners at the start, or its apex at the end -- whichever reaches further, with the sizes. */
92
+ const base = input.points.map(c => plus(corner(c), toward('lo')));
93
+ const apex = plus(toward('hi'), corner(input.apex));
94
+ /* Straight along its axis the base and the apex differ by its length alone, which is positive: the end is known. */
95
+ if (Math.abs(da) < EPS && Math.abs(db) < EPS)
96
+ return dl > 0 ? apex : base[0];
97
+ return largest([...base, apex]);
98
+ }
99
+ const push = toward(dl > 0 ? 'hi' : 'lo');
100
+ if (input.kind === 'rounded') {
101
+ /* Rounded corners: the straight sides to where the corners start, and the corner's own quarter ellipse. */
102
+ const sides = plus(times(input.across[0], Math.abs(da) / 2), times(input.corner[0], -Math.abs(da)), times(input.across[1], Math.abs(db) / 2), times(input.corner[1], -Math.abs(db)));
103
+ return plus(push, sides, ellipseReach(input.corner[0], input.corner[1], da, db));
104
+ }
105
+ if (input.kind === 'ellipse')
106
+ return plus(push, ellipseReach(input.radius[0], input.radius[1], da, db));
107
+ /* A drawn section's corners at the start, and along the push its far end the way the direction goes. */
108
+ return plus(push, largest(input.points.map(corner)));
109
+ }
110
+ /** The reach of a part's shape along `d` -- a unit vector in the part's own frame -- from its origin, as graph terms. */
111
+ export function figureShapeExtremeAlong(m, part, d, path) {
112
+ return reachOf(modelReachInput(m, part, path), d);
113
+ }
114
+ /**
115
+ * How far an evaluated shape reaches along `d` (a unit vector in its own frame), in millimetres: the most and the
116
+ * least of it, from its origin -- the same rule a fastening stands a part by, read from the shape as evaluated.
117
+ */
118
+ export function figureShapeReachOf(shape, d) {
119
+ const input = evaluatedReachInput(shape);
120
+ const neg = d.map(v => -v);
121
+ return { max: figureReachValue(reachOf(input, d), {}), min: -figureReachValue(reachOf(input, neg), {}) };
122
+ }
123
+ /** A shape's measures as graph terms: its node's arguments, and its ends along a push as the faces there lie. */
124
+ function modelReachInput(m, part, path) {
125
+ const { shape } = partOf(m, part, path);
126
+ const description = figureShapeDescriptionOf(shape, m);
127
+ const ref = (i) => lin([{ ref: shape.args[i], k: 1 }]);
128
+ /*
129
+ Its two ends along a push, as the faces there lie: a centred push's ends are ±half its length, read through the
130
+ graph (`figureShapeFaces`), not its start and its length -- which are one value on paper only when written so.
131
+ */
132
+ const faces = figureShapeFaces(shape, m) ?? {};
133
+ const endsAlong = (axis) => {
134
+ const [lo, hi] = { x: ['left', 'right'], y: ['bottom', 'top'], z: ['back', 'front'] }[axis];
135
+ const start = [{ ref: shape.args[0], k: 1 }];
136
+ return {
137
+ lo: lin(faces[lo] ? planeOf(shape, faces[lo]) : start),
138
+ hi: lin(faces[hi] ? planeOf(shape, faces[hi]) : [...start, { ref: shape.args[1], k: 1 }])
139
+ };
140
+ };
141
+ const box = () => {
142
+ const spans = ownSpansOf(m, part, path);
143
+ return {
144
+ kind: 'box',
145
+ lo: Object.fromEntries(AXES.map(x => [x, lin(spans[x].lo)])),
146
+ hi: Object.fromEntries(AXES.map(x => [x, lin(spans[x].hi)]))
147
+ };
148
+ };
149
+ const drawn = (L) => {
150
+ const [a, b] = L.plane;
151
+ return L.points.map(q => [ref(L.arg.point[q][a]), ref(L.arg.point[q][b])]);
152
+ };
153
+ if (shape.op === 'extrude@1') {
154
+ const L = figureExtrudeLayoutOf(shape.params, shape.id);
155
+ const plane = L.plane;
156
+ const ends = endsAlong(L.axis);
157
+ if (L.section === 'portal' || (L.section === 'rectangle' && !L.rounded))
158
+ return box();
159
+ const across = () => [ref(L.arg.across[plane[0]]), ref(L.arg.across[plane[1]])];
160
+ if (L.section === 'rectangle')
161
+ return { kind: 'rounded', axis: L.axis, plane, ends, across: across(), corner: [ref(L.arg.corner[plane[0]]), ref(L.arg.corner[plane[1]])] };
162
+ if (L.section === 'ellipse')
163
+ return { kind: 'ellipse', axis: L.axis, plane, ends, radius: across() };
164
+ return { kind: 'polygon', axis: L.axis, plane, ends, points: drawn(L) };
165
+ }
166
+ if (shape.op === 'loft@1') {
167
+ const L = figureLoftLayoutOf(shape.params, shape.id);
168
+ const plane = L.plane;
169
+ return { kind: 'loft', axis: L.axis, plane, ends: endsAlong(L.axis), points: drawn(L), apex: [ref(L.apex[plane[0]]), ref(L.apex[plane[1]])] };
170
+ }
171
+ if (shape.op === 'revolve@1') {
172
+ const axis = shape.params.axis;
173
+ /* A half ellipse turned about the axis: radial arg 0, axial arg 1, centred on the origin. */
174
+ if (description?.kind === 'sphere')
175
+ return { kind: 'sphere', axis, radial: ref(0), axial: ref(1) };
176
+ /* A taper: start (0) and length (1) along the axis, a radius at each end (2, 3). */
177
+ return { kind: 'taper', axis, ends: endsAlong(axis), radii: [ref(2), ref(3)] };
178
+ }
179
+ /* A mesh: the kernel holds its bounds, not the file's points -- its reach is the box of its bounds. */
180
+ return box();
181
+ }
182
+ /** An evaluated shape's measures, in millimetres. */
183
+ function evaluatedReachInput(shape) {
184
+ const mm = (v) => lin([], v);
185
+ const box = () => {
186
+ const bounds = figureShapeBoundsOf(shape);
187
+ return {
188
+ kind: 'box',
189
+ lo: Object.fromEntries(AXES.map(x => [x, mm(bounds[x].min)])),
190
+ hi: Object.fromEntries(AXES.map(x => [x, mm(bounds[x].max)]))
191
+ };
192
+ };
193
+ if (shape.extrusion) {
194
+ const e = shape.extrusion;
195
+ const plane = [...FIGURE_SECTION_PLANE[e.axis]];
196
+ const ends = { lo: mm(e.start), hi: mm(e.end) };
197
+ const s = e.section;
198
+ if (s.kind === 'rectangle') {
199
+ const [ca, cb] = plane.map(x => s.corner?.[x] ?? 0);
200
+ if (!ca && !cb)
201
+ return box();
202
+ return { kind: 'rounded', axis: e.axis, plane, ends, across: [mm(s.size[plane[0]]), mm(s.size[plane[1]])], corner: [mm(ca), mm(cb)] };
203
+ }
204
+ if (s.kind === 'ellipse')
205
+ return { kind: 'ellipse', axis: e.axis, plane, ends, radius: [mm(s.radius[plane[0]]), mm(s.radius[plane[1]])] };
206
+ return { kind: 'polygon', axis: e.axis, plane, ends, points: s.points.map(q => [mm(q[plane[0]]), mm(q[plane[1]])]) };
207
+ }
208
+ if (shape.loft) {
209
+ const l = shape.loft;
210
+ const plane = [...FIGURE_SECTION_PLANE[l.axis]];
211
+ return { kind: 'loft', axis: l.axis, plane, ends: { lo: mm(l.start), hi: mm(l.end) }, points: l.section.points.map(q => [mm(q[plane[0]]), mm(q[plane[1]])]), apex: [mm(l.apex[plane[0]] ?? 0), mm(l.apex[plane[1]] ?? 0)] };
212
+ }
213
+ if (shape.revolution) {
214
+ const r = shape.revolution;
215
+ if (r.profile.kind === 'half-ellipse')
216
+ return { kind: 'sphere', axis: r.axis, radial: mm(r.profile.radial), axial: mm(r.profile.axial) };
217
+ return { kind: 'taper', axis: r.axis, ends: { lo: mm(r.profile.start), hi: mm(r.profile.end) }, radii: [mm(r.profile.startRadius), mm(r.profile.endRadius)] };
218
+ }
219
+ return box();
220
+ }
221
+ /** An ellipse of radii `ra`, `rb` along (da, db): √((da·ra)² + (db·rb)²) -- one radius when the two are one value. */
222
+ function ellipseReach(ra, rb, da, db) {
223
+ if (JSON.stringify(ra) === JSON.stringify(rb))
224
+ return times(ra, Math.hypot(da, db));
225
+ return root([times(ra, da), times(rb, db)]);
226
+ }
227
+ /** A reach's value at the graph's values. */
228
+ export function figureReachValue(reach, values) {
229
+ if (isLin(reach))
230
+ return reach.constant + reach.terms.reduce((s, t) => s + t.k * values[t.ref], 0);
231
+ if ('scaled' in reach)
232
+ return reach.k * figureReachValue(reach.scaled, values);
233
+ const parts = ('add' in reach ? reach.add : 'max' in reach ? reach.max : reach.hypot).map(r => figureReachValue(r, values));
234
+ return 'add' in reach ? parts.reduce((s, v) => s + v, 0) : 'max' in reach ? Math.max(...parts) : Math.hypot(...parts);
235
+ }
236
+ /**
237
+ * Write a reach into the graph under `hint` with the joint's `name`, and give the value it is: a sum as `add@1` ·
238
+ * `mul@1` of its terms and a constant, the largest as `max@1`, a root as `hypot@1`, a multiple as `mul@1`. The numbers
239
+ * are the kernel's shared constants, so the same record writes the same nodes.
240
+ */
241
+ export function writeFigureReach(m, name, reach, hint) {
242
+ const node = (op, args, h) => {
243
+ const id = name(h);
244
+ m.nodes.push({ id, op, args, outputs: { value: `${id}.value` } });
245
+ return `${id}.value`;
246
+ };
247
+ const write = (r, h) => {
248
+ if (isLin(r)) {
249
+ const parts = r.terms.map((t, i) => (t.k === 1 ? t.ref : node('mul@1', [t.ref, constantOf(m, 'ratio', t.k, 'k')], `${h}.t${i}`)));
250
+ if (r.constant || !parts.length)
251
+ parts.push(constantOf(m, 'mm', r.constant, 'd'));
252
+ return parts.length === 1 ? parts[0] : parts.slice(1).reduce((acc, p, i) => node('add@1', [acc, p], `${h}.s${i}`), parts[0]);
253
+ }
254
+ if ('scaled' in r)
255
+ return node('mul@1', [write(r.scaled, `${h}.x`), constantOf(m, 'ratio', r.k, 'k')], h);
256
+ const op = 'add' in r ? 'add@1' : 'max' in r ? 'max@1' : 'hypot@1';
257
+ const args = ('add' in r ? r.add : 'max' in r ? r.max : r.hypot).map((p, i) => write(p, `${h}.${i}`));
258
+ return op === 'add@1' ? args.slice(1).reduce((acc, p, i) => node('add@1', [acc, p], `${h}.a${i}`), args[0]) : node(op, args, h);
259
+ };
260
+ return write(reach, hint);
261
+ }
262
+ //# sourceMappingURL=shape-extreme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-extreme.js","sourceRoot":"","sources":["../src/shape-extreme.ts"],"names":[],"mappings":"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"}
@@ -211,14 +211,13 @@ export declare function figureShapeBoundsOf(shape: Pick<FigureEvaluatedShape, 'e
211
211
  max: number;
212
212
  }>;
213
213
  /**
214
- * How far a turned shape reaches along a direction `d` (a unit vector in the shape's frame), from its own origin: the
215
- * support function. A box's is the sum over its corners; a round body's is its axis half-length times how much it
216
- * points along `d` plus its section's own reach -- a wheel at 45° is not its square's diagonal (the forklift, 2026-09).
214
+ * Where an evaluated shape reaches furthest along a direction `d` (a unit vector in its own frame): the point, line or
215
+ * face of it that lies there, as points whose hull it is (ADR-0140 3.8 (나), stage 1). A corner is itself; a rim's
216
+ * furthest point is worked out, not looked for among samples, so a lying roller's line is where it is; a rim or a
217
+ * rounded corner lying flat against `d` is all of it, drawn as many points. Nothing for a mesh -- the kernel knows its
218
+ * box, not where its triangles are -- and for an end the inside opens through: the hull of a ring would cover its hole.
217
219
  */
218
- export declare function figureShapeSupportOf(shape: FigureEvaluatedShape, d: readonly [number, number, number]): {
219
- max: number;
220
- min: number;
221
- };
220
+ export declare function figureShapeContactOf(shape: FigureEvaluatedShape, d: readonly [number, number, number]): Array<[number, number, number]> | undefined;
222
221
  /**
223
222
  * Where a named feature of an evaluated shape sits, in its own frame: the middle of the face (of the inside, for an
224
223
  * inside face), the middle of the shape for `centre`, and for a sphere, which has no flat face, its six extremes.
@@ -1 +1 @@
1
- {"version":3,"file":"shape-ops.d.ts","sourceRoot":"","sources":["../src/shape-ops.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shape-ops.d.ts","sourceRoot":"","sources":["../src/shape-ops.ts"],"names":[],"mappings":"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"}
package/dist/shape-ops.js CHANGED
@@ -674,56 +674,91 @@ export function figureShapeBoundsOf(shape) {
674
674
  return out;
675
675
  }
676
676
  /**
677
- * How far a turned shape reaches along a direction `d` (a unit vector in the shape's frame), from its own origin: the
678
- * support function. A box's is the sum over its corners; a round body's is its axis half-length times how much it
679
- * points along `d` plus its section's own reach -- a wheel at 45° is not its square's diagonal (the forklift, 2026-09).
677
+ * Where an evaluated shape reaches furthest along a direction `d` (a unit vector in its own frame): the point, line or
678
+ * face of it that lies there, as points whose hull it is (ADR-0140 3.8 (나), stage 1). A corner is itself; a rim's
679
+ * furthest point is worked out, not looked for among samples, so a lying roller's line is where it is; a rim or a
680
+ * rounded corner lying flat against `d` is all of it, drawn as many points. Nothing for a mesh -- the kernel knows its
681
+ * box, not where its triangles are -- and for an end the inside opens through: the hull of a ring would cover its hole.
680
682
  */
681
- export function figureShapeSupportOf(shape, d) {
683
+ export function figureShapeContactOf(shape, d) {
684
+ if (shape.mesh)
685
+ return undefined;
682
686
  const idx = { x: 0, y: 1, z: 2 };
683
- const dot = (p) => AXES.reduce((s, x) => s + (p[x] ?? 0) * d[idx[x]], 0);
684
- const span = (pts) => {
685
- const vs = pts.map(dot);
686
- return { max: Math.max(...vs), min: Math.min(...vs) };
687
- };
688
- const disc = (axis, at, ru, rv) => {
687
+ const ARC = 360;
688
+ const points = [];
689
+ /* An ellipse's arc from angle a0 to a1 about (cu, cv) in the plane (u, v), at `along` on the axis: the whole ellipse's
690
+ furthest point along d -- a rounded corner's whole ellipse lies inside the section, so off its arc that point is
691
+ never the furthest and is dropped below -- and all of the arc when d is square to it. */
692
+ const arc = (axis, along, cu, cv, ru, rv, a0, a1) => {
689
693
  const [u, v] = FIGURE_SECTION_PLANE[axis];
690
- const c = at * d[idx[axis]], r = Math.hypot(ru * d[idx[u]], rv * d[idx[v]]);
691
- return { max: c + r, min: c - r };
694
+ const du = d[idx[u]], dv = d[idx[v]];
695
+ const h = Math.hypot(ru * du, rv * dv);
696
+ if (h < 1e-9 * Math.max(ru, rv, 1)) {
697
+ for (let i = 0; i <= ARC * ((a1 - a0) / (2 * Math.PI)); i++) {
698
+ const t = a0 + (i / (ARC * ((a1 - a0) / (2 * Math.PI)))) * (a1 - a0);
699
+ points.push({ [axis]: along, [u]: cu + ru * Math.cos(t), [v]: cv + rv * Math.sin(t) });
700
+ }
701
+ return;
702
+ }
703
+ const t = Math.atan2(rv * dv, ru * du);
704
+ points.push({ [axis]: along, [u]: cu + ru * Math.cos(t), [v]: cv + rv * Math.sin(t) });
692
705
  };
693
- const union = (xs) => ({
694
- max: Math.max(...xs.map(x => x.max)),
695
- min: Math.min(...xs.map(x => x.min))
696
- });
697
706
  if (shape.extrusion) {
698
707
  const e = shape.extrusion;
699
708
  const [u, v] = FIGURE_SECTION_PLANE[e.axis];
700
709
  const s = e.section;
701
- if (s.kind === 'ellipse')
702
- return union([disc(e.axis, e.start, s.radius[u], s.radius[v]), disc(e.axis, e.end, s.radius[u], s.radius[v])]);
703
- const outline = s.kind === 'polygon'
704
- ? s.points
705
- : [-1, 1].flatMap(su => [-1, 1].map(sv => ({ [u]: (su * s.size[u]) / 2, [v]: (sv * s.size[v]) / 2 })));
706
- return span(outline.flatMap(p => [e.start, e.end].map(t => ({ ...p, [e.axis]: t }))));
710
+ const c = shape.cavity;
711
+ const square = Math.abs(Math.abs(d[idx[e.axis]]) - 1) < 1e-9;
712
+ if (c && square && (d[idx[e.axis]] < 0 ? c.start === 'open' : c.end === 'open'))
713
+ return undefined;
714
+ for (const along of [e.start, e.end]) {
715
+ if (s.kind === 'ellipse')
716
+ arc(e.axis, along, 0, 0, s.radius[u], s.radius[v], 0, 2 * Math.PI);
717
+ else if (s.kind === 'polygon')
718
+ points.push(...s.points.map(q => ({ [u]: q[u], [v]: q[v], [e.axis]: along })));
719
+ else {
720
+ const hu = s.size[u] / 2, hv = s.size[v] / 2;
721
+ const ku = Math.min(s.corner?.[u] ?? 0, hu), kv = Math.min(s.corner?.[v] ?? 0, hv);
722
+ for (const [su, sv, a0] of [
723
+ [1, 1, 0],
724
+ [-1, 1, Math.PI / 2],
725
+ [-1, -1, Math.PI],
726
+ [1, -1, (3 * Math.PI) / 2]
727
+ ]) {
728
+ points.push({ [u]: su * hu, [v]: sv * (hv - kv), [e.axis]: along }, { [u]: su * (hu - ku), [v]: sv * hv, [e.axis]: along });
729
+ if (ku > 0 && kv > 0)
730
+ arc(e.axis, along, su * (hu - ku), sv * (hv - kv), ku, kv, a0, a0 + Math.PI / 2);
731
+ }
732
+ }
733
+ }
707
734
  }
708
- if (shape.loft) {
735
+ else if (shape.loft) {
709
736
  const l = shape.loft;
710
- return span([...l.section.points.map(p => ({ ...p, [l.axis]: l.start })), { ...l.apex, [l.axis]: l.end }]);
737
+ points.push(...l.section.points.map(p => ({ ...p, [l.axis]: l.start })), { ...l.apex, [l.axis]: l.end });
711
738
  }
712
- /* A mesh reaches no further than its bounds' corners: the box is what the kernel knows of it. */
713
- if (shape.mesh) {
714
- const b = shape.mesh.bounds;
715
- return span([b.x.min, b.x.max].flatMap(x => [b.y.min, b.y.max].flatMap(y => [b.z.min, b.z.max].map(z => ({ x, y, z })))));
716
- }
717
- const r = shape.revolution;
718
- if (r.profile.kind === 'half-ellipse') {
739
+ else {
740
+ const r = shape.revolution;
719
741
  const [u, v] = FIGURE_SECTION_PLANE[r.axis];
720
- const m = Math.hypot(r.profile.radial * d[idx[u]], r.profile.axial * d[idx[r.axis]], r.profile.radial * d[idx[v]]);
721
- return { max: m, min: -m };
742
+ if (r.profile.kind === 'half-ellipse') {
743
+ const k = { [u]: r.profile.radial, [v]: r.profile.radial, [r.axis]: r.profile.axial };
744
+ const m = Math.hypot(...AXES.map(x => k[x] * d[idx[x]]));
745
+ points.push(Object.fromEntries(AXES.map(x => [x, (k[x] * k[x] * d[idx[x]]) / m])));
746
+ }
747
+ else
748
+ for (const [along, radius] of [
749
+ [r.profile.start, r.profile.startRadius],
750
+ [r.profile.end, r.profile.endRadius]
751
+ ])
752
+ if (radius > 0)
753
+ arc(r.axis, along, 0, 0, radius, radius, 0, 2 * Math.PI);
754
+ else
755
+ points.push({ [r.axis]: along, [u]: 0, [v]: 0 });
722
756
  }
723
- return union([
724
- disc(r.axis, r.profile.start, r.profile.startRadius, r.profile.startRadius),
725
- disc(r.axis, r.profile.end, r.profile.endRadius, r.profile.endRadius)
726
- ]);
757
+ const at = points.map(p => AXES.map(x => p[x] ?? 0));
758
+ const dot = (p) => p[0] * d[0] + p[1] * d[1] + p[2] * d[2];
759
+ const most = Math.max(...at.map(dot));
760
+ const size = Math.max(1, ...at.map(p => Math.hypot(...p)));
761
+ return at.filter(p => dot(p) >= most - 1e-6 * size);
727
762
  }
728
763
  /**
729
764
  * Where a named feature of an evaluated shape sits, in its own frame: the middle of the face (of the inside, for an