@code3d/core 0.0.1-alpha.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 (172) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +824 -0
  3. package/THIRD_PARTY.md +28 -0
  4. package/bld/library/alignment-geometry.d.ts +50 -0
  5. package/bld/library/alignment-geometry.d.ts.map +1 -0
  6. package/bld/library/alignment-geometry.js +322 -0
  7. package/bld/library/alignment-geometry.js.map +1 -0
  8. package/bld/library/bound-solver.d.ts +33 -0
  9. package/bld/library/bound-solver.d.ts.map +1 -0
  10. package/bld/library/bound-solver.js +252 -0
  11. package/bld/library/bound-solver.js.map +1 -0
  12. package/bld/library/extrude.d.ts +8 -0
  13. package/bld/library/extrude.d.ts.map +1 -0
  14. package/bld/library/extrude.js +28 -0
  15. package/bld/library/extrude.js.map +1 -0
  16. package/bld/library/index.d.ts +7 -0
  17. package/bld/library/index.d.ts.map +1 -0
  18. package/bld/library/index.js +3 -0
  19. package/bld/library/index.js.map +1 -0
  20. package/bld/library/kernel-artifact-codec.d.ts +3 -0
  21. package/bld/library/kernel-artifact-codec.d.ts.map +1 -0
  22. package/bld/library/kernel-artifact-codec.js +148 -0
  23. package/bld/library/kernel-artifact-codec.js.map +1 -0
  24. package/bld/library/kernel-cache.d.ts +63 -0
  25. package/bld/library/kernel-cache.d.ts.map +1 -0
  26. package/bld/library/kernel-cache.js +245 -0
  27. package/bld/library/kernel-cache.js.map +1 -0
  28. package/bld/library/kernel-shapes.d.ts +20 -0
  29. package/bld/library/kernel-shapes.d.ts.map +1 -0
  30. package/bld/library/kernel-shapes.js +108 -0
  31. package/bld/library/kernel-shapes.js.map +1 -0
  32. package/bld/library/loft.d.ts +7 -0
  33. package/bld/library/loft.d.ts.map +1 -0
  34. package/bld/library/loft.js +161 -0
  35. package/bld/library/loft.js.map +1 -0
  36. package/bld/library/material.d.ts +12 -0
  37. package/bld/library/material.d.ts.map +1 -0
  38. package/bld/library/material.js +176 -0
  39. package/bld/library/material.js.map +1 -0
  40. package/bld/library/model-color.d.ts +8 -0
  41. package/bld/library/model-color.d.ts.map +1 -0
  42. package/bld/library/model-color.js +36 -0
  43. package/bld/library/model-color.js.map +1 -0
  44. package/bld/library/open-cascade-error.d.ts +2 -0
  45. package/bld/library/open-cascade-error.d.ts.map +1 -0
  46. package/bld/library/open-cascade-error.js +22 -0
  47. package/bld/library/open-cascade-error.js.map +1 -0
  48. package/bld/library/relation-solver.d.ts +29 -0
  49. package/bld/library/relation-solver.d.ts.map +1 -0
  50. package/bld/library/relation-solver.js +258 -0
  51. package/bld/library/relation-solver.js.map +1 -0
  52. package/bld/library/replicad.d.ts +17 -0
  53. package/bld/library/replicad.d.ts.map +1 -0
  54. package/bld/library/replicad.js +24 -0
  55. package/bld/library/replicad.js.map +1 -0
  56. package/bld/library/retained-memory.d.ts +7 -0
  57. package/bld/library/retained-memory.d.ts.map +1 -0
  58. package/bld/library/retained-memory.js +27 -0
  59. package/bld/library/retained-memory.js.map +1 -0
  60. package/bld/library/runtime.d.ts +775 -0
  61. package/bld/library/runtime.d.ts.map +1 -0
  62. package/bld/library/runtime.js +2954 -0
  63. package/bld/library/runtime.js.map +1 -0
  64. package/bld/library/shell.d.ts +7 -0
  65. package/bld/library/shell.d.ts.map +1 -0
  66. package/bld/library/shell.js +221 -0
  67. package/bld/library/shell.js.map +1 -0
  68. package/bld/library/sketch-curve-intersections.d.ts +13 -0
  69. package/bld/library/sketch-curve-intersections.d.ts.map +1 -0
  70. package/bld/library/sketch-curve-intersections.js +117 -0
  71. package/bld/library/sketch-curve-intersections.js.map +1 -0
  72. package/bld/library/sketch-curves.d.ts +31 -0
  73. package/bld/library/sketch-curves.d.ts.map +1 -0
  74. package/bld/library/sketch-curves.js +89 -0
  75. package/bld/library/sketch-curves.js.map +1 -0
  76. package/bld/library/sketch-drag-rules.d.ts +35 -0
  77. package/bld/library/sketch-drag-rules.d.ts.map +1 -0
  78. package/bld/library/sketch-drag-rules.js +522 -0
  79. package/bld/library/sketch-drag-rules.js.map +1 -0
  80. package/bld/library/sketch-face.d.ts +4 -0
  81. package/bld/library/sketch-face.d.ts.map +1 -0
  82. package/bld/library/sketch-face.js +72 -0
  83. package/bld/library/sketch-face.js.map +1 -0
  84. package/bld/library/sketch-incidence.d.ts +26 -0
  85. package/bld/library/sketch-incidence.d.ts.map +1 -0
  86. package/bld/library/sketch-incidence.js +114 -0
  87. package/bld/library/sketch-incidence.js.map +1 -0
  88. package/bld/library/sketch-precision.d.ts +19 -0
  89. package/bld/library/sketch-precision.d.ts.map +1 -0
  90. package/bld/library/sketch-precision.js +55 -0
  91. package/bld/library/sketch-precision.js.map +1 -0
  92. package/bld/library/sketch-regions.d.ts +12 -0
  93. package/bld/library/sketch-regions.d.ts.map +1 -0
  94. package/bld/library/sketch-regions.js +193 -0
  95. package/bld/library/sketch-regions.js.map +1 -0
  96. package/bld/library/sketch-solver.d.ts +97 -0
  97. package/bld/library/sketch-solver.d.ts.map +1 -0
  98. package/bld/library/sketch-solver.js +578 -0
  99. package/bld/library/sketch-solver.js.map +1 -0
  100. package/bld/library/sketch.d.ts +142 -0
  101. package/bld/library/sketch.d.ts.map +1 -0
  102. package/bld/library/sketch.js +650 -0
  103. package/bld/library/sketch.js.map +1 -0
  104. package/bld/library/spatial.d.ts +28 -0
  105. package/bld/library/spatial.d.ts.map +1 -0
  106. package/bld/library/spatial.js +195 -0
  107. package/bld/library/spatial.js.map +1 -0
  108. package/bld/library/three.d.ts +3 -0
  109. package/bld/library/three.d.ts.map +1 -0
  110. package/bld/library/three.js +3 -0
  111. package/bld/library/three.js.map +1 -0
  112. package/bld/library/topology-id.d.ts +24 -0
  113. package/bld/library/topology-id.d.ts.map +1 -0
  114. package/bld/library/topology-id.js +67 -0
  115. package/bld/library/topology-id.js.map +1 -0
  116. package/bld/library/topology-inspection.d.ts +64 -0
  117. package/bld/library/topology-inspection.d.ts.map +1 -0
  118. package/bld/library/topology-inspection.js +267 -0
  119. package/bld/library/topology-inspection.js.map +1 -0
  120. package/bld/library/topology.d.ts +94 -0
  121. package/bld/library/topology.d.ts.map +1 -0
  122. package/bld/library/topology.js +455 -0
  123. package/bld/library/topology.js.map +1 -0
  124. package/bld/node/index.d.ts +2 -0
  125. package/bld/node/index.d.ts.map +1 -0
  126. package/bld/node/index.js +14 -0
  127. package/bld/node/index.js.map +1 -0
  128. package/bld/node/replicad.d.ts +3 -0
  129. package/bld/node/replicad.d.ts.map +1 -0
  130. package/bld/node/replicad.js +3 -0
  131. package/bld/node/replicad.js.map +1 -0
  132. package/bld/tooling/index.d.ts +26 -0
  133. package/bld/tooling/index.d.ts.map +1 -0
  134. package/bld/tooling/index.js +19 -0
  135. package/bld/tooling/index.js.map +1 -0
  136. package/package.json +53 -0
  137. package/src/library/alignment-geometry.ts +431 -0
  138. package/src/library/bound-solver.ts +410 -0
  139. package/src/library/extrude.ts +38 -0
  140. package/src/library/index.ts +88 -0
  141. package/src/library/kernel-artifact-codec.ts +166 -0
  142. package/src/library/kernel-cache.ts +337 -0
  143. package/src/library/kernel-shapes.ts +135 -0
  144. package/src/library/loft.ts +196 -0
  145. package/src/library/material.ts +228 -0
  146. package/src/library/model-color.ts +47 -0
  147. package/src/library/open-cascade-error.ts +26 -0
  148. package/src/library/relation-solver.ts +479 -0
  149. package/src/library/replicad.ts +40 -0
  150. package/src/library/retained-memory.ts +23 -0
  151. package/src/library/runtime.ts +5146 -0
  152. package/src/library/shell.ts +281 -0
  153. package/src/library/sketch-curve-intersections.ts +154 -0
  154. package/src/library/sketch-curves.ts +161 -0
  155. package/src/library/sketch-drag-rules.ts +767 -0
  156. package/src/library/sketch-face.ts +89 -0
  157. package/src/library/sketch-incidence.ts +204 -0
  158. package/src/library/sketch-precision.ts +81 -0
  159. package/src/library/sketch-regions.ts +271 -0
  160. package/src/library/sketch-solver.ts +973 -0
  161. package/src/library/sketch.ts +977 -0
  162. package/src/library/spatial.ts +254 -0
  163. package/src/library/three.ts +2 -0
  164. package/src/library/topology-id.ts +81 -0
  165. package/src/library/topology-inspection.ts +368 -0
  166. package/src/library/topology.ts +776 -0
  167. package/src/library/tsconfig.json +11 -0
  168. package/src/node/index.ts +20 -0
  169. package/src/node/replicad.ts +3 -0
  170. package/src/node/tsconfig.json +16 -0
  171. package/src/tooling/index.ts +160 -0
  172. package/src/tooling/tsconfig.json +15 -0
package/THIRD_PARTY.md ADDED
@@ -0,0 +1,28 @@
1
+ # Sketch solver
2
+
3
+ The 2D sketch runtime uses the unmodified JavaScript/WebAssembly distribution
4
+ of `@salusoft89/planegcs` **1.2.0**, pinned in this package's dependencies and
5
+ the workspace lockfile. Code3D directly adapts its numeric `GcsSystem` API;
6
+ the upstream JSON sketch wrapper is not Code3D's model format.
7
+
8
+ - Distribution: [npm package](https://www.npmjs.com/package/@salusoft89/planegcs/v/1.2.0).
9
+ - Corresponding wrapper/build sources: [Salusoft89/planegcs at ee9b156](https://github.com/Salusoft89/planegcs/tree/ee9b156da9827a91a56a888a53520f63d5cffaa6).
10
+ - Referenced FreeCAD PlaneGCS sources: [FreeCAD at 5f8eac4](https://github.com/FreeCAD/FreeCAD/tree/5f8eac49f31626354ee69bf40616bac801ca5560/src/Mod/Sketcher/App/planegcs).
11
+ - The distributed `LICENSE` and wrapper source headers specify GNU LGPL 2.1
12
+ or later. npm metadata says LGPL-2.0-or-later; retain the actual distributed
13
+ license and notices rather than replacing them with that metadata shorthand.
14
+ - Copyright notices include Miroslav Šerý and Jiří Hon, Salusoft89; FreeCAD
15
+ source files retain their respective original notices.
16
+
17
+ The App's built-in package distribution includes the dependency's own LICENSE,
18
+ source files, README, JS loader and separate WASM asset through the ordinary
19
+ package file manifest. Installed projects resolve the same files from their
20
+ own dependencies; Node uses the dependency's unmodified module initializer.
21
+ The linked source revision contains the upstream native build scripts and
22
+ instructions. This change consumes the published artifact, not a locally
23
+ rebuilt binary. The archive SHA-1 is
24
+ `b43dae3ab1e8eabdc693a56682894b72db953558`; the lockfile pins its SHA-512 integrity.
25
+
26
+ `@code3d/solver` / OndselSolver remains an independent workspace package.
27
+ Current core/App directional-bound relations solve translations directly and
28
+ do not depend on or initialize that package.
@@ -0,0 +1,50 @@
1
+ import { type Edge, type Face } from 'replicad';
2
+ import { type RigidTransform, type Vec3 } from './spatial.js';
3
+ export type AlignmentGeometry = Readonly<{
4
+ kind: 'point';
5
+ point: Vec3;
6
+ }> | Readonly<{
7
+ kind: 'line';
8
+ point: Vec3;
9
+ direction: Vec3;
10
+ }> | Readonly<{
11
+ kind: 'circle' | 'ellipse';
12
+ point: Vec3;
13
+ normal: Vec3;
14
+ major: Vec3;
15
+ radius: number;
16
+ minorRadius: number;
17
+ }> | Readonly<{
18
+ kind: 'plane';
19
+ point: Vec3;
20
+ normal: Vec3;
21
+ }> | Readonly<{
22
+ kind: 'cylinder';
23
+ point: Vec3;
24
+ direction: Vec3;
25
+ radius: number;
26
+ facing: number;
27
+ }> | Readonly<{
28
+ kind: 'sphere';
29
+ point: Vec3;
30
+ radius: number;
31
+ facing: number;
32
+ }>;
33
+ export declare const dot: (a: Vec3, b: Vec3) => number;
34
+ export declare const scale: (a: Vec3, s: number) => Vec3;
35
+ export declare const subtract: (a: Vec3, b: Vec3) => Vec3;
36
+ export declare const cross: (a: Vec3, b: Vec3) => Vec3;
37
+ export declare const unit: (v: Vec3) => Vec3;
38
+ export declare const reject: (v: Vec3, normal: Vec3) => Vec3;
39
+ export declare const perpendicular: (v: Vec3) => Vec3;
40
+ /** Read complete analytic loci, independent of edge/face trimming and parametrization. */
41
+ export declare function edgeGeometry(edge: Edge, direction: number): AlignmentGeometry;
42
+ export declare function faceGeometry(face: Face, facing: number): AlignmentGeometry;
43
+ export declare function transformGeometry(geometry: AlignmentGeometry, pose: RigidTransform): AlignmentGeometry;
44
+ export declare function orderedGeometry(a: AlignmentGeometry, b: AlignmentGeometry): readonly [AlignmentGeometry, AlignmentGeometry];
45
+ /** Reject only proven incompatibilities; unsupported pairs and iteration failures have distinct errors. */
46
+ export declare function validateAlignment(first: AlignmentGeometry, second: AlignmentGeometry): void;
47
+ /** All residuals describe complete analytic loci; no trim endpoints or sampled tangent frames. */
48
+ export declare function alignmentResidual(first: AlignmentGeometry, second: AlignmentGeometry): number[];
49
+ export declare function nearestPoint(point: Vec3, geometry: AlignmentGeometry): Vec3;
50
+ //# sourceMappingURL=alignment-geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alignment-geometry.d.ts","sourceRoot":"","sources":["../../src/library/alignment-geometry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,IAAI,EAAE,KAAK,IAAI,EAAC,MAAM,UAAU,CAAC;AACrD,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,IAAI,EACV,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,iBAAiB,GACzB,QAAQ,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAC,CAAC,GACtC,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,IAAI,CAAA;CAAC,CAAC,GACtD,QAAQ,CAAC;IACP,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,IAAI,CAAC;IACb,KAAK,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,GACF,QAAQ,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,IAAI,CAAA;CAAC,CAAC,GACpD,QAAQ,CAAC;IACP,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,IAAI,CAAC;IACZ,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,GACF,QAAQ,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAAC,CAAC;AAE5E,eAAO,MAAM,GAAG,MAAO,IAAI,KAAK,IAAI,KAAG,MACK,CAAC;AAC7C,eAAO,MAAM,KAAK,MAAO,IAAI,KAAK,MAAM,KAAG,IAI1C,CAAC;AACF,eAAO,MAAM,QAAQ,MAAO,IAAI,KAAK,IAAI,KAAG,IAAmC,CAAC;AAChF,eAAO,MAAM,KAAK,MAAO,IAAI,KAAK,IAAI,KAAG,IAIxC,CAAC;AACF,eAAO,MAAM,IAAI,MAAO,IAAI,KAAG,IAAsC,CAAC;AACtE,eAAO,MAAM,MAAM,MAAO,IAAI,UAAU,IAAI,KAAG,IACH,CAAC;AAC7C,eAAO,MAAM,aAAa,MAAO,IAAI,KAAG,IACuB,CAAC;AAehE,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,iBAAiB,CA6C7E;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,iBAAiB,CA4D1E;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,cAAc,GACnB,iBAAiB,CAkBnB;AAQD,wBAAgB,eAAe,CAC7B,CAAC,EAAE,iBAAiB,EACpB,CAAC,EAAE,iBAAiB,GACnB,SAAS,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAEjD;AAED,2GAA2G;AAC3G,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,iBAAiB,GACxB,IAAI,CAqDN;AAED,kGAAkG;AAClG,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,iBAAiB,GACxB,MAAM,EAAE,CA4EV;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAgF3E"}
@@ -0,0 +1,322 @@
1
+ import { getOC } from 'replicad';
2
+ import { addVectors, composeTransforms, rotateVector, translation, } from './spatial.js';
3
+ export const dot = (a, b) => a.reduce((sum, v, i) => sum + v * b[i], 0);
4
+ export const scale = (a, s) => [
5
+ a[0] * s,
6
+ a[1] * s,
7
+ a[2] * s,
8
+ ];
9
+ export const subtract = (a, b) => addVectors(a, scale(b, -1));
10
+ export const cross = (a, b) => [
11
+ a[1] * b[2] - a[2] * b[1],
12
+ a[2] * b[0] - a[0] * b[2],
13
+ a[0] * b[1] - a[1] * b[0],
14
+ ];
15
+ export const unit = (v) => scale(v, 1 / Math.hypot(...v));
16
+ export const reject = (v, normal) => subtract(v, scale(normal, dot(v, normal)));
17
+ export const perpendicular = (v) => unit(reject(Math.abs(v[0]) < 0.8 ? [1, 0, 0] : [0, 1, 0], v));
18
+ function coordinates(value) {
19
+ try {
20
+ return [value.X(), value.Y(), value.Z()];
21
+ }
22
+ finally {
23
+ value.delete();
24
+ }
25
+ }
26
+ /** Read complete analytic loci, independent of edge/face trimming and parametrization. */
27
+ export function edgeGeometry(edge, direction) {
28
+ const oc = getOC();
29
+ const adaptor = new oc.BRepAdaptor_Curve(edge.wrapped);
30
+ try {
31
+ if (edge.geomType === 'LINE') {
32
+ const point = edge.pointAt(0), tangent = edge.tangentAt(0);
33
+ try {
34
+ const axis = scale(tangent.toTuple(), direction);
35
+ return {
36
+ kind: 'line',
37
+ point: reject(point.toTuple(), axis),
38
+ direction: axis,
39
+ };
40
+ }
41
+ finally {
42
+ point.delete();
43
+ tangent.delete();
44
+ }
45
+ }
46
+ if (edge.geomType === 'CIRCLE' || edge.geomType === 'ELLIPSE') {
47
+ const curve = edge.geomType === 'CIRCLE' ? adaptor.Circle() : adaptor.Ellipse();
48
+ const frame = curve.Position();
49
+ try {
50
+ const radius = 'Radius' in curve ? curve.Radius() : curve.MajorRadius();
51
+ const minorRadius = 'Radius' in curve ? radius : curve.MinorRadius();
52
+ return {
53
+ kind: Math.abs(radius - minorRadius) < 1e-10 ? 'circle' : 'ellipse',
54
+ point: coordinates(curve.Location()),
55
+ normal: scale(coordinates(frame.Direction()), direction),
56
+ major: coordinates(frame.XDirection()),
57
+ radius,
58
+ minorRadius,
59
+ };
60
+ }
61
+ finally {
62
+ frame.delete();
63
+ curve.delete();
64
+ }
65
+ }
66
+ throw new Error(`align() does not yet support underlying ${edge.geomType} curves. Select a point on the curve for further positioning.`);
67
+ }
68
+ finally {
69
+ adaptor.delete();
70
+ }
71
+ }
72
+ export function faceGeometry(face, facing) {
73
+ const adaptor = new (getOC().BRepAdaptor_Surface)(face.wrapped, false);
74
+ try {
75
+ if (face.geomType === 'PLANE') {
76
+ const plane = adaptor.Plane(), axis = plane.Axis();
77
+ try {
78
+ const normal = scale(coordinates(axis.Direction()), facing * (face.orientation === 'forward' ? 1 : -1));
79
+ return {
80
+ kind: 'plane',
81
+ point: scale(normal, dot(coordinates(plane.Location()), normal)),
82
+ normal,
83
+ };
84
+ }
85
+ finally {
86
+ axis.delete();
87
+ plane.delete();
88
+ }
89
+ }
90
+ if (face.geomType === 'CYLINDRE' || face.geomType === 'SPHERE') {
91
+ const surface = face.geomType === 'SPHERE' ? adaptor.Sphere() : adaptor.Cylinder();
92
+ try {
93
+ const point = coordinates(surface.Location());
94
+ const sense = facing *
95
+ (face.orientation === 'forward' ? 1 : -1) *
96
+ (surface.Direct() ? 1 : -1);
97
+ if (face.geomType === 'SPHERE')
98
+ return {
99
+ kind: 'sphere',
100
+ point,
101
+ radius: surface.Radius(),
102
+ facing: sense,
103
+ };
104
+ const axis = surface.Axis();
105
+ try {
106
+ const direction = coordinates(axis.Direction());
107
+ return {
108
+ kind: 'cylinder',
109
+ point: reject(point, direction),
110
+ direction,
111
+ radius: surface.Radius(),
112
+ facing: sense,
113
+ };
114
+ }
115
+ finally {
116
+ axis.delete();
117
+ }
118
+ }
119
+ finally {
120
+ surface.delete();
121
+ }
122
+ }
123
+ throw new Error(`align() does not yet support underlying ${face.geomType} surfaces.`);
124
+ }
125
+ finally {
126
+ adaptor.delete();
127
+ }
128
+ }
129
+ export function transformGeometry(geometry, pose) {
130
+ const point = composeTransforms(pose, translation(geometry.point)).position;
131
+ if ('direction' in geometry) {
132
+ const direction = rotateVector(geometry.direction, pose.quaternion);
133
+ return { ...geometry, point: reject(point, direction), direction };
134
+ }
135
+ if ('normal' in geometry) {
136
+ const normal = rotateVector(geometry.normal, pose.quaternion);
137
+ return 'major' in geometry
138
+ ? {
139
+ ...geometry,
140
+ point,
141
+ normal,
142
+ major: rotateVector(geometry.major, pose.quaternion),
143
+ }
144
+ : { ...geometry, point: scale(normal, dot(point, normal)), normal };
145
+ }
146
+ return { ...geometry, point };
147
+ }
148
+ const rank = (g) => g.kind === 'point'
149
+ ? 0
150
+ : ['line', 'circle', 'ellipse'].includes(g.kind)
151
+ ? 1
152
+ : 2;
153
+ export function orderedGeometry(a, b) {
154
+ return rank(a) <= rank(b) ? [a, b] : [b, a];
155
+ }
156
+ /** Reject only proven incompatibilities; unsupported pairs and iteration failures have distinct errors. */
157
+ export function validateAlignment(first, second) {
158
+ const [a, b] = orderedGeometry(first, second);
159
+ const incompatible = (reason) => {
160
+ throw new Error(`Geometrically incompatible align(): ${reason}`);
161
+ };
162
+ const sameSize = (a, b) => Math.abs(a - b) <= 1e-7 * Math.max(1, a, b);
163
+ if (a.kind === 'point')
164
+ return;
165
+ if (rank(a) === rank(b)) {
166
+ if (a.kind !== b.kind)
167
+ incompatible(`${a.kind} and ${b.kind} cannot coincide under a rigid transform.`);
168
+ if ('radius' in a && 'radius' in b && !sameSize(a.radius, b.radius))
169
+ incompatible('radii differ.');
170
+ if ('minorRadius' in a &&
171
+ 'minorRadius' in b &&
172
+ !sameSize(a.minorRadius, b.minorRadius))
173
+ incompatible('minor radii differ.');
174
+ if ('facing' in a && 'facing' in b && a.facing !== b.facing)
175
+ incompatible('closed surface normal senses differ; use flip() to select matching facing.');
176
+ return;
177
+ }
178
+ if (b.kind === 'plane')
179
+ return;
180
+ if (a.kind === 'line' && b.kind === 'cylinder')
181
+ return;
182
+ if (a.kind === 'line' && b.kind === 'sphere')
183
+ incompatible('a whole straight line cannot lie on a sphere.');
184
+ if (a.kind === 'circle' && b.kind === 'cylinder') {
185
+ if (!sameSize(a.radius, b.radius))
186
+ incompatible('a circle on a cylinder must have its radius.');
187
+ return;
188
+ }
189
+ if (a.kind === 'circle' && b.kind === 'sphere') {
190
+ if (a.radius > b.radius + 1e-7)
191
+ incompatible('the circle is larger than the sphere.');
192
+ return;
193
+ }
194
+ if (a.kind === 'ellipse' && b.kind === 'sphere')
195
+ incompatible('a non-circular ellipse cannot lie on a sphere.');
196
+ if (a.kind === 'ellipse' && b.kind === 'cylinder') {
197
+ if (!sameSize(a.minorRadius, b.radius))
198
+ incompatible('an elliptic cylinder section must have the cylinder radius as its minor radius.');
199
+ return;
200
+ }
201
+ throw new Error(`align() does not yet support ${a.kind}–${b.kind} relations.`);
202
+ }
203
+ /** All residuals describe complete analytic loci; no trim endpoints or sampled tangent frames. */
204
+ export function alignmentResidual(first, second) {
205
+ const [a, b] = orderedGeometry(first, second), delta = subtract(a.point, b.point);
206
+ if (a.kind === 'point') {
207
+ switch (b.kind) {
208
+ case 'point':
209
+ return [...delta];
210
+ case 'line':
211
+ return [...reject(delta, b.direction)];
212
+ case 'plane':
213
+ return [dot(delta, b.normal)];
214
+ case 'sphere':
215
+ return [Math.hypot(...delta) - b.radius];
216
+ case 'cylinder':
217
+ return [Math.hypot(...reject(delta, b.direction)) - b.radius];
218
+ case 'circle':
219
+ return [
220
+ dot(delta, b.normal),
221
+ Math.hypot(...reject(delta, b.normal)) - b.radius,
222
+ ];
223
+ case 'ellipse': {
224
+ const x = dot(delta, b.major) / b.radius, y = dot(delta, cross(b.normal, b.major)) / b.minorRadius;
225
+ return [dot(delta, b.normal), (Math.hypot(x, y) - 1) * b.minorRadius];
226
+ }
227
+ }
228
+ }
229
+ if (a.kind === 'line') {
230
+ if (b.kind === 'line')
231
+ return [
232
+ ...reject(delta, b.direction),
233
+ ...subtract(a.direction, b.direction),
234
+ ];
235
+ if (b.kind === 'plane')
236
+ return [dot(delta, b.normal), dot(a.direction, b.normal)];
237
+ if (b.kind === 'cylinder')
238
+ return [
239
+ ...cross(a.direction, b.direction),
240
+ Math.hypot(...reject(delta, b.direction)) - b.radius,
241
+ ];
242
+ }
243
+ if (a.kind === 'circle' || a.kind === 'ellipse') {
244
+ if (b.kind === 'circle' || b.kind === 'ellipse')
245
+ return [
246
+ ...delta,
247
+ ...subtract(a.normal, b.normal),
248
+ ...(a.kind === 'ellipse' ? cross(a.major, b.major) : []),
249
+ ];
250
+ if (b.kind === 'plane')
251
+ return [dot(delta, b.normal), ...cross(a.normal, b.normal)];
252
+ if (b.kind === 'sphere')
253
+ return [
254
+ ...reject(delta, a.normal),
255
+ dot(delta, delta) + a.radius * a.radius - b.radius * b.radius,
256
+ ];
257
+ if (b.kind === 'cylinder') {
258
+ // Fourier coefficients of squared distance to the cylinder axis. Their
259
+ // vanishing is equivalent to membership of the complete ellipse/circle.
260
+ const c = reject(delta, b.direction), x = reject(scale(a.major, a.radius), b.direction), y = reject(scale(cross(a.normal, a.major), a.minorRadius), b.direction);
261
+ return [
262
+ dot(c, c) + (dot(x, x) + dot(y, y)) / 2 - b.radius * b.radius,
263
+ dot(c, x),
264
+ dot(c, y),
265
+ dot(x, x) - dot(y, y),
266
+ dot(x, y),
267
+ ];
268
+ }
269
+ }
270
+ if (a.kind === 'plane' && b.kind === 'plane')
271
+ return [dot(delta, b.normal), ...subtract(a.normal, b.normal)];
272
+ if (a.kind === 'cylinder' && b.kind === 'cylinder')
273
+ return [...reject(delta, b.direction), ...cross(a.direction, b.direction)];
274
+ if (a.kind === 'sphere' && b.kind === 'sphere')
275
+ return [...delta];
276
+ throw new Error(`Unsupported alignment residual: ${a.kind}–${b.kind}.`);
277
+ }
278
+ export function nearestPoint(point, geometry) {
279
+ const delta = subtract(point, geometry.point);
280
+ const radial = (v, radius, fallback) => scale(Math.hypot(...v) > 1e-12 ? unit(v) : fallback, radius);
281
+ switch (geometry.kind) {
282
+ case 'point':
283
+ return geometry.point;
284
+ case 'line':
285
+ return addVectors(geometry.point, scale(geometry.direction, dot(delta, geometry.direction)));
286
+ case 'plane':
287
+ return subtract(point, scale(geometry.normal, dot(delta, geometry.normal)));
288
+ case 'sphere':
289
+ return addVectors(geometry.point, radial(delta, geometry.radius, [1, 0, 0]));
290
+ case 'cylinder':
291
+ return addVectors(addVectors(geometry.point, scale(geometry.direction, dot(delta, geometry.direction))), radial(reject(delta, geometry.direction), geometry.radius, perpendicular(geometry.direction)));
292
+ case 'circle':
293
+ return addVectors(geometry.point, radial(reject(delta, geometry.normal), geometry.radius, geometry.major));
294
+ case 'ellipse': {
295
+ const y = cross(geometry.normal, geometry.major);
296
+ const x0 = dot(delta, geometry.major), y0 = dot(delta, y);
297
+ const distance = (angle) => (geometry.radius * Math.cos(angle) - x0) ** 2 +
298
+ (geometry.minorRadius * Math.sin(angle) - y0) ** 2;
299
+ // Bracket all minima of distance on the ellipse, then refine them. This
300
+ // chooses a nearby free parameter; membership still uses the exact locus.
301
+ const step = Math.PI / 16, candidates = [];
302
+ for (let i = 0; i < 32; i++) {
303
+ const angle = i * step;
304
+ if (distance(angle) > distance(angle - step) ||
305
+ distance(angle) > distance(angle + step))
306
+ continue;
307
+ let lower = angle - step, upper = angle + step;
308
+ for (let iteration = 0; iteration < 64; iteration++) {
309
+ const a = lower + (upper - lower) * 0.3819660112501051, b = upper - (upper - lower) * 0.3819660112501051;
310
+ if (distance(a) < distance(b))
311
+ upper = b;
312
+ else
313
+ lower = a;
314
+ }
315
+ candidates.push((lower + upper) / 2);
316
+ }
317
+ const angle = candidates.reduce((best, angle) => (distance(angle) < distance(best) ? angle : best), candidates[0]);
318
+ return addVectors(geometry.point, addVectors(scale(geometry.major, geometry.radius * Math.cos(angle)), scale(y, geometry.minorRadius * Math.sin(angle))));
319
+ }
320
+ }
321
+ }
322
+ //# sourceMappingURL=alignment-geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alignment-geometry.js","sourceRoot":"","sources":["../../src/library/alignment-geometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { type Quaternion, type RigidTransform, type Vec3 } from './spatial.js';
2
+ export type Bounds = readonly [minimum: Vec3, maximum: Vec3];
3
+ export type BodyRotation = Readonly<{
4
+ local: RigidTransform;
5
+ }> | Readonly<{
6
+ axis: RigidTransform;
7
+ body: number;
8
+ angle: number;
9
+ }>;
10
+ export type BodyRelation = Readonly<{
11
+ id: string;
12
+ source: Readonly<{
13
+ body: number;
14
+ key: string;
15
+ bounds: (orientation: Quaternion) => Bounds;
16
+ }>;
17
+ target: Readonly<{
18
+ body: number;
19
+ transform: RigidTransform;
20
+ facing: 1 | -1;
21
+ }>;
22
+ offset: Vec3 | undefined;
23
+ rotations: readonly BodyRotation[];
24
+ }>;
25
+ export type Body = Readonly<{
26
+ name: string;
27
+ relations: readonly BodyRelation[];
28
+ }>;
29
+ /** A rotation about a positioned, directed line. Angles are in degrees. */
30
+ export declare function axisRotation(axis: RigidTransform, angle: number): RigidTransform;
31
+ /** Explicit rotations determine orientation; contacts solve translations only. */
32
+ export declare function solveBodies(bodies: readonly Body[]): readonly RigidTransform[];
33
+ //# sourceMappingURL=bound-solver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bound-solver.d.ts","sourceRoot":"","sources":["../../src/library/bound-solver.ts"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,IAAI,EACV,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAC7D,MAAM,MAAM,YAAY,GACpB,QAAQ,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAC,CAAC,GACjC,QAAQ,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAC,CAAC;AAElE,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,CAAC,WAAW,EAAE,UAAU,KAAK,MAAM,CAAC;KAC7C,CAAC,CAAC;IACH,MAAM,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,cAAc,CAAC;QAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;KAAC,CAAC,CAAC;IAC5E,MAAM,EAAE,IAAI,GAAG,SAAS,CAAC;IACzB,SAAS,EAAE,SAAS,YAAY,EAAE,CAAC;CACpC,CAAC,CAAC;AAEH,MAAM,MAAM,IAAI,GAAG,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,YAAY,EAAE,CAAA;CAAC,CAAC,CAAC;AAahF,2EAA2E;AAC3E,wBAAgB,YAAY,CAC1B,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,MAAM,GACZ,cAAc,CAWhB;AAED,kFAAkF;AAClF,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,IAAI,EAAE,GACtB,SAAS,cAAc,EAAE,CA6L3B"}