@horizon36596/zenith-core 0.1.1
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 +21 -0
- package/NOTICE +18 -0
- package/README.md +16 -0
- package/dist/canonicalize.d.ts +25 -0
- package/dist/canonicalize.d.ts.map +1 -0
- package/dist/canonicalize.js +199 -0
- package/dist/canonicalize.js.map +1 -0
- package/dist/check.d.ts +26 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +231 -0
- package/dist/check.js.map +1 -0
- package/dist/checks/heading.d.ts +17 -0
- package/dist/checks/heading.d.ts.map +1 -0
- package/dist/checks/heading.js +78 -0
- package/dist/checks/heading.js.map +1 -0
- package/dist/checks/intake.d.ts +28 -0
- package/dist/checks/intake.d.ts.map +1 -0
- package/dist/checks/intake.js +131 -0
- package/dist/checks/intake.js.map +1 -0
- package/dist/checks/motion.d.ts +28 -0
- package/dist/checks/motion.d.ts.map +1 -0
- package/dist/checks/motion.js +252 -0
- package/dist/checks/motion.js.map +1 -0
- package/dist/checks/schedule.d.ts +29 -0
- package/dist/checks/schedule.d.ts.map +1 -0
- package/dist/checks/schedule.js +166 -0
- package/dist/checks/schedule.js.map +1 -0
- package/dist/checks/season.d.ts +6 -0
- package/dist/checks/season.d.ts.map +1 -0
- package/dist/checks/season.js +126 -0
- package/dist/checks/season.js.map +1 -0
- package/dist/continuity.d.ts +38 -0
- package/dist/continuity.d.ts.map +1 -0
- package/dist/continuity.js +69 -0
- package/dist/continuity.js.map +1 -0
- package/dist/diff.d.ts +37 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +258 -0
- package/dist/diff.js.map +1 -0
- package/dist/edit/command.d.ts +4 -0
- package/dist/edit/command.d.ts.map +1 -0
- package/dist/edit/command.js +16 -0
- package/dist/edit/command.js.map +1 -0
- package/dist/edit/errors.d.ts +9 -0
- package/dist/edit/errors.d.ts.map +1 -0
- package/dist/edit/errors.js +12 -0
- package/dist/edit/errors.js.map +1 -0
- package/dist/edit/fields.d.ts +40 -0
- package/dist/edit/fields.d.ts.map +1 -0
- package/dist/edit/fields.js +150 -0
- package/dist/edit/fields.js.map +1 -0
- package/dist/edit/finish.d.ts +15 -0
- package/dist/edit/finish.d.ts.map +1 -0
- package/dist/edit/finish.js +36 -0
- package/dist/edit/finish.js.map +1 -0
- package/dist/edit/groups.d.ts +66 -0
- package/dist/edit/groups.d.ts.map +1 -0
- package/dist/edit/groups.js +277 -0
- package/dist/edit/groups.js.map +1 -0
- package/dist/edit/ids.d.ts +39 -0
- package/dist/edit/ids.d.ts.map +1 -0
- package/dist/edit/ids.js +76 -0
- package/dist/edit/ids.js.map +1 -0
- package/dist/edit/index.d.ts +22 -0
- package/dist/edit/index.d.ts.map +1 -0
- package/dist/edit/index.js +22 -0
- package/dist/edit/index.js.map +1 -0
- package/dist/edit/meta.d.ts +15 -0
- package/dist/edit/meta.d.ts.map +1 -0
- package/dist/edit/meta.js +13 -0
- package/dist/edit/meta.js.map +1 -0
- package/dist/edit/path.d.ts +36 -0
- package/dist/edit/path.d.ts.map +1 -0
- package/dist/edit/path.js +135 -0
- package/dist/edit/path.js.map +1 -0
- package/dist/edit/steps.d.ts +53 -0
- package/dist/edit/steps.d.ts.map +1 -0
- package/dist/edit/steps.js +0 -0
- package/dist/edit/steps.js.map +1 -0
- package/dist/edit/template.d.ts +18 -0
- package/dist/edit/template.d.ts.map +1 -0
- package/dist/edit/template.js +30 -0
- package/dist/edit/template.js.map +1 -0
- package/dist/edit/timing.d.ts +11 -0
- package/dist/edit/timing.d.ts.map +1 -0
- package/dist/edit/timing.js +23 -0
- package/dist/edit/timing.js.map +1 -0
- package/dist/edit/tree.d.ts +32 -0
- package/dist/edit/tree.d.ts.map +1 -0
- package/dist/edit/tree.js +90 -0
- package/dist/edit/tree.js.map +1 -0
- package/dist/estimate.d.ts +48 -0
- package/dist/estimate.d.ts.map +1 -0
- package/dist/estimate.js +443 -0
- package/dist/estimate.js.map +1 -0
- package/dist/findingHelp.d.ts +18 -0
- package/dist/findingHelp.d.ts.map +1 -0
- package/dist/findingHelp.js +114 -0
- package/dist/findingHelp.js.map +1 -0
- package/dist/fix.d.ts +21 -0
- package/dist/fix.d.ts.map +1 -0
- package/dist/fix.js +180 -0
- package/dist/fix.js.map +1 -0
- package/dist/footprint.d.ts +33 -0
- package/dist/footprint.d.ts.map +1 -0
- package/dist/footprint.js +71 -0
- package/dist/footprint.js.map +1 -0
- package/dist/geometry/angle.d.ts +13 -0
- package/dist/geometry/angle.d.ts.map +1 -0
- package/dist/geometry/angle.js +21 -0
- package/dist/geometry/angle.js.map +1 -0
- package/dist/geometry/curve.d.ts +24 -0
- package/dist/geometry/curve.d.ts.map +1 -0
- package/dist/geometry/curve.js +78 -0
- package/dist/geometry/curve.js.map +1 -0
- package/dist/geometry/path.d.ts +29 -0
- package/dist/geometry/path.d.ts.map +1 -0
- package/dist/geometry/path.js +61 -0
- package/dist/geometry/path.js.map +1 -0
- package/dist/geometry/quadrature.d.ts +13 -0
- package/dist/geometry/quadrature.d.ts.map +1 -0
- package/dist/geometry/quadrature.js +57 -0
- package/dist/geometry/quadrature.js.map +1 -0
- package/dist/geometry/sat.d.ts +40 -0
- package/dist/geometry/sat.d.ts.map +1 -0
- package/dist/geometry/sat.js +86 -0
- package/dist/geometry/sat.js.map +1 -0
- package/dist/geometry/vec.d.ts +27 -0
- package/dist/geometry/vec.d.ts.map +1 -0
- package/dist/geometry/vec.js +30 -0
- package/dist/geometry/vec.js.map +1 -0
- package/dist/heading.d.ts +77 -0
- package/dist/heading.d.ts.map +1 -0
- package/dist/heading.js +164 -0
- package/dist/heading.js.map +1 -0
- package/dist/headingRanges.d.ts +48 -0
- package/dist/headingRanges.d.ts.map +1 -0
- package/dist/headingRanges.js +132 -0
- package/dist/headingRanges.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/kinematics.d.ts +63 -0
- package/dist/kinematics.d.ts.map +1 -0
- package/dist/kinematics.js +71 -0
- package/dist/kinematics.js.map +1 -0
- package/dist/ledger.d.ts +49 -0
- package/dist/ledger.d.ts.map +1 -0
- package/dist/ledger.js +136 -0
- package/dist/ledger.js.map +1 -0
- package/dist/load.d.ts +12 -0
- package/dist/load.d.ts.map +1 -0
- package/dist/load.js +12 -0
- package/dist/load.js.map +1 -0
- package/dist/mirror.d.ts +81 -0
- package/dist/mirror.d.ts.map +1 -0
- package/dist/mirror.js +282 -0
- package/dist/mirror.js.map +1 -0
- package/dist/plan.d.ts +29 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +159 -0
- package/dist/plan.js.map +1 -0
- package/dist/prBody.d.ts +24 -0
- package/dist/prBody.d.ts.map +1 -0
- package/dist/prBody.js +112 -0
- package/dist/prBody.js.map +1 -0
- package/dist/provenance.d.ts +21 -0
- package/dist/provenance.d.ts.map +1 -0
- package/dist/provenance.js +46 -0
- package/dist/provenance.js.map +1 -0
- package/dist/render.d.ts +18 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +464 -0
- package/dist/render.js.map +1 -0
- package/dist/resolve.d.ts +39 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +172 -0
- package/dist/resolve.js.map +1 -0
- package/dist/season.d.ts +65 -0
- package/dist/season.d.ts.map +1 -0
- package/dist/season.js +16 -0
- package/dist/season.js.map +1 -0
- package/dist/sim/commands.d.ts +97 -0
- package/dist/sim/commands.d.ts.map +1 -0
- package/dist/sim/commands.js +185 -0
- package/dist/sim/commands.js.map +1 -0
- package/dist/sim/curves.d.ts +37 -0
- package/dist/sim/curves.d.ts.map +1 -0
- package/dist/sim/curves.js +187 -0
- package/dist/sim/curves.js.map +1 -0
- package/dist/sim/follower.d.ts +124 -0
- package/dist/sim/follower.d.ts.map +1 -0
- package/dist/sim/follower.js +472 -0
- package/dist/sim/follower.js.map +1 -0
- package/dist/sim/ideal.d.ts +103 -0
- package/dist/sim/ideal.d.ts.map +1 -0
- package/dist/sim/ideal.js +393 -0
- package/dist/sim/ideal.js.map +1 -0
- package/dist/sim/index.d.ts +11 -0
- package/dist/sim/index.d.ts.map +1 -0
- package/dist/sim/index.js +10 -0
- package/dist/sim/index.js.map +1 -0
- package/dist/sim/params.d.ts +91 -0
- package/dist/sim/params.d.ts.map +1 -0
- package/dist/sim/params.js +195 -0
- package/dist/sim/params.js.map +1 -0
- package/dist/sim/pedroPath.d.ts +41 -0
- package/dist/sim/pedroPath.d.ts.map +1 -0
- package/dist/sim/pedroPath.js +191 -0
- package/dist/sim/pedroPath.js.map +1 -0
- package/dist/sim/plant.d.ts +59 -0
- package/dist/sim/plant.d.ts.map +1 -0
- package/dist/sim/plant.js +128 -0
- package/dist/sim/plant.js.map +1 -0
- package/dist/sim/residuals.d.ts +36 -0
- package/dist/sim/residuals.d.ts.map +1 -0
- package/dist/sim/residuals.js +86 -0
- package/dist/sim/residuals.js.map +1 -0
- package/dist/sim/simulate.d.ts +27 -0
- package/dist/sim/simulate.d.ts.map +1 -0
- package/dist/sim/simulate.js +924 -0
- package/dist/sim/simulate.js.map +1 -0
- package/dist/sim/types.d.ts +209 -0
- package/dist/sim/types.d.ts.map +1 -0
- package/dist/sim/types.js +2 -0
- package/dist/sim/types.js.map +1 -0
- package/dist/tokens.d.ts +93 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +93 -0
- package/dist/tokens.js.map +1 -0
- package/dist/trace.d.ts +89 -0
- package/dist/trace.d.ts.map +1 -0
- package/dist/trace.js +187 -0
- package/dist/trace.js.map +1 -0
- package/dist/types.d.ts +219 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/unimplemented.d.ts +8 -0
- package/dist/unimplemented.d.ts.map +1 -0
- package/dist/unimplemented.js +11 -0
- package/dist/unimplemented.js.map +1 -0
- package/package.json +59 -0
package/dist/fix.js
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { childLists, withChildLists, } from "@horizon36596/zenith-schema";
|
|
2
|
+
import { childPrefix, effectiveId } from "./edit/ids.js";
|
|
3
|
+
const isPath = (step) => step.kind === "path";
|
|
4
|
+
/**
|
|
5
|
+
* Rewrites one step wherever it sits, including inside a parallel group or a branch.
|
|
6
|
+
*
|
|
7
|
+
* Steps are addressed by their effective id (`edit/ids.ts`), the same positional name a finding
|
|
8
|
+
* carries: matching on the raw `id` field made every fix on a step without an explicit id a silent
|
|
9
|
+
* no-op, because the finding said `step1` and the field said nothing.
|
|
10
|
+
*/
|
|
11
|
+
function mapStep(steps, stepId, rewrite, prefix = "step") {
|
|
12
|
+
return steps.map((step, index) => {
|
|
13
|
+
const id = effectiveId(step, index, prefix);
|
|
14
|
+
if (id === stepId)
|
|
15
|
+
return rewrite(step);
|
|
16
|
+
const lists = childLists(step);
|
|
17
|
+
if (lists.length === 0)
|
|
18
|
+
return step;
|
|
19
|
+
return withChildLists(step, lists.map((list, listIndex) => mapStep(list, stepId, rewrite, childPrefix(id, lists.length, listIndex))));
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/** The path step immediately before this one in the list that holds it, if there is one. */
|
|
23
|
+
function previousPathId(steps, stepId, prefix = "step") {
|
|
24
|
+
for (const [index, step] of steps.entries()) {
|
|
25
|
+
const id = effectiveId(step, index, prefix);
|
|
26
|
+
if (id === stepId) {
|
|
27
|
+
for (let before = index - 1; before >= 0; before -= 1) {
|
|
28
|
+
const candidate = steps[before];
|
|
29
|
+
if (candidate !== undefined && isPath(candidate)) {
|
|
30
|
+
return effectiveId(candidate, before, prefix);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const branches = childLists(step);
|
|
36
|
+
for (const [branchIndex, branch] of branches.entries()) {
|
|
37
|
+
const nested = previousPathId(branch, stepId, childPrefix(id, branches.length, branchIndex));
|
|
38
|
+
if (nested !== null)
|
|
39
|
+
return nested;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
/** The heading a step holds as it begins, when the mode says so without needing the geometry. */
|
|
45
|
+
function startHeadingOf(heading) {
|
|
46
|
+
if (heading === undefined)
|
|
47
|
+
return null;
|
|
48
|
+
if (heading.mode === "constant")
|
|
49
|
+
return heading.headingRad;
|
|
50
|
+
if (heading.mode === "linear")
|
|
51
|
+
return heading.fromRad;
|
|
52
|
+
if (heading.mode === "piecewise") {
|
|
53
|
+
const first = heading.ranges[0];
|
|
54
|
+
return first === undefined ? null : startHeadingOf(first.heading);
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
/** de Casteljau subdivision: the control polygons of the two halves of a Bezier split at `u`. */
|
|
59
|
+
export function splitControlPolygon(points, u) {
|
|
60
|
+
const left = [];
|
|
61
|
+
const right = [];
|
|
62
|
+
let level = points.map((point) => ({ xIn: point.xIn, yIn: point.yIn }));
|
|
63
|
+
while (level.length > 0) {
|
|
64
|
+
left.push(level[0]);
|
|
65
|
+
right.unshift(level[level.length - 1]);
|
|
66
|
+
const next = [];
|
|
67
|
+
for (let i = 0; i + 1 < level.length; i += 1) {
|
|
68
|
+
const a = level[i];
|
|
69
|
+
const b = level[i + 1];
|
|
70
|
+
next.push({ xIn: a.xIn + (b.xIn - a.xIn) * u, yIn: a.yIn + (b.yIn - a.yIn) * u });
|
|
71
|
+
}
|
|
72
|
+
level = next;
|
|
73
|
+
}
|
|
74
|
+
return { left, right };
|
|
75
|
+
}
|
|
76
|
+
/** The control polygon a segment draws, which needs the poses its ends resolved to. */
|
|
77
|
+
function segmentPoints(segment, fromIn, toIn) {
|
|
78
|
+
const controls = segment.kind === "bezier" ? segment.control : [];
|
|
79
|
+
return [fromIn, ...controls.map((point) => ({ xIn: point.xIn, yIn: point.yIn })), toIn];
|
|
80
|
+
}
|
|
81
|
+
/** The inline pose a `from`/`to` already names, or null when it is a reference or `"current"`. */
|
|
82
|
+
function inlinePoint(source) {
|
|
83
|
+
if (source === "current" || "ref" in source)
|
|
84
|
+
return null;
|
|
85
|
+
return { xIn: source.xIn, yIn: source.yIn };
|
|
86
|
+
}
|
|
87
|
+
function splitSegment(step, segmentIndex, u) {
|
|
88
|
+
const segment = step.segments[segmentIndex];
|
|
89
|
+
if (segment === undefined || u <= 0 || u >= 1)
|
|
90
|
+
return step;
|
|
91
|
+
const fromIn = inlinePoint(segment.from);
|
|
92
|
+
const toIn = inlinePoint(segment.to);
|
|
93
|
+
if (fromIn === null || toIn === null) {
|
|
94
|
+
// Splitting needs both ends as numbers. A `"current"` or a waypoint reference has to be
|
|
95
|
+
// resolved first, which is the caller's job, not a guess made here.
|
|
96
|
+
return step;
|
|
97
|
+
}
|
|
98
|
+
const { left, right } = splitControlPolygon(segmentPoints(segment, fromIn, toIn), u);
|
|
99
|
+
const middle = left[left.length - 1];
|
|
100
|
+
const middlePose = { xIn: middle.xIn, yIn: middle.yIn };
|
|
101
|
+
const half = (polygon, from, to) => {
|
|
102
|
+
const controls = polygon.slice(1, -1);
|
|
103
|
+
if (controls.length === 0)
|
|
104
|
+
return { kind: "line", from, to };
|
|
105
|
+
return { kind: "bezier", from, control: controls.map((point) => ({ ...point })), to };
|
|
106
|
+
};
|
|
107
|
+
const segments = [
|
|
108
|
+
...step.segments.slice(0, segmentIndex),
|
|
109
|
+
half(left, segment.from, middlePose),
|
|
110
|
+
half(right, middlePose, segment.to),
|
|
111
|
+
...step.segments.slice(segmentIndex + 1),
|
|
112
|
+
];
|
|
113
|
+
return { ...step, segments };
|
|
114
|
+
}
|
|
115
|
+
/** Applies one structured fix to a document and hands back a new one. Pure. */
|
|
116
|
+
export function applyFix(auto, fix) {
|
|
117
|
+
switch (fix.kind) {
|
|
118
|
+
case "makeTangent": {
|
|
119
|
+
const mode = {
|
|
120
|
+
mode: fix.params.reversed === true ? "tangentReversed" : "tangent",
|
|
121
|
+
};
|
|
122
|
+
return {
|
|
123
|
+
...auto,
|
|
124
|
+
steps: mapStep(auto.steps, fix.stepId, (step) => isPath(step) ? { ...step, heading: mode } : step),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
case "turnAtPreviousStop": {
|
|
128
|
+
// The turn is cheapest where the robot is already standing still, so it moves into the leg
|
|
129
|
+
// before this one and this leg goes back to driving nose-first (`03` section 5).
|
|
130
|
+
const turnIn = fix.params.turnInStepId ?? previousPathId(auto.steps, fix.stepId);
|
|
131
|
+
let steps = mapStep(auto.steps, fix.stepId, (step) => isPath(step) ? { ...step, heading: { mode: "tangent" } } : step);
|
|
132
|
+
if (turnIn !== null) {
|
|
133
|
+
steps = mapStep(steps, turnIn, (step) => {
|
|
134
|
+
if (!isPath(step))
|
|
135
|
+
return step;
|
|
136
|
+
const fromRad = fix.params.fromRad ?? startHeadingOf(step.heading) ?? fix.params.headingRad;
|
|
137
|
+
return { ...step, heading: { mode: "linear", fromRad, toRad: fix.params.headingRad } };
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return { ...auto, steps };
|
|
141
|
+
}
|
|
142
|
+
case "slowSweep":
|
|
143
|
+
return {
|
|
144
|
+
...auto,
|
|
145
|
+
steps: mapStep(auto.steps, fix.stepId, (step) => isPath(step) ? { ...step, speedFraction: fix.params.speedFraction } : step),
|
|
146
|
+
};
|
|
147
|
+
case "moveToLegalApproach":
|
|
148
|
+
return {
|
|
149
|
+
...auto,
|
|
150
|
+
steps: mapStep(auto.steps, fix.stepId, (step) => {
|
|
151
|
+
if (!isPath(step))
|
|
152
|
+
return step;
|
|
153
|
+
const last = step.segments[step.segments.length - 1];
|
|
154
|
+
if (last === undefined)
|
|
155
|
+
return step;
|
|
156
|
+
const existing = inlinePoint(last.to);
|
|
157
|
+
const headingRad = fix.params.headingRad ??
|
|
158
|
+
(last.to === "current" || "ref" in last.to ? undefined : last.to.headingRad);
|
|
159
|
+
void existing;
|
|
160
|
+
const to = {
|
|
161
|
+
xIn: fix.params.xIn,
|
|
162
|
+
yIn: fix.params.yIn,
|
|
163
|
+
...(headingRad === undefined ? {} : { headingRad }),
|
|
164
|
+
};
|
|
165
|
+
return {
|
|
166
|
+
...step,
|
|
167
|
+
segments: [...step.segments.slice(0, -1), { ...last, to }],
|
|
168
|
+
};
|
|
169
|
+
}),
|
|
170
|
+
};
|
|
171
|
+
case "splitSegment":
|
|
172
|
+
return {
|
|
173
|
+
...auto,
|
|
174
|
+
steps: mapStep(auto.steps, fix.stepId, (step) => isPath(step) ? splitSegment(step, fix.params.segmentIndex, fix.params.u ?? 0.5) : step),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/** Applies several fixes in order. Each one sees the document the one before it produced. */
|
|
179
|
+
export const applyFixes = (auto, fixes) => fixes.reduce((current, fix) => applyFix(current, fix), auto);
|
|
180
|
+
//# sourceMappingURL=fix.js.map
|
package/dist/fix.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix.js","sourceRoot":"","sources":["../src/fix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Field, Mouth, Robot } from "@horizon36596/zenith-schema";
|
|
2
|
+
import { type Box2, type Rect } from "./geometry/sat.js";
|
|
3
|
+
import { type Pose, type Vec2 } from "./geometry/vec.js";
|
|
4
|
+
/** The robot's footprint at one pose: the expanded box plus a box per mouth. */
|
|
5
|
+
export interface FootprintAtPose {
|
|
6
|
+
/** The expanded rectangle, four corners counter-clockwise. */
|
|
7
|
+
bodyIn: Vec2[];
|
|
8
|
+
/** One polygon per mouth in `robot.json`, in the same order. */
|
|
9
|
+
mouthsIn: Vec2[][];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The footprint box, in the field frame, for a pose.
|
|
13
|
+
*
|
|
14
|
+
* `centreOfRotationIn` is where the centre of rotation sits inside the footprint, in the robot
|
|
15
|
+
* frame, so the box centre is the path point minus that offset rotated into the field frame. A
|
|
16
|
+
* robot whose centre of rotation is the middle of its box (the default, 0, 0) is unaffected.
|
|
17
|
+
*/
|
|
18
|
+
export declare function bodyRect(pose: Pose, robot: Robot, which: "startIn" | "expandedIn"): Rect;
|
|
19
|
+
/** A mouth's box: `widthIn` across the robot, `depthIn` out along the side it is on. */
|
|
20
|
+
export declare function mouthRect(pose: Pose, mouth: Mouth): Rect;
|
|
21
|
+
export declare function footprintAt(pose: Pose, robot: Robot, which?: "startIn" | "expandedIn"): FootprintAtPose;
|
|
22
|
+
/** Every polygon of a footprint, body first, for the checks that sweep all of them. */
|
|
23
|
+
export declare const footprintPolygons: (footprint: FootprintAtPose) => Vec2[][];
|
|
24
|
+
/**
|
|
25
|
+
* The axis-aligned bounds of the whole footprint at a pose: the body and every mouth, which is the
|
|
26
|
+
* exact set of polygons the PERIMETER and STRUCTURE checks test. The canvas wall snap reads this,
|
|
27
|
+
* so a pose snapped flush to a wall is flush by the same measure the check uses and never reports
|
|
28
|
+
* PERIMETER (the snap once read the body alone and left a mouth hanging over the wall).
|
|
29
|
+
*/
|
|
30
|
+
export declare function footprintBoundsIn(pose: Pose, robot: Robot, which?: "startIn" | "expandedIn"): Box2;
|
|
31
|
+
/** The field perimeter as a box, from `sizeIn` and where the frame puts the origin. */
|
|
32
|
+
export declare function fieldBounds(field: Field): Box2;
|
|
33
|
+
//# sourceMappingURL=footprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footprint.d.ts","sourceRoot":"","sources":["../src/footprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAe,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAe,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEtE,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,MAAM,EAAE,IAAI,EAAE,CAAC;IACf,gEAAgE;IAChE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,GAAG,YAAY,GAAG,IAAI,CAUxF;AAED,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAQxD;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,KAAK,GAAE,SAAS,GAAG,YAA2B,GAC7C,eAAe,CAKjB;AAED,uFAAuF;AACvF,eAAO,MAAM,iBAAiB,GAAI,WAAW,eAAe,KAAG,IAAI,EAAE,EAGpE,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,KAAK,GAAE,SAAS,GAAG,YAA2B,GAC7C,IAAI,CAcN;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAM9C"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { rectCorners } from "./geometry/sat.js";
|
|
2
|
+
import { add, rotate } from "./geometry/vec.js";
|
|
3
|
+
/**
|
|
4
|
+
* The footprint box, in the field frame, for a pose.
|
|
5
|
+
*
|
|
6
|
+
* `centreOfRotationIn` is where the centre of rotation sits inside the footprint, in the robot
|
|
7
|
+
* frame, so the box centre is the path point minus that offset rotated into the field frame. A
|
|
8
|
+
* robot whose centre of rotation is the middle of its box (the default, 0, 0) is unaffected.
|
|
9
|
+
*/
|
|
10
|
+
export function bodyRect(pose, robot, which) {
|
|
11
|
+
const box = robot.footprint[which];
|
|
12
|
+
const offset = robot.footprint.centreOfRotationIn;
|
|
13
|
+
const centreIn = add(pose, rotate({ xIn: -offset.xIn, yIn: -offset.yIn }, pose.headingRad));
|
|
14
|
+
return {
|
|
15
|
+
centreIn,
|
|
16
|
+
lengthIn: box.lengthIn,
|
|
17
|
+
widthIn: box.widthIn,
|
|
18
|
+
headingRad: pose.headingRad,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** A mouth's box: `widthIn` across the robot, `depthIn` out along the side it is on. */
|
|
22
|
+
export function mouthRect(pose, mouth) {
|
|
23
|
+
const alongX = mouth.side === "FRONT" || mouth.side === "BACK";
|
|
24
|
+
return {
|
|
25
|
+
centreIn: add(pose, rotate(mouth.offsetIn, pose.headingRad)),
|
|
26
|
+
lengthIn: alongX ? mouth.depthIn : mouth.widthIn,
|
|
27
|
+
widthIn: alongX ? mouth.widthIn : mouth.depthIn,
|
|
28
|
+
headingRad: pose.headingRad,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function footprintAt(pose, robot, which = "expandedIn") {
|
|
32
|
+
return {
|
|
33
|
+
bodyIn: rectCorners(bodyRect(pose, robot, which)),
|
|
34
|
+
mouthsIn: (robot.mouths ?? []).map((mouth) => rectCorners(mouthRect(pose, mouth))),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** Every polygon of a footprint, body first, for the checks that sweep all of them. */
|
|
38
|
+
export const footprintPolygons = (footprint) => [
|
|
39
|
+
footprint.bodyIn,
|
|
40
|
+
...footprint.mouthsIn,
|
|
41
|
+
];
|
|
42
|
+
/**
|
|
43
|
+
* The axis-aligned bounds of the whole footprint at a pose: the body and every mouth, which is the
|
|
44
|
+
* exact set of polygons the PERIMETER and STRUCTURE checks test. The canvas wall snap reads this,
|
|
45
|
+
* so a pose snapped flush to a wall is flush by the same measure the check uses and never reports
|
|
46
|
+
* PERIMETER (the snap once read the body alone and left a mouth hanging over the wall).
|
|
47
|
+
*/
|
|
48
|
+
export function footprintBoundsIn(pose, robot, which = "expandedIn") {
|
|
49
|
+
let minXIn = Infinity;
|
|
50
|
+
let maxXIn = -Infinity;
|
|
51
|
+
let minYIn = Infinity;
|
|
52
|
+
let maxYIn = -Infinity;
|
|
53
|
+
for (const polygon of footprintPolygons(footprintAt(pose, robot, which))) {
|
|
54
|
+
for (const corner of polygon) {
|
|
55
|
+
minXIn = Math.min(minXIn, corner.xIn);
|
|
56
|
+
maxXIn = Math.max(maxXIn, corner.xIn);
|
|
57
|
+
minYIn = Math.min(minYIn, corner.yIn);
|
|
58
|
+
maxYIn = Math.max(maxYIn, corner.yIn);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { minXIn, maxXIn, minYIn, maxYIn };
|
|
62
|
+
}
|
|
63
|
+
/** The field perimeter as a box, from `sizeIn` and where the frame puts the origin. */
|
|
64
|
+
export function fieldBounds(field) {
|
|
65
|
+
const { xIn, yIn } = field.sizeIn;
|
|
66
|
+
if (field.frame.origin === "centre") {
|
|
67
|
+
return { minXIn: -xIn / 2, maxXIn: xIn / 2, minYIn: -yIn / 2, maxYIn: yIn / 2 };
|
|
68
|
+
}
|
|
69
|
+
return { minXIn: 0, maxXIn: xIn, minYIn: 0, maxYIn: yIn };
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=footprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footprint.js","sourceRoot":"","sources":["../src/footprint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps a heading to (-pi, pi]. That interval is the one site/docs/paths-explained.md names, so -pi
|
|
3
|
+
* comes back as +pi and the result is never -0.
|
|
4
|
+
*/
|
|
5
|
+
export declare function wrapAngle(rad: number): number;
|
|
6
|
+
/** The signed short-way difference from one heading to another, in (-pi, pi]. */
|
|
7
|
+
export declare const angleDelta: (fromRad: number, toRad: number) => number;
|
|
8
|
+
/** Interpolates the short way round, so a turn from 170 deg to -170 deg is 20 deg, not 340. */
|
|
9
|
+
export declare const lerpAngle: (fromRad: number, toRad: number, t: number) => number;
|
|
10
|
+
/** Degrees are a user-interface unit only; files and core are radians (CLAUDE.md rule 3). */
|
|
11
|
+
export declare const degToRad: (deg: number) => number;
|
|
12
|
+
export declare const radToDeg: (rad: number) => number;
|
|
13
|
+
//# sourceMappingURL=angle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angle.d.ts","sourceRoot":"","sources":["../../src/geometry/angle.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK7C;AAED,iFAAiF;AACjF,eAAO,MAAM,UAAU,GAAI,SAAS,MAAM,EAAE,OAAO,MAAM,KAAG,MAAoC,CAAC;AAEjG,+FAA+F;AAC/F,eAAO,MAAM,SAAS,GAAI,SAAS,MAAM,EAAE,OAAO,MAAM,EAAE,GAAG,MAAM,KAAG,MACjB,CAAC;AAEtD,6FAA6F;AAC7F,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM,KAAG,MAA+B,CAAC;AAEvE,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM,KAAG,MAA+B,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const TWO_PI = Math.PI * 2;
|
|
2
|
+
/**
|
|
3
|
+
* Wraps a heading to (-pi, pi]. That interval is the one site/docs/paths-explained.md names, so -pi
|
|
4
|
+
* comes back as +pi and the result is never -0.
|
|
5
|
+
*/
|
|
6
|
+
export function wrapAngle(rad) {
|
|
7
|
+
let wrapped = rad % TWO_PI;
|
|
8
|
+
if (wrapped <= -Math.PI)
|
|
9
|
+
wrapped += TWO_PI;
|
|
10
|
+
else if (wrapped > Math.PI)
|
|
11
|
+
wrapped -= TWO_PI;
|
|
12
|
+
return wrapped === 0 ? 0 : wrapped;
|
|
13
|
+
}
|
|
14
|
+
/** The signed short-way difference from one heading to another, in (-pi, pi]. */
|
|
15
|
+
export const angleDelta = (fromRad, toRad) => wrapAngle(toRad - fromRad);
|
|
16
|
+
/** Interpolates the short way round, so a turn from 170 deg to -170 deg is 20 deg, not 340. */
|
|
17
|
+
export const lerpAngle = (fromRad, toRad, t) => wrapAngle(fromRad + angleDelta(fromRad, toRad) * t);
|
|
18
|
+
/** Degrees are a user-interface unit only; files and core are radians (CLAUDE.md rule 3). */
|
|
19
|
+
export const degToRad = (deg) => (deg * Math.PI) / 180;
|
|
20
|
+
export const radToDeg = (rad) => (rad * 180) / Math.PI;
|
|
21
|
+
//# sourceMappingURL=angle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angle.js","sourceRoot":"","sources":["../../src/geometry/angle.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AAE3B;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,OAAO,GAAG,GAAG,GAAG,MAAM,CAAC;IAC3B,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,MAAM,CAAC;SACtC,IAAI,OAAO,GAAG,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,MAAM,CAAC;IAC9C,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACrC,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,KAAa,EAAU,EAAE,CAAC,SAAS,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC;AAEjG,+FAA+F;AAC/F,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,KAAa,EAAE,CAAS,EAAU,EAAE,CAC7E,SAAS,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEtD,6FAA6F;AAC7F,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;AAEvE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Vec2 } from "./vec.js";
|
|
2
|
+
/**
|
|
3
|
+
* One segment: a Bezier of degree `points.length - 1`, so a line is degree 1 and a curve with one
|
|
4
|
+
* control point is degree 2 (site/docs/paths-explained.md). Parameterised
|
|
5
|
+
* by u in [0, 1].
|
|
6
|
+
*/
|
|
7
|
+
export interface Curve {
|
|
8
|
+
readonly points: readonly Vec2[];
|
|
9
|
+
readonly degree: number;
|
|
10
|
+
readonly lengthIn: number;
|
|
11
|
+
pointAt(u: number): Vec2;
|
|
12
|
+
derivativeAt(u: number): Vec2;
|
|
13
|
+
/** Arc length from 0 to u. */
|
|
14
|
+
lengthAt(u: number): number;
|
|
15
|
+
/** The u at a given arc length from the start, clamped to [0, 1]. */
|
|
16
|
+
uAtLength(sIn: number): number;
|
|
17
|
+
}
|
|
18
|
+
/** The order of the Gauss-Legendre rule: 64 samples per segment, per the spec. */
|
|
19
|
+
export declare const QUADRATURE_ORDER = 64;
|
|
20
|
+
/** Builds a curve from its control polygon: the endpoints first and last, controls between. */
|
|
21
|
+
export declare function makeCurve(points: readonly Vec2[]): Curve;
|
|
22
|
+
/** Arc length of a curve between two parameters, by the 64-point rule directly. */
|
|
23
|
+
export declare function arcLength(curve: Curve, u0?: number, u1?: number): number;
|
|
24
|
+
//# sourceMappingURL=curve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curve.d.ts","sourceRoot":"","sources":["../../src/geometry/curve.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,IAAI,EAAE,MAAM,UAAU,CAAC;AAE7C;;;;GAIG;AACH,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,8BAA8B;IAC9B,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,qEAAqE;IACrE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,kFAAkF;AAClF,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAqBnC,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,GAAG,KAAK,CAoDxD;AAED,mFAAmF;AACnF,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,SAAI,EAAE,EAAE,SAAI,GAAG,MAAM,CAE9D"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { integrate } from "./quadrature.js";
|
|
2
|
+
import { length } from "./vec.js";
|
|
3
|
+
/** The order of the Gauss-Legendre rule: 64 samples per segment, per the spec. */
|
|
4
|
+
export const QUADRATURE_ORDER = 64;
|
|
5
|
+
/** How finely the arc-length table divides a segment for the s -> u inverse. */
|
|
6
|
+
const TABLE_STEPS = 64;
|
|
7
|
+
const clamp01 = (u) => (u < 0 ? 0 : u > 1 ? 1 : u);
|
|
8
|
+
function deCasteljau(points, u) {
|
|
9
|
+
let current = points.slice();
|
|
10
|
+
while (current.length > 1) {
|
|
11
|
+
const next = [];
|
|
12
|
+
for (let i = 0; i + 1 < current.length; i += 1) {
|
|
13
|
+
const a = current[i];
|
|
14
|
+
const b = current[i + 1];
|
|
15
|
+
next.push({ xIn: a.xIn + (b.xIn - a.xIn) * u, yIn: a.yIn + (b.yIn - a.yIn) * u });
|
|
16
|
+
}
|
|
17
|
+
current = next;
|
|
18
|
+
}
|
|
19
|
+
return current[0];
|
|
20
|
+
}
|
|
21
|
+
/** Builds a curve from its control polygon: the endpoints first and last, controls between. */
|
|
22
|
+
export function makeCurve(points) {
|
|
23
|
+
if (points.length < 2)
|
|
24
|
+
throw new Error("A curve needs at least two points.");
|
|
25
|
+
const degree = points.length - 1;
|
|
26
|
+
// The derivative of a degree-n Bezier is a degree-(n-1) Bezier over the scaled differences.
|
|
27
|
+
const derivativePoints = [];
|
|
28
|
+
for (let i = 0; i < degree; i += 1) {
|
|
29
|
+
const a = points[i];
|
|
30
|
+
const b = points[i + 1];
|
|
31
|
+
derivativePoints.push({ xIn: (b.xIn - a.xIn) * degree, yIn: (b.yIn - a.yIn) * degree });
|
|
32
|
+
}
|
|
33
|
+
const pointAt = (u) => deCasteljau(points, clamp01(u));
|
|
34
|
+
const derivativeAt = (u) => deCasteljau(derivativePoints, clamp01(u));
|
|
35
|
+
const speed = (u) => length(derivativeAt(u));
|
|
36
|
+
// Cumulative arc length at TABLE_STEPS + 1 values of u, each interval integrated with the
|
|
37
|
+
// 64-point rule. The table's last entry is the segment length.
|
|
38
|
+
const table = [0];
|
|
39
|
+
for (let i = 0; i < TABLE_STEPS; i += 1) {
|
|
40
|
+
const a = i / TABLE_STEPS;
|
|
41
|
+
const b = (i + 1) / TABLE_STEPS;
|
|
42
|
+
table.push(table[i] + integrate(speed, a, b, QUADRATURE_ORDER));
|
|
43
|
+
}
|
|
44
|
+
const lengthIn = table[TABLE_STEPS];
|
|
45
|
+
const lengthAt = (u) => {
|
|
46
|
+
const clamped = clamp01(u);
|
|
47
|
+
const scaled = clamped * TABLE_STEPS;
|
|
48
|
+
const index = Math.min(Math.floor(scaled), TABLE_STEPS - 1);
|
|
49
|
+
const a = table[index];
|
|
50
|
+
const b = table[index + 1];
|
|
51
|
+
return a + (b - a) * (scaled - index);
|
|
52
|
+
};
|
|
53
|
+
const uAtLength = (sIn) => {
|
|
54
|
+
if (sIn <= 0 || lengthIn === 0)
|
|
55
|
+
return 0;
|
|
56
|
+
if (sIn >= lengthIn)
|
|
57
|
+
return 1;
|
|
58
|
+
let low = 0;
|
|
59
|
+
let high = TABLE_STEPS;
|
|
60
|
+
while (high - low > 1) {
|
|
61
|
+
const middle = (low + high) >> 1;
|
|
62
|
+
if (table[middle] <= sIn)
|
|
63
|
+
low = middle;
|
|
64
|
+
else
|
|
65
|
+
high = middle;
|
|
66
|
+
}
|
|
67
|
+
const a = table[low];
|
|
68
|
+
const b = table[low + 1];
|
|
69
|
+
const within = b === a ? 0 : (sIn - a) / (b - a);
|
|
70
|
+
return (low + within) / TABLE_STEPS;
|
|
71
|
+
};
|
|
72
|
+
return { points, degree, lengthIn, pointAt, derivativeAt, lengthAt, uAtLength };
|
|
73
|
+
}
|
|
74
|
+
/** Arc length of a curve between two parameters, by the 64-point rule directly. */
|
|
75
|
+
export function arcLength(curve, u0 = 0, u1 = 1) {
|
|
76
|
+
return integrate((u) => length(curve.derivativeAt(u)), u0, u1, QUADRATURE_ORDER);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=curve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curve.js","sourceRoot":"","sources":["../../src/geometry/curve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Curve } from "./curve.js";
|
|
2
|
+
import type { Vec2 } from "./vec.js";
|
|
3
|
+
/**
|
|
4
|
+
* A path step's geometry: a sequence of continuous segments re-parameterised by arc length to a
|
|
5
|
+
* single t in [0, 1], so markers and headings mean the same thing the runtime sees
|
|
6
|
+
* (site/docs/paths-explained.md).
|
|
7
|
+
*/
|
|
8
|
+
export interface PathGeometry {
|
|
9
|
+
readonly curves: readonly Curve[];
|
|
10
|
+
readonly lengthIn: number;
|
|
11
|
+
/** Arc length at the start of each curve, plus the total as the last entry. */
|
|
12
|
+
readonly breaks: readonly number[];
|
|
13
|
+
pointAtDistance(sIn: number): Vec2;
|
|
14
|
+
tangentAtDistance(sIn: number): Vec2;
|
|
15
|
+
pointAt(t: number): Vec2;
|
|
16
|
+
tangentAt(t: number): Vec2;
|
|
17
|
+
/** Arc length at t. */
|
|
18
|
+
distanceAt(t: number): number;
|
|
19
|
+
/** t at an arc length from the start. */
|
|
20
|
+
tAtDistance(sIn: number): number;
|
|
21
|
+
}
|
|
22
|
+
export declare const SAMPLE_SPACING_IN = 2;
|
|
23
|
+
export declare function makePath(segments: readonly (readonly Vec2[])[]): PathGeometry;
|
|
24
|
+
/**
|
|
25
|
+
* Sample distances along the path: every `spacingIn` inches, plus both endpoints and every segment
|
|
26
|
+
* boundary, sorted and de-duplicated. The check sampler and the footprint sweep share this.
|
|
27
|
+
*/
|
|
28
|
+
export declare function sampleDistances(path: PathGeometry, spacingIn?: number): number[];
|
|
29
|
+
//# sourceMappingURL=path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/geometry/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAErC;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,uBAAuB;IACvB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,yCAAyC;IACzC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC;AAED,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,GAAG,YAAY,CAsC7E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,YAAY,EAClB,SAAS,GAAE,MAA0B,GACpC,MAAM,EAAE,CAYV"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { makeCurve } from "./curve.js";
|
|
2
|
+
export const SAMPLE_SPACING_IN = 2;
|
|
3
|
+
export function makePath(segments) {
|
|
4
|
+
if (segments.length === 0)
|
|
5
|
+
throw new Error("A path needs at least one segment.");
|
|
6
|
+
const curves = segments.map((points) => makeCurve(points));
|
|
7
|
+
const breaks = [0];
|
|
8
|
+
for (const curve of curves)
|
|
9
|
+
breaks.push(breaks[breaks.length - 1] + curve.lengthIn);
|
|
10
|
+
const lengthIn = breaks[breaks.length - 1];
|
|
11
|
+
const locate = (sIn) => {
|
|
12
|
+
const clamped = sIn <= 0 ? 0 : sIn >= lengthIn ? lengthIn : sIn;
|
|
13
|
+
let index = 0;
|
|
14
|
+
while (index + 1 < curves.length && breaks[index + 1] < clamped)
|
|
15
|
+
index += 1;
|
|
16
|
+
const curve = curves[index];
|
|
17
|
+
return { curve, u: curve.uAtLength(clamped - breaks[index]) };
|
|
18
|
+
};
|
|
19
|
+
const pointAtDistance = (sIn) => {
|
|
20
|
+
const { curve, u } = locate(sIn);
|
|
21
|
+
return curve.pointAt(u);
|
|
22
|
+
};
|
|
23
|
+
const tangentAtDistance = (sIn) => {
|
|
24
|
+
const { curve, u } = locate(sIn);
|
|
25
|
+
return curve.derivativeAt(u);
|
|
26
|
+
};
|
|
27
|
+
const distanceAt = (t) => (t <= 0 ? 0 : t >= 1 ? lengthIn : t * lengthIn);
|
|
28
|
+
const tAtDistance = (sIn) => lengthIn === 0 ? 0 : sIn <= 0 ? 0 : sIn >= lengthIn ? 1 : sIn / lengthIn;
|
|
29
|
+
return {
|
|
30
|
+
curves,
|
|
31
|
+
lengthIn,
|
|
32
|
+
breaks,
|
|
33
|
+
pointAtDistance,
|
|
34
|
+
tangentAtDistance,
|
|
35
|
+
pointAt: (t) => pointAtDistance(distanceAt(t)),
|
|
36
|
+
tangentAt: (t) => tangentAtDistance(distanceAt(t)),
|
|
37
|
+
distanceAt,
|
|
38
|
+
tAtDistance,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Sample distances along the path: every `spacingIn` inches, plus both endpoints and every segment
|
|
43
|
+
* boundary, sorted and de-duplicated. The check sampler and the footprint sweep share this.
|
|
44
|
+
*/
|
|
45
|
+
export function sampleDistances(path, spacingIn = SAMPLE_SPACING_IN) {
|
|
46
|
+
const distances = [0];
|
|
47
|
+
for (let s = spacingIn; s < path.lengthIn; s += spacingIn)
|
|
48
|
+
distances.push(s);
|
|
49
|
+
for (const at of path.breaks)
|
|
50
|
+
distances.push(at);
|
|
51
|
+
distances.push(path.lengthIn);
|
|
52
|
+
distances.sort((a, b) => a - b);
|
|
53
|
+
const unique = [];
|
|
54
|
+
for (const value of distances) {
|
|
55
|
+
const previous = unique[unique.length - 1];
|
|
56
|
+
if (previous === undefined || value - previous > 1e-9)
|
|
57
|
+
unique.push(value);
|
|
58
|
+
}
|
|
59
|
+
return unique;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/geometry/path.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gauss-Legendre nodes and weights, computed once per order by Newton's method on the Legendre
|
|
3
|
+
* polynomial. Deterministic and pure: the same order always yields the same numbers, so two runs
|
|
4
|
+
* of `plan` on the same files agree to the last bit.
|
|
5
|
+
*/
|
|
6
|
+
export interface Quadrature {
|
|
7
|
+
nodes: number[];
|
|
8
|
+
weights: number[];
|
|
9
|
+
}
|
|
10
|
+
export declare function gaussLegendre(order: number): Quadrature;
|
|
11
|
+
/** Integrates f over [a, b] with an `order`-point Gauss-Legendre rule. */
|
|
12
|
+
export declare function integrate(f: (x: number) => number, a: number, b: number, order: number): number;
|
|
13
|
+
//# sourceMappingURL=quadrature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quadrature.d.ts","sourceRoot":"","sources":["../../src/geometry/quadrature.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAkBD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CA2BvD;AAED,0EAA0E;AAC1E,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAS/F"}
|