@drawtonomy/sdk 0.8.0 → 0.10.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 (46) hide show
  1. package/dist/exporter/index.d.ts +5 -2
  2. package/dist/exporter/index.d.ts.map +1 -1
  3. package/dist/exporter/index.js +3 -0
  4. package/dist/exporter/index.js.map +1 -1
  5. package/dist/exporter/lanelet2.d.ts.map +1 -1
  6. package/dist/exporter/lanelet2.js +434 -2
  7. package/dist/exporter/lanelet2.js.map +1 -1
  8. package/dist/exporter/odrCarryThrough.d.ts +89 -0
  9. package/dist/exporter/odrCarryThrough.d.ts.map +1 -0
  10. package/dist/exporter/odrCarryThrough.js +186 -0
  11. package/dist/exporter/odrCarryThrough.js.map +1 -0
  12. package/dist/exporter/odrGeometry.d.ts +64 -0
  13. package/dist/exporter/odrGeometry.d.ts.map +1 -0
  14. package/dist/exporter/odrGeometry.js +324 -0
  15. package/dist/exporter/odrGeometry.js.map +1 -0
  16. package/dist/exporter/odrGeometryFit.d.ts +37 -0
  17. package/dist/exporter/odrGeometryFit.d.ts.map +1 -0
  18. package/dist/exporter/odrGeometryFit.js +476 -0
  19. package/dist/exporter/odrGeometryFit.js.map +1 -0
  20. package/dist/exporter/odrToShapes.d.ts +53 -0
  21. package/dist/exporter/odrToShapes.d.ts.map +1 -0
  22. package/dist/exporter/odrToShapes.js +1696 -0
  23. package/dist/exporter/odrToShapes.js.map +1 -0
  24. package/dist/exporter/opendrive.d.ts +14 -1
  25. package/dist/exporter/opendrive.d.ts.map +1 -1
  26. package/dist/exporter/opendrive.js +1813 -163
  27. package/dist/exporter/opendrive.js.map +1 -1
  28. package/dist/exporter/opendriveParser.d.ts +194 -0
  29. package/dist/exporter/opendriveParser.d.ts.map +1 -0
  30. package/dist/exporter/opendriveParser.js +429 -0
  31. package/dist/exporter/opendriveParser.js.map +1 -0
  32. package/dist/exporter/osmToShapes.d.ts +52 -3
  33. package/dist/exporter/osmToShapes.d.ts.map +1 -1
  34. package/dist/exporter/osmToShapes.js +208 -5
  35. package/dist/exporter/osmToShapes.js.map +1 -1
  36. package/dist/exporter/projection.d.ts +1 -1
  37. package/dist/exporter/projection.d.ts.map +1 -1
  38. package/dist/exporter/projection.js +2 -3
  39. package/dist/exporter/projection.js.map +1 -1
  40. package/dist/exporter/units.d.ts +7 -0
  41. package/dist/exporter/units.d.ts.map +1 -1
  42. package/dist/exporter/units.js +11 -0
  43. package/dist/exporter/units.js.map +1 -1
  44. package/dist/types.d.ts +27 -1
  45. package/dist/types.d.ts.map +1 -1
  46. package/package.json +1 -1
@@ -0,0 +1,89 @@
1
+ import type { Point2D } from './laneCenterline';
2
+ /** Per-road record captured at import time (stored in the sidecar). */
3
+ export interface OdrRoadRecord {
4
+ /** Lane shape ids materialized from this road, in materialization order. */
5
+ laneShapeIds: string[];
6
+ /** Hash of the road's editable shape state at import time. */
7
+ stateHash: string;
8
+ }
9
+ /** Editable state of one lane shape, as fed into the road state hash. */
10
+ export interface CarryLaneState {
11
+ /** Left boundary points in travel order (canvas px), or null when unusable. */
12
+ leftPts: readonly Point2D[] | null;
13
+ rightPts: readonly Point2D[] | null;
14
+ attributes: Record<string, string | undefined>;
15
+ next: readonly string[];
16
+ prev: readonly string[];
17
+ yieldLaneIds: readonly string[];
18
+ }
19
+ /** Editable state of a regulatory shape (traffic light / crosswalk). */
20
+ export interface CarryRegulatoryState {
21
+ kind: 'traffic_light' | 'crosswalk';
22
+ shapeId: string;
23
+ /** Positional numeric fields (position, size, rotation). */
24
+ numbers: readonly number[];
25
+ attributes: Record<string, string | undefined>;
26
+ affectedLaneIds: readonly string[];
27
+ stopLinePts: readonly Point2D[] | null;
28
+ controllerId: string;
29
+ }
30
+ /**
31
+ * Deterministic serialization of a road's editable shape state. Lane order
32
+ * follows the record's laneShapeIds (identical on both sides by
33
+ * construction); regulatory shapes are sorted by shape id.
34
+ */
35
+ export declare function serializeRoadState(lanes: readonly CarryLaneState[], regulatory: readonly CarryRegulatoryState[]): string;
36
+ /** Hash of `serializeRoadState` (two independent 32-bit FNV-1a streams). */
37
+ export declare function hashRoadState(lanes: readonly CarryLaneState[], regulatory: readonly CarryRegulatoryState[]): string;
38
+ export interface OdrDocRoad {
39
+ id: string;
40
+ /** Junction this road belongs to ("-1" for normal roads). */
41
+ junction: string;
42
+ /** Verbatim element text (exact substring of the original XML). */
43
+ text: string;
44
+ /** elementIds of road-level <predecessor>/<successor> with elementType="road". */
45
+ linkRoadRefs: string[];
46
+ /** elementIds of road-level links with elementType="junction". */
47
+ linkJunctionRefs: string[];
48
+ /** ids of <signal> definitions inside this road. */
49
+ signalIds: string[];
50
+ }
51
+ export interface OdrDocJunction {
52
+ id: string;
53
+ text: string;
54
+ /** incomingRoad / connectingRoad ids referenced by <connection> records. */
55
+ memberRoadIds: string[];
56
+ }
57
+ export interface OdrDocController {
58
+ id: string;
59
+ text: string;
60
+ /** signalIds referenced by <control> records. */
61
+ signalIds: string[];
62
+ }
63
+ export interface OdrDocument {
64
+ headerText: string | null;
65
+ roads: OdrDocRoad[];
66
+ junctions: OdrDocJunction[];
67
+ controllers: OdrDocController[];
68
+ /** Largest numeric id over roads / junctions (0 when none are numeric). */
69
+ maxNumericElementId: number;
70
+ /** Largest numeric id over <signal>/<signalReference> records. */
71
+ maxNumericSignalId: number;
72
+ /** Largest numeric <controller> id. */
73
+ maxNumericControllerId: number;
74
+ }
75
+ /**
76
+ * Extract the verbatim header / road / junction / controller blocks from an
77
+ * OpenDRIVE document. Returns null when the input does not look like
78
+ * OpenDRIVE XML. Regex block matching is safe here because none of these
79
+ * elements nest within themselves.
80
+ */
81
+ export declare function extractOdrDocument(xml: string): OdrDocument | null;
82
+ /**
83
+ * Rewrite the elementId of road-level <predecessor>/<successor> records
84
+ * according to `roadMapping` (elementType="road") and `junctionMapping`
85
+ * (elementType="junction"), each original id -> new id. Every byte outside
86
+ * the rewritten attribute values is preserved.
87
+ */
88
+ export declare function rewriteRoadLinkTargets(text: string, roadMapping: Map<string, string>, junctionMapping?: Map<string, string>): string;
89
+ //# sourceMappingURL=odrCarryThrough.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"odrCarryThrough.d.ts","sourceRoot":"","sources":["../../src/exporter/odrCarryThrough.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE/C,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,+EAA+E;IAC/E,OAAO,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAAA;IAClC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAAA;IACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IAC9C,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;IACvB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;IACvB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;CAChC;AAED,wEAAwE;AACxE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,eAAe,GAAG,WAAW,CAAA;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,4DAA4D;IAC5D,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IAC9C,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,WAAW,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAAA;IACtC,YAAY,EAAE,MAAM,CAAA;CACrB;AAcD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,UAAU,EAAE,SAAS,oBAAoB,EAAE,GAC1C,MAAM,CAiBR;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,UAAU,EAAE,SAAS,oBAAoB,EAAE,GAC1C,MAAM,CAYR;AAMD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAA;IAChB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAA;IACZ,kFAAkF;IAClF,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,kEAAkE;IAClE,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,oDAAoD;IACpD,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,4EAA4E;IAC5E,aAAa,EAAE,MAAM,EAAE,CAAA;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,iDAAiD;IACjD,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,WAAW,EAAE,gBAAgB,EAAE,CAAA;IAC/B,2EAA2E;IAC3E,mBAAmB,EAAE,MAAM,CAAA;IAC3B,kEAAkE;IAClE,kBAAkB,EAAE,MAAM,CAAA;IAC1B,uCAAuC;IACvC,sBAAsB,EAAE,MAAM,CAAA;CAC/B;AAgBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAgFlE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,eAAe,GAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAa,GAC/C,MAAM,CAYR"}
@@ -0,0 +1,186 @@
1
+ // Carry-through support for OpenDRIVE round trips.
2
+ //
3
+ // An imported .xodr keeps its original XML in the sidecar. On export, roads
4
+ // whose shapes were NOT edited since import are re-emitted verbatim (the
5
+ // exact original <road> element text), and only edited roads go through the
6
+ // regular fitting exporter. This makes an unedited import -> export round
7
+ // trip lossless at the XML level, including features the shape model does
8
+ // not represent (elevation profiles, unknown signal types, custom userData).
9
+ //
10
+ // Two halves live here, shared by the importer and the exporter:
11
+ //
12
+ // 1. Road state hashing. At import time `odrToShapes` records, per source
13
+ // road, the shape ids it materialized plus a hash over their editable
14
+ // state: boundary point sequences (in travel order), lane attributes,
15
+ // next/prev connectivity, right-of-way links, and every regulatory shape
16
+ // (traffic light / crosswalk) touching the road. At export time the same
17
+ // hash is recomputed from the live shapes; equality means "unedited".
18
+ //
19
+ // 2. Raw document access. <header> / <road> / <junction> / <controller>
20
+ // elements are extracted from the original XML as verbatim text blocks
21
+ // together with their ids and cross-references (link targets, junction
22
+ // membership, signal definitions), so the exporter can decide what stays
23
+ // verbatim, propagate dirtiness across junctions, keep id spaces
24
+ // collision-free, and rewrite only the link elementIds that must point at
25
+ // regenerated roads — leaving every other byte untouched.
26
+ const fmtPts = (pts) => pts ? pts.map(p => `${p.x},${p.y}`).join(';') : 'null';
27
+ const fmtAttrs = (attrs) => Object.entries(attrs)
28
+ .filter(([, v]) => v !== undefined && v !== null)
29
+ .map(([k, v]) => `${k}=${v}`)
30
+ .sort()
31
+ .join('&');
32
+ const fmtIds = (ids) => [...ids].sort().join(',');
33
+ /**
34
+ * Deterministic serialization of a road's editable shape state. Lane order
35
+ * follows the record's laneShapeIds (identical on both sides by
36
+ * construction); regulatory shapes are sorted by shape id.
37
+ */
38
+ export function serializeRoadState(lanes, regulatory) {
39
+ const laneStr = lanes
40
+ .map(l => `L:${fmtPts(l.leftPts)}|R:${fmtPts(l.rightPts)}|A:${fmtAttrs(l.attributes)}` +
41
+ `|N:${fmtIds(l.next)}|P:${fmtIds(l.prev)}|Y:${fmtIds(l.yieldLaneIds)}`)
42
+ .join('\n');
43
+ const regStr = [...regulatory]
44
+ .sort((a, b) => (a.shapeId < b.shapeId ? -1 : a.shapeId > b.shapeId ? 1 : 0))
45
+ .map(r => `${r.kind}:${r.shapeId}|#:${r.numbers.join(',')}|A:${fmtAttrs(r.attributes)}` +
46
+ `|F:${fmtIds(r.affectedLaneIds)}|S:${fmtPts(r.stopLinePts)}|C:${r.controllerId}`)
47
+ .join('\n');
48
+ return `${laneStr}\u0000${regStr}`;
49
+ }
50
+ /** Hash of `serializeRoadState` (two independent 32-bit FNV-1a streams). */
51
+ export function hashRoadState(lanes, regulatory) {
52
+ const s = serializeRoadState(lanes, regulatory);
53
+ let a = 0x811c9dc5 | 0;
54
+ let b = (0x811c9dc5 ^ 0x5bd1e995) | 0;
55
+ for (let i = 0; i < s.length; i++) {
56
+ const c = s.charCodeAt(i);
57
+ a = Math.imul(a ^ c, 0x01000193);
58
+ b = Math.imul(b ^ c, 0x01000197);
59
+ }
60
+ return ((a >>> 0).toString(16).padStart(8, '0') + (b >>> 0).toString(16).padStart(8, '0'));
61
+ }
62
+ /** Match all `<tag .../>` or `<tag ...>...</tag>` blocks (tags do not nest). */
63
+ function matchBlocks(xml, tag) {
64
+ const re = new RegExp(`<${tag}\\b[^>]*(?:/>|>[\\s\\S]*?</${tag}>)`, 'g');
65
+ return xml.match(re) ?? [];
66
+ }
67
+ /** Attribute value from an element's opening tag, or null. */
68
+ function attrOf(block, name) {
69
+ const end = block.indexOf('>');
70
+ const open = end >= 0 ? block.slice(0, end + 1) : block;
71
+ const m = open.match(new RegExp(`\\b${name}="([^"]*)"`));
72
+ return m ? m[1] : null;
73
+ }
74
+ /**
75
+ * Extract the verbatim header / road / junction / controller blocks from an
76
+ * OpenDRIVE document. Returns null when the input does not look like
77
+ * OpenDRIVE XML. Regex block matching is safe here because none of these
78
+ * elements nest within themselves.
79
+ */
80
+ export function extractOdrDocument(xml) {
81
+ if (!/<OpenDRIVE[\s>]/.test(xml))
82
+ return null;
83
+ const headerMatch = xml.match(/<header\b[^>]*(?:\/>|>[\s\S]*?<\/header>)/);
84
+ const roads = [];
85
+ for (const text of matchBlocks(xml, 'road')) {
86
+ const id = attrOf(text, 'id');
87
+ if (id === null)
88
+ continue;
89
+ const linkRoadRefs = [];
90
+ const linkJunctionRefs = [];
91
+ for (const tag of text.match(/<(?:predecessor|successor)\b[^>]*\/?>/g) ?? []) {
92
+ const elementType = tag.match(/\belementType="([^"]*)"/)?.[1];
93
+ const elementId = tag.match(/\belementId="([^"]*)"/)?.[1];
94
+ if (elementId === undefined)
95
+ continue;
96
+ if (elementType === 'road')
97
+ linkRoadRefs.push(elementId);
98
+ else if (elementType === 'junction')
99
+ linkJunctionRefs.push(elementId);
100
+ }
101
+ const signalIds = [];
102
+ for (const tag of text.match(/<signal\b[^>]*/g) ?? []) {
103
+ const sid = tag.match(/\bid="([^"]*)"/)?.[1];
104
+ if (sid !== undefined)
105
+ signalIds.push(sid);
106
+ }
107
+ roads.push({
108
+ id,
109
+ junction: attrOf(text, 'junction') ?? '-1',
110
+ text,
111
+ linkRoadRefs,
112
+ linkJunctionRefs,
113
+ signalIds,
114
+ });
115
+ }
116
+ const junctions = [];
117
+ for (const text of matchBlocks(xml, 'junction')) {
118
+ const id = attrOf(text, 'id');
119
+ if (id === null)
120
+ continue;
121
+ const memberRoadIds = [];
122
+ for (const tag of text.match(/<connection\b[^>]*/g) ?? []) {
123
+ for (const name of ['incomingRoad', 'connectingRoad']) {
124
+ const v = tag.match(new RegExp(`\\b${name}="([^"]*)"`))?.[1];
125
+ if (v !== undefined && !memberRoadIds.includes(v))
126
+ memberRoadIds.push(v);
127
+ }
128
+ }
129
+ junctions.push({ id, text, memberRoadIds });
130
+ }
131
+ const controllers = [];
132
+ for (const text of matchBlocks(xml, 'controller')) {
133
+ const id = attrOf(text, 'id') ?? '';
134
+ const signalIds = [];
135
+ for (const tag of text.match(/<control\b[^>]*/g) ?? []) {
136
+ const sid = tag.match(/\bsignalId="([^"]*)"/)?.[1];
137
+ if (sid !== undefined)
138
+ signalIds.push(sid);
139
+ }
140
+ controllers.push({ id, text, signalIds });
141
+ }
142
+ const numericMax = (ids) => {
143
+ let max = 0;
144
+ for (const id of ids) {
145
+ if (/^\d+$/.test(id))
146
+ max = Math.max(max, parseInt(id, 10));
147
+ }
148
+ return max;
149
+ };
150
+ const signalRefIds = [];
151
+ for (const tag of xml.match(/<signalReference\b[^>]*/g) ?? []) {
152
+ const sid = tag.match(/\bid="([^"]*)"/)?.[1];
153
+ if (sid !== undefined)
154
+ signalRefIds.push(sid);
155
+ }
156
+ return {
157
+ headerText: headerMatch ? headerMatch[0] : null,
158
+ roads,
159
+ junctions,
160
+ controllers,
161
+ maxNumericElementId: numericMax([...roads.map(r => r.id), ...junctions.map(j => j.id)]),
162
+ maxNumericSignalId: numericMax([...roads.flatMap(r => r.signalIds), ...signalRefIds]),
163
+ maxNumericControllerId: numericMax(controllers.map(c => c.id)),
164
+ };
165
+ }
166
+ /**
167
+ * Rewrite the elementId of road-level <predecessor>/<successor> records
168
+ * according to `roadMapping` (elementType="road") and `junctionMapping`
169
+ * (elementType="junction"), each original id -> new id. Every byte outside
170
+ * the rewritten attribute values is preserved.
171
+ */
172
+ export function rewriteRoadLinkTargets(text, roadMapping, junctionMapping = new Map()) {
173
+ if (roadMapping.size === 0 && junctionMapping.size === 0)
174
+ return text;
175
+ return text.replace(/<(?:predecessor|successor)\b[^>]*\/?>/g, tag => {
176
+ const elementType = tag.match(/\belementType="([^"]*)"/)?.[1];
177
+ const mapping = elementType === 'road' ? roadMapping : elementType === 'junction' ? junctionMapping : null;
178
+ if (!mapping || mapping.size === 0)
179
+ return tag;
180
+ return tag.replace(/(\belementId=")([^"]*)(")/, (m, pre, idv, post) => {
181
+ const repl = mapping.get(idv);
182
+ return repl !== undefined ? pre + repl + post : m;
183
+ });
184
+ });
185
+ }
186
+ //# sourceMappingURL=odrCarryThrough.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"odrCarryThrough.js","sourceRoot":"","sources":["../../src/exporter/odrCarryThrough.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import type { OdrCubic, OdrGeometry, OdrRoad } from './opendriveParser';
2
+ /** Pose on the reference line: inertial position + heading. */
3
+ export interface GeomPose {
4
+ x: number;
5
+ y: number;
6
+ hdg: number;
7
+ }
8
+ /**
9
+ * Fresnel integrals in the normalized convention:
10
+ * C(t) = ∫₀ᵗ cos(π u² / 2) du, S(t) = ∫₀ᵗ sin(π u² / 2) du
11
+ *
12
+ * Implementation follows the classic two-regime scheme (see Abramowitz &
13
+ * Stegun §7.3 and Press et al., "Numerical Recipes", §6.9 "Fresnel Integrals"):
14
+ * - |t| ≤ 1.5: power series expansion (A&S 7.3.11/7.3.13), which converges
15
+ * rapidly in this range.
16
+ * - |t| > 1.5: evaluation through the complex continued fraction for the
17
+ * related complementary error function, computed with the modified Lentz
18
+ * algorithm. Accuracy is limited only by EPS (~1e-12 here), far better
19
+ * than the ~1e-8 needed for sub-millimeter road geometry.
20
+ *
21
+ * Both C and S are odd functions, so negative arguments are handled by sign.
22
+ */
23
+ export declare function fresnel(t: number): {
24
+ C: number;
25
+ S: number;
26
+ };
27
+ /** Evaluate a cubic polynomial record at a local offset ds. */
28
+ export declare function evalPoly3(rec: OdrCubic, ds: number): number;
29
+ /** Derivative of a cubic polynomial record at a local offset ds. */
30
+ export declare function evalPoly3Derivative(rec: OdrCubic, ds: number): number;
31
+ /**
32
+ * Evaluate a plan-view geometry at offset `ds` (m) from its start.
33
+ * Returns the inertial position and heading.
34
+ */
35
+ export declare function evalGeometry(geom: OdrGeometry, ds: number): GeomPose;
36
+ export interface SampleReferenceLineOptions {
37
+ /** Maximum allowed chord deviation at the midpoint of a step (m). Default 0.05. */
38
+ maxChordErrorMeters?: number;
39
+ /** Maximum station spacing (m). Default 5. */
40
+ maxStepMeters?: number;
41
+ /**
42
+ * Additional stations that must appear in the output (e.g. laneSection
43
+ * starts, laneOffset breakpoints). Values outside [0, road.length] are
44
+ * clamped/ignored.
45
+ */
46
+ extraStations?: readonly number[];
47
+ }
48
+ export interface ReferenceSample {
49
+ /** Station along the road reference line (m). */
50
+ s: number;
51
+ x: number;
52
+ y: number;
53
+ hdg: number;
54
+ }
55
+ /**
56
+ * Adaptively sample a road's reference line.
57
+ *
58
+ * Stations always include s = 0, s = road.length, every plan-view geometry
59
+ * boundary, and the caller's `extraStations`. Between those, intervals are
60
+ * recursively bisected until the chord deviation at the interval midpoint is
61
+ * below `maxChordErrorMeters` and the step is at most `maxStepMeters`.
62
+ */
63
+ export declare function sampleReferenceLine(road: OdrRoad, options?: SampleReferenceLineOptions): ReferenceSample[];
64
+ //# sourceMappingURL=odrGeometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"odrGeometry.d.ts","sourceRoot":"","sources":["../../src/exporter/odrGeometry.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAEvE,+DAA+D;AAC/D,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,GAAG,EAAE,MAAM,CAAA;CACZ;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAsF3D;AAMD,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAErE;AAyGD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,QAAQ,CAapE;AAMD,MAAM,WAAW,0BAA0B;IACzC,mFAAmF;IACnF,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,8CAA8C;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,GAAG,EAAE,MAAM,CAAA;CACZ;AAsBD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,0BAA+B,GACvC,eAAe,EAAE,CAgEnB"}