@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.
- package/LICENSE +22 -0
- package/README.md +824 -0
- package/THIRD_PARTY.md +28 -0
- package/bld/library/alignment-geometry.d.ts +50 -0
- package/bld/library/alignment-geometry.d.ts.map +1 -0
- package/bld/library/alignment-geometry.js +322 -0
- package/bld/library/alignment-geometry.js.map +1 -0
- package/bld/library/bound-solver.d.ts +33 -0
- package/bld/library/bound-solver.d.ts.map +1 -0
- package/bld/library/bound-solver.js +252 -0
- package/bld/library/bound-solver.js.map +1 -0
- package/bld/library/extrude.d.ts +8 -0
- package/bld/library/extrude.d.ts.map +1 -0
- package/bld/library/extrude.js +28 -0
- package/bld/library/extrude.js.map +1 -0
- package/bld/library/index.d.ts +7 -0
- package/bld/library/index.d.ts.map +1 -0
- package/bld/library/index.js +3 -0
- package/bld/library/index.js.map +1 -0
- package/bld/library/kernel-artifact-codec.d.ts +3 -0
- package/bld/library/kernel-artifact-codec.d.ts.map +1 -0
- package/bld/library/kernel-artifact-codec.js +148 -0
- package/bld/library/kernel-artifact-codec.js.map +1 -0
- package/bld/library/kernel-cache.d.ts +63 -0
- package/bld/library/kernel-cache.d.ts.map +1 -0
- package/bld/library/kernel-cache.js +245 -0
- package/bld/library/kernel-cache.js.map +1 -0
- package/bld/library/kernel-shapes.d.ts +20 -0
- package/bld/library/kernel-shapes.d.ts.map +1 -0
- package/bld/library/kernel-shapes.js +108 -0
- package/bld/library/kernel-shapes.js.map +1 -0
- package/bld/library/loft.d.ts +7 -0
- package/bld/library/loft.d.ts.map +1 -0
- package/bld/library/loft.js +161 -0
- package/bld/library/loft.js.map +1 -0
- package/bld/library/material.d.ts +12 -0
- package/bld/library/material.d.ts.map +1 -0
- package/bld/library/material.js +176 -0
- package/bld/library/material.js.map +1 -0
- package/bld/library/model-color.d.ts +8 -0
- package/bld/library/model-color.d.ts.map +1 -0
- package/bld/library/model-color.js +36 -0
- package/bld/library/model-color.js.map +1 -0
- package/bld/library/open-cascade-error.d.ts +2 -0
- package/bld/library/open-cascade-error.d.ts.map +1 -0
- package/bld/library/open-cascade-error.js +22 -0
- package/bld/library/open-cascade-error.js.map +1 -0
- package/bld/library/relation-solver.d.ts +29 -0
- package/bld/library/relation-solver.d.ts.map +1 -0
- package/bld/library/relation-solver.js +258 -0
- package/bld/library/relation-solver.js.map +1 -0
- package/bld/library/replicad.d.ts +17 -0
- package/bld/library/replicad.d.ts.map +1 -0
- package/bld/library/replicad.js +24 -0
- package/bld/library/replicad.js.map +1 -0
- package/bld/library/retained-memory.d.ts +7 -0
- package/bld/library/retained-memory.d.ts.map +1 -0
- package/bld/library/retained-memory.js +27 -0
- package/bld/library/retained-memory.js.map +1 -0
- package/bld/library/runtime.d.ts +775 -0
- package/bld/library/runtime.d.ts.map +1 -0
- package/bld/library/runtime.js +2954 -0
- package/bld/library/runtime.js.map +1 -0
- package/bld/library/shell.d.ts +7 -0
- package/bld/library/shell.d.ts.map +1 -0
- package/bld/library/shell.js +221 -0
- package/bld/library/shell.js.map +1 -0
- package/bld/library/sketch-curve-intersections.d.ts +13 -0
- package/bld/library/sketch-curve-intersections.d.ts.map +1 -0
- package/bld/library/sketch-curve-intersections.js +117 -0
- package/bld/library/sketch-curve-intersections.js.map +1 -0
- package/bld/library/sketch-curves.d.ts +31 -0
- package/bld/library/sketch-curves.d.ts.map +1 -0
- package/bld/library/sketch-curves.js +89 -0
- package/bld/library/sketch-curves.js.map +1 -0
- package/bld/library/sketch-drag-rules.d.ts +35 -0
- package/bld/library/sketch-drag-rules.d.ts.map +1 -0
- package/bld/library/sketch-drag-rules.js +522 -0
- package/bld/library/sketch-drag-rules.js.map +1 -0
- package/bld/library/sketch-face.d.ts +4 -0
- package/bld/library/sketch-face.d.ts.map +1 -0
- package/bld/library/sketch-face.js +72 -0
- package/bld/library/sketch-face.js.map +1 -0
- package/bld/library/sketch-incidence.d.ts +26 -0
- package/bld/library/sketch-incidence.d.ts.map +1 -0
- package/bld/library/sketch-incidence.js +114 -0
- package/bld/library/sketch-incidence.js.map +1 -0
- package/bld/library/sketch-precision.d.ts +19 -0
- package/bld/library/sketch-precision.d.ts.map +1 -0
- package/bld/library/sketch-precision.js +55 -0
- package/bld/library/sketch-precision.js.map +1 -0
- package/bld/library/sketch-regions.d.ts +12 -0
- package/bld/library/sketch-regions.d.ts.map +1 -0
- package/bld/library/sketch-regions.js +193 -0
- package/bld/library/sketch-regions.js.map +1 -0
- package/bld/library/sketch-solver.d.ts +97 -0
- package/bld/library/sketch-solver.d.ts.map +1 -0
- package/bld/library/sketch-solver.js +578 -0
- package/bld/library/sketch-solver.js.map +1 -0
- package/bld/library/sketch.d.ts +142 -0
- package/bld/library/sketch.d.ts.map +1 -0
- package/bld/library/sketch.js +650 -0
- package/bld/library/sketch.js.map +1 -0
- package/bld/library/spatial.d.ts +28 -0
- package/bld/library/spatial.d.ts.map +1 -0
- package/bld/library/spatial.js +195 -0
- package/bld/library/spatial.js.map +1 -0
- package/bld/library/three.d.ts +3 -0
- package/bld/library/three.d.ts.map +1 -0
- package/bld/library/three.js +3 -0
- package/bld/library/three.js.map +1 -0
- package/bld/library/topology-id.d.ts +24 -0
- package/bld/library/topology-id.d.ts.map +1 -0
- package/bld/library/topology-id.js +67 -0
- package/bld/library/topology-id.js.map +1 -0
- package/bld/library/topology-inspection.d.ts +64 -0
- package/bld/library/topology-inspection.d.ts.map +1 -0
- package/bld/library/topology-inspection.js +267 -0
- package/bld/library/topology-inspection.js.map +1 -0
- package/bld/library/topology.d.ts +94 -0
- package/bld/library/topology.d.ts.map +1 -0
- package/bld/library/topology.js +455 -0
- package/bld/library/topology.js.map +1 -0
- package/bld/node/index.d.ts +2 -0
- package/bld/node/index.d.ts.map +1 -0
- package/bld/node/index.js +14 -0
- package/bld/node/index.js.map +1 -0
- package/bld/node/replicad.d.ts +3 -0
- package/bld/node/replicad.d.ts.map +1 -0
- package/bld/node/replicad.js +3 -0
- package/bld/node/replicad.js.map +1 -0
- package/bld/tooling/index.d.ts +26 -0
- package/bld/tooling/index.d.ts.map +1 -0
- package/bld/tooling/index.js +19 -0
- package/bld/tooling/index.js.map +1 -0
- package/package.json +53 -0
- package/src/library/alignment-geometry.ts +431 -0
- package/src/library/bound-solver.ts +410 -0
- package/src/library/extrude.ts +38 -0
- package/src/library/index.ts +88 -0
- package/src/library/kernel-artifact-codec.ts +166 -0
- package/src/library/kernel-cache.ts +337 -0
- package/src/library/kernel-shapes.ts +135 -0
- package/src/library/loft.ts +196 -0
- package/src/library/material.ts +228 -0
- package/src/library/model-color.ts +47 -0
- package/src/library/open-cascade-error.ts +26 -0
- package/src/library/relation-solver.ts +479 -0
- package/src/library/replicad.ts +40 -0
- package/src/library/retained-memory.ts +23 -0
- package/src/library/runtime.ts +5146 -0
- package/src/library/shell.ts +281 -0
- package/src/library/sketch-curve-intersections.ts +154 -0
- package/src/library/sketch-curves.ts +161 -0
- package/src/library/sketch-drag-rules.ts +767 -0
- package/src/library/sketch-face.ts +89 -0
- package/src/library/sketch-incidence.ts +204 -0
- package/src/library/sketch-precision.ts +81 -0
- package/src/library/sketch-regions.ts +271 -0
- package/src/library/sketch-solver.ts +973 -0
- package/src/library/sketch.ts +977 -0
- package/src/library/spatial.ts +254 -0
- package/src/library/three.ts +2 -0
- package/src/library/topology-id.ts +81 -0
- package/src/library/topology-inspection.ts +368 -0
- package/src/library/topology.ts +776 -0
- package/src/library/tsconfig.json +11 -0
- package/src/node/index.ts +20 -0
- package/src/node/replicad.ts +3 -0
- package/src/node/tsconfig.json +16 -0
- package/src/tooling/index.ts +160 -0
- 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"}
|