@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
@@ -0,0 +1,117 @@
1
+ import { sketchCurveClosestParameter, sketchCurvePosition, sketchCurveTolerance, } from './sketch-curves.js';
2
+ const subtract = (a, b) => [
3
+ a[0] - b[0],
4
+ a[1] - b[1],
5
+ ];
6
+ const cross = (a, b) => a[0] * b[1] - a[1] * b[0];
7
+ const distance = (a, b) => Math.hypot(...subtract(a, b));
8
+ const endpoints = (curve) => curve.kind === 'circle'
9
+ ? []
10
+ : [sketchCurvePosition(curve, 0), sketchCurvePosition(curve, 1)];
11
+ /**
12
+ * Isolated intersections and finite overlap boundaries, ordered along first.
13
+ * A shared continuous interior does not enumerate points: coincident full
14
+ * circles have no boundaries. Parameters are local to this evaluation, not IDs.
15
+ */
16
+ export function sketchCurveIntersections(first, second) {
17
+ const tolerances = [
18
+ sketchCurveTolerance(first),
19
+ sketchCurveTolerance(second),
20
+ ];
21
+ const tolerance = Math.min(...tolerances);
22
+ const contacts = [];
23
+ for (const position of candidates(first, second, tolerance)) {
24
+ const parameters = [
25
+ sketchCurveClosestParameter(first, position),
26
+ sketchCurveClosestParameter(second, position),
27
+ ];
28
+ if ([first, second].some((curve, i) => distance(position, sketchCurvePosition(curve, parameters[i])) >
29
+ tolerances[i]) ||
30
+ contacts.some(contact => distance(position, contact.position) <= tolerance))
31
+ continue;
32
+ contacts.push({ position, parameters });
33
+ }
34
+ return contacts.sort((a, b) => a.parameters[0] - b.parameters[0]);
35
+ }
36
+ function candidates(first, second, tolerance) {
37
+ if (first.kind === 'line') {
38
+ const [a, b] = first.points;
39
+ const length = distance(a, b);
40
+ if (!length)
41
+ return [a];
42
+ const unit = [
43
+ (b[0] - a[0]) / length,
44
+ (b[1] - a[1]) / length,
45
+ ];
46
+ if (second.kind === 'line') {
47
+ const [c, d] = second.points;
48
+ const otherLength = distance(c, d);
49
+ if (!otherLength)
50
+ return [c];
51
+ // Collinear endpoints delimit overlap. Check them before dividing by
52
+ // the angle, which can be roundoff-sized for rotated/translated lines.
53
+ if (second.points.every(p => Math.abs(cross(unit, subtract(p, a))) <= tolerance))
54
+ return [a, b, c, d];
55
+ const otherUnit = [
56
+ (d[0] - c[0]) / otherLength,
57
+ (d[1] - c[1]) / otherLength,
58
+ ];
59
+ const denominator = cross(unit, otherUnit);
60
+ if (Math.abs(denominator) <= Number.EPSILON * 16)
61
+ return [];
62
+ const along = cross(subtract(c, a), otherUnit) / denominator;
63
+ return [[a[0] + along * unit[0], a[1] + along * unit[1]]];
64
+ }
65
+ const perpendicular = cross(unit, subtract(second.center, a));
66
+ const gap = Math.abs(perpendicular);
67
+ if (gap > second.radius + tolerance)
68
+ return [];
69
+ const normalized = gap / second.radius;
70
+ // Classify tangency before sqrt magnifies coordinate roundoff into two
71
+ // artificial cuts. Use the same model-space tolerance as finite contacts.
72
+ const offset = Math.abs(gap - second.radius) <= tolerance
73
+ ? 0
74
+ : second.radius *
75
+ Math.sqrt(Math.max(0, (1 - normalized) * (1 + normalized)));
76
+ // Start at the circular center's projection, not a far-away line endpoint.
77
+ const foot = [
78
+ second.center[0] + perpendicular * unit[1],
79
+ second.center[1] - perpendicular * unit[0],
80
+ ];
81
+ return [-offset, offset].map(along => [
82
+ foot[0] + along * unit[0],
83
+ foot[1] + along * unit[1],
84
+ ]);
85
+ }
86
+ if (second.kind === 'line')
87
+ return candidates(second, first, tolerance);
88
+ const delta = subtract(second.center, first.center);
89
+ const separation = Math.hypot(...delta);
90
+ if (separation <= tolerance &&
91
+ Math.abs(first.radius - second.radius) <= tolerance)
92
+ return [...endpoints(first), ...endpoints(second)];
93
+ if (!separation ||
94
+ separation > first.radius + second.radius + tolerance ||
95
+ separation < Math.abs(first.radius - second.radius) - tolerance)
96
+ return [];
97
+ // Normalize before squaring; the factored radius difference also avoids
98
+ // subtracting nearly equal squared radii.
99
+ const scale = Math.max(separation, first.radius, second.radius);
100
+ const d = separation / scale, r = first.radius / scale, s = second.radius / scale;
101
+ const along = (d * d + (r - s) * (r + s)) / (2 * d);
102
+ const tangent = Math.abs(separation - first.radius - second.radius) <= tolerance ||
103
+ Math.abs(separation - Math.abs(first.radius - second.radius)) <= tolerance;
104
+ const height = tangent
105
+ ? 0
106
+ : Math.sqrt(Math.max(0, (r - along) * (r + along))) * scale;
107
+ const unit = [delta[0] / separation, delta[1] / separation];
108
+ const foot = [
109
+ first.center[0] + along * scale * unit[0],
110
+ first.center[1] + along * scale * unit[1],
111
+ ];
112
+ return [-height, height].map(offset => [
113
+ foot[0] - offset * unit[1],
114
+ foot[1] + offset * unit[0],
115
+ ]);
116
+ }
117
+ //# sourceMappingURL=sketch-curve-intersections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sketch-curve-intersections.js","sourceRoot":"","sources":["../../src/library/sketch-curve-intersections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { SketchArcDirection, SketchEntitySnapshot, SketchPointAddress, SketchPosition } from './sketch.js';
2
+ /** Analytic geometry only. Parameters are evaluation-local, never entity identity. */
3
+ export type SketchCurve = Readonly<{
4
+ kind: 'line';
5
+ points: readonly [SketchPosition, SketchPosition];
6
+ }> | Readonly<{
7
+ kind: 'circle';
8
+ center: SketchPosition;
9
+ radius: number;
10
+ }> | Readonly<{
11
+ kind: 'arc';
12
+ center: SketchPosition;
13
+ radius: number;
14
+ start: number;
15
+ sweep: number;
16
+ }>;
17
+ export declare const sketchPositiveAngle: (angle: number) => number;
18
+ export declare function sketchArcGeometry(center: SketchPosition, start: SketchPosition, end: SketchPosition, direction: SketchArcDirection): Extract<SketchCurve, {
19
+ kind: 'arc';
20
+ }>;
21
+ export declare function sketchCurveGeometry<E extends SketchEntitySnapshot>(entity: E, point: (address: SketchPointAddress) => SketchPosition): E extends {
22
+ kind: 'point';
23
+ } ? undefined : Extract<SketchCurve, {
24
+ kind: E['kind'];
25
+ }>;
26
+ export declare function sketchCurvePosition(curve: SketchCurve, t: number): SketchPosition;
27
+ /** Nearest point on the finite curve, including arc endpoints (not its full circle). */
28
+ export declare function sketchCurveClosestParameter(curve: SketchCurve, position: SketchPosition): number;
29
+ export declare function sketchCurveBounds(curve: SketchCurve): readonly SketchPosition[];
30
+ export declare function sketchCurveTolerance(curve: SketchCurve): number;
31
+ //# sourceMappingURL=sketch-curves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sketch-curves.d.ts","sourceRoot":"","sources":["../../src/library/sketch-curves.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,sFAAsF;AACtF,MAAM,MAAM,WAAW,GACnB,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAA;CAAC,CAAC,GAC3E,QAAQ,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,CAAC,GAClE,QAAQ,CAAC;IACP,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAGP,eAAO,MAAM,mBAAmB,UAAW,MAAM,WACpB,CAAC;AAE9B,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,cAAc,EACnB,SAAS,EAAE,kBAAkB,GAC5B,OAAO,CAAC,WAAW,EAAE;IAAC,IAAI,EAAE,KAAK,CAAA;CAAC,CAAC,CAWrC;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,oBAAoB,EAChE,MAAM,EAAE,CAAC,EACT,KAAK,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,cAAc,GACrD,CAAC,SAAS;IAAC,IAAI,EAAE,OAAO,CAAA;CAAC,GACxB,SAAS,GACT,OAAO,CAAC,WAAW,EAAE;IAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;CAAC,CAAC,CAAC;AAgC5C,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAClB,CAAC,EAAE,MAAM,GACR,cAAc,CAWhB;AAED,wFAAwF;AACxF,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,cAAc,GACvB,MAAM,CAwBR;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,GACjB,SAAS,cAAc,EAAE,CAiB3B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAc/D"}
@@ -0,0 +1,89 @@
1
+ import { sketchRelativePrecision } from './sketch-precision.js';
2
+ const tau = Math.PI * 2;
3
+ export const sketchPositiveAngle = (angle) => ((angle % tau) + tau) % tau;
4
+ export function sketchArcGeometry(center, start, end, direction) {
5
+ const angle = Math.atan2(start[1] - center[1], start[0] - center[0]);
6
+ const endAngle = Math.atan2(end[1] - center[1], end[0] - center[0]);
7
+ const sign = direction === 'ccw' ? 1 : -1;
8
+ return {
9
+ kind: 'arc',
10
+ center,
11
+ radius: Math.hypot(start[0] - center[0], start[1] - center[1]),
12
+ start: angle,
13
+ sweep: sign * sketchPositiveAngle(sign * (endAngle - angle)),
14
+ };
15
+ }
16
+ export function sketchCurveGeometry(entity, point) {
17
+ switch (entity.kind) {
18
+ case 'point':
19
+ return undefined;
20
+ case 'line':
21
+ return {
22
+ kind: 'line',
23
+ points: [point(entity.points[0]), point(entity.points[1])],
24
+ };
25
+ case 'circle':
26
+ return {
27
+ kind: 'circle',
28
+ center: point(entity.center),
29
+ radius: entity.radius,
30
+ };
31
+ case 'arc':
32
+ return {
33
+ ...sketchArcGeometry(point(entity.center), point(entity.points[0]), point(entity.points[1]), entity.direction),
34
+ radius: entity.radius,
35
+ };
36
+ }
37
+ }
38
+ export function sketchCurvePosition(curve, t) {
39
+ if (curve.kind === 'line') {
40
+ const [a, b] = curve.points;
41
+ return [a[0] + t * (b[0] - a[0]), a[1] + t * (b[1] - a[1])];
42
+ }
43
+ const angle = curve.kind === 'circle' ? t * tau : curve.start + t * curve.sweep;
44
+ return [
45
+ curve.center[0] + curve.radius * Math.cos(angle),
46
+ curve.center[1] + curve.radius * Math.sin(angle),
47
+ ];
48
+ }
49
+ /** Nearest point on the finite curve, including arc endpoints (not its full circle). */
50
+ export function sketchCurveClosestParameter(curve, position) {
51
+ if (curve.kind === 'line') {
52
+ const [a, b] = curve.points, dx = b[0] - a[0], dy = b[1] - a[1];
53
+ return Math.max(0, Math.min(1, ((position[0] - a[0]) * dx + (position[1] - a[1]) * dy) /
54
+ (dx * dx + dy * dy) || 0));
55
+ }
56
+ const angle = Math.atan2(position[1] - curve.center[1], position[0] - curve.center[0]);
57
+ if (curve.kind === 'circle')
58
+ return sketchPositiveAngle(angle) / tau;
59
+ const sign = Math.sign(curve.sweep), sweep = Math.abs(curve.sweep);
60
+ const distance = sketchPositiveAngle(sign * (angle - curve.start));
61
+ if (distance <= sweep)
62
+ return sweep ? distance / sweep : 0;
63
+ return distance - sweep < tau - distance ? 1 : 0;
64
+ }
65
+ export function sketchCurveBounds(curve) {
66
+ if (curve.kind === 'line')
67
+ return curve.points;
68
+ const candidates = [0, Math.PI / 2, Math.PI, (3 * Math.PI) / 2].filter(angle => curve.kind === 'circle' ||
69
+ sketchPositiveAngle(Math.sign(curve.sweep) * (angle - curve.start)) <=
70
+ Math.abs(curve.sweep));
71
+ return [
72
+ ...(curve.kind === 'arc'
73
+ ? [sketchCurvePosition(curve, 0), sketchCurvePosition(curve, 1)]
74
+ : []),
75
+ ...candidates.map((angle) => [
76
+ curve.center[0] + curve.radius * Math.cos(angle),
77
+ curve.center[1] + curve.radius * Math.sin(angle),
78
+ ]),
79
+ ];
80
+ }
81
+ export function sketchCurveTolerance(curve) {
82
+ const size = curve.kind === 'line'
83
+ ? Math.hypot(curve.points[1][0] - curve.points[0][0], curve.points[1][1] - curve.points[0][1])
84
+ : curve.radius;
85
+ return Math.max(size * sketchRelativePrecision, Number.EPSILON *
86
+ 16 *
87
+ Math.max(...sketchCurveBounds(curve).flatMap(p => p.map(Math.abs))));
88
+ }
89
+ //# sourceMappingURL=sketch-curves.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sketch-curves.js","sourceRoot":"","sources":["../../src/library/sketch-curves.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { type SketchSolveObjective, type SketchSolveProblem, type SketchSolveTarget, type SketchSolveResult } from './sketch-solver.js';
2
+ import type { SketchPosition } from './sketch.js';
3
+ import { type SketchIncidence, type SketchIncidenceGeometry } from './sketch-incidence.js';
4
+ export type SketchDragContext = Readonly<{
5
+ reference: SketchSolveProblem;
6
+ target: SketchSolveTarget;
7
+ /** Displayed gesture-start geometry, before applying AST coordinate locks. */
8
+ geometry?: SketchIncidenceGeometry;
9
+ }>;
10
+ export type SketchDragPlan = Readonly<{
11
+ problem: SketchSolveProblem;
12
+ stages: readonly [SketchDragStage, ...SketchDragStage[]];
13
+ incidences?: readonly SketchIncidence[];
14
+ }>;
15
+ /** A rule may prepare a stage's seed from the preceding feasible geometry.
16
+ * The seed is only an initial guess; all accumulated locks still apply. */
17
+ export type SketchDragStage = Readonly<{
18
+ objectives: (current: SketchSolveProblem) => readonly SketchSolveObjective[];
19
+ seed?: (current: SketchSolveProblem, objectives: readonly SketchSolveObjective[]) => SketchSolveProblem;
20
+ }>;
21
+ export type SketchDragSession = (current: SketchSolveProblem, target: SketchSolveTarget) => SketchDragPlan;
22
+ export type SketchDragRule = (context: SketchDragContext) => SketchDragSession | undefined;
23
+ /** Dispatch knows neither point roles nor connected components. */
24
+ export declare function createSketchDragSession(context: SketchDragContext, rules?: readonly SketchDragRule[]): SketchDragSession;
25
+ export declare function solveSketchDrag(current: SketchSolveProblem, target: SketchSolveTarget, reference: SketchSolveProblem, geometry?: SketchDragContext['geometry']): Readonly<{
26
+ positions: readonly SketchPosition[];
27
+ radii: readonly number[];
28
+ arcRadii: readonly number[];
29
+ degreesOfFreedom: number;
30
+ redundant: readonly number[];
31
+ }>;
32
+ /** Each stage keeps the preceding stage's chosen parameter values, not all
33
+ * equivalent optima. These locks belong to this solve, never the next frame. */
34
+ export declare function solveSketchDragPlan(plan: SketchDragPlan): SketchSolveResult;
35
+ //# sourceMappingURL=sketch-drag-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sketch-drag-rules.d.ts","sourceRoot":"","sources":["../../src/library/sketch-drag-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEtB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,aAAa,CAAC;AAChD,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC7B,MAAM,uBAAuB,CAAC;AAM/B,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,uBAAuB,CAAC;CACpC,CAAC,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,SAAS,CAAC,eAAe,EAAE,GAAG,eAAe,EAAE,CAAC,CAAC;IACzD,UAAU,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;CACzC,CAAC,CAAC;AACH;2EAC2E;AAC3E,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,UAAU,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,SAAS,oBAAoB,EAAE,CAAC;IAC7E,IAAI,CAAC,EAAE,CACL,OAAO,EAAE,kBAAkB,EAC3B,UAAU,EAAE,SAAS,oBAAoB,EAAE,KACxC,kBAAkB,CAAC;CACzB,CAAC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,OAAO,EAAE,kBAAkB,EAC3B,MAAM,EAAE,iBAAiB,KACtB,cAAc,CAAC;AACpB,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,iBAAiB,KACvB,iBAAiB,GAAG,SAAS,CAAC;AAEnC,mEAAmE;AACnE,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,iBAAiB,EAC1B,KAAK,GAAE,SAAS,cAAc,EAAc,GAC3C,iBAAiB,CAMnB;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,kBAAkB,EAC3B,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,kBAAkB,EAC7B,QAAQ,CAAC,EAAE,iBAAiB,CAAC,UAAU,CAAC;;;;;;GA4CzC;AAED;gFACgF;AAChF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,iBAAiB,CAwC3E"}