@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.
- package/dist/exporter/index.d.ts +5 -2
- package/dist/exporter/index.d.ts.map +1 -1
- package/dist/exporter/index.js +3 -0
- package/dist/exporter/index.js.map +1 -1
- package/dist/exporter/lanelet2.d.ts.map +1 -1
- package/dist/exporter/lanelet2.js +434 -2
- package/dist/exporter/lanelet2.js.map +1 -1
- package/dist/exporter/odrCarryThrough.d.ts +89 -0
- package/dist/exporter/odrCarryThrough.d.ts.map +1 -0
- package/dist/exporter/odrCarryThrough.js +186 -0
- package/dist/exporter/odrCarryThrough.js.map +1 -0
- package/dist/exporter/odrGeometry.d.ts +64 -0
- package/dist/exporter/odrGeometry.d.ts.map +1 -0
- package/dist/exporter/odrGeometry.js +324 -0
- package/dist/exporter/odrGeometry.js.map +1 -0
- package/dist/exporter/odrGeometryFit.d.ts +37 -0
- package/dist/exporter/odrGeometryFit.d.ts.map +1 -0
- package/dist/exporter/odrGeometryFit.js +476 -0
- package/dist/exporter/odrGeometryFit.js.map +1 -0
- package/dist/exporter/odrToShapes.d.ts +53 -0
- package/dist/exporter/odrToShapes.d.ts.map +1 -0
- package/dist/exporter/odrToShapes.js +1696 -0
- package/dist/exporter/odrToShapes.js.map +1 -0
- package/dist/exporter/opendrive.d.ts +14 -1
- package/dist/exporter/opendrive.d.ts.map +1 -1
- package/dist/exporter/opendrive.js +1813 -163
- package/dist/exporter/opendrive.js.map +1 -1
- package/dist/exporter/opendriveParser.d.ts +194 -0
- package/dist/exporter/opendriveParser.d.ts.map +1 -0
- package/dist/exporter/opendriveParser.js +429 -0
- package/dist/exporter/opendriveParser.js.map +1 -0
- package/dist/exporter/osmToShapes.d.ts +52 -3
- package/dist/exporter/osmToShapes.d.ts.map +1 -1
- package/dist/exporter/osmToShapes.js +208 -5
- package/dist/exporter/osmToShapes.js.map +1 -1
- package/dist/exporter/projection.d.ts +1 -1
- package/dist/exporter/projection.d.ts.map +1 -1
- package/dist/exporter/projection.js +2 -3
- package/dist/exporter/projection.js.map +1 -1
- package/dist/exporter/units.d.ts +7 -0
- package/dist/exporter/units.d.ts.map +1 -1
- package/dist/exporter/units.js +11 -0
- package/dist/exporter/units.js.map +1 -1
- package/dist/types.d.ts +27 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
// Analytic evaluation of OpenDRIVE plan-view geometry.
|
|
2
|
+
//
|
|
3
|
+
// Supported primitives: line, arc, spiral (Euler clothoid via Fresnel
|
|
4
|
+
// integrals), paramPoly3 (both pRange modes), and the deprecated poly3.
|
|
5
|
+
// `sampleReferenceLine` adaptively samples a road's reference line under a
|
|
6
|
+
// maximum chord error + maximum step, always including geometry boundaries
|
|
7
|
+
// (and any caller-supplied stations such as laneSection starts).
|
|
8
|
+
//
|
|
9
|
+
// No external dependencies.
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Fresnel integrals
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
/**
|
|
14
|
+
* Fresnel integrals in the normalized convention:
|
|
15
|
+
* C(t) = ∫₀ᵗ cos(π u² / 2) du, S(t) = ∫₀ᵗ sin(π u² / 2) du
|
|
16
|
+
*
|
|
17
|
+
* Implementation follows the classic two-regime scheme (see Abramowitz &
|
|
18
|
+
* Stegun §7.3 and Press et al., "Numerical Recipes", §6.9 "Fresnel Integrals"):
|
|
19
|
+
* - |t| ≤ 1.5: power series expansion (A&S 7.3.11/7.3.13), which converges
|
|
20
|
+
* rapidly in this range.
|
|
21
|
+
* - |t| > 1.5: evaluation through the complex continued fraction for the
|
|
22
|
+
* related complementary error function, computed with the modified Lentz
|
|
23
|
+
* algorithm. Accuracy is limited only by EPS (~1e-12 here), far better
|
|
24
|
+
* than the ~1e-8 needed for sub-millimeter road geometry.
|
|
25
|
+
*
|
|
26
|
+
* Both C and S are odd functions, so negative arguments are handled by sign.
|
|
27
|
+
*/
|
|
28
|
+
export function fresnel(t) {
|
|
29
|
+
const EPS = 1e-12;
|
|
30
|
+
const MAXIT = 120;
|
|
31
|
+
const SERIES_MAX = 1.5;
|
|
32
|
+
const ax = Math.abs(t);
|
|
33
|
+
let c;
|
|
34
|
+
let s;
|
|
35
|
+
if (ax < 1e-30) {
|
|
36
|
+
c = ax;
|
|
37
|
+
s = 0;
|
|
38
|
+
}
|
|
39
|
+
else if (ax <= SERIES_MAX) {
|
|
40
|
+
// Power series (A&S 7.3.11 / 7.3.13):
|
|
41
|
+
// C(x) = Σ (-1)^n (π/2)^(2n) x^(4n+1) / ((2n)! (4n+1))
|
|
42
|
+
// S(x) = Σ (-1)^n (π/2)^(2n+1) x^(4n+3) / ((2n+1)! (4n+3))
|
|
43
|
+
const h = (Math.PI / 2) * ax * ax;
|
|
44
|
+
const h2 = h * h;
|
|
45
|
+
let cTerm = ax; // x * (π/2 x²)^0 / 0!
|
|
46
|
+
let sTerm = ax * h; // x * (π/2 x²)^1 / 1!
|
|
47
|
+
c = cTerm; // n = 0 contribution: cTerm / 1
|
|
48
|
+
s = sTerm / 3; // n = 0 contribution: sTerm / 3
|
|
49
|
+
for (let n = 1; n <= MAXIT; n++) {
|
|
50
|
+
cTerm *= -h2 / ((2 * n - 1) * (2 * n));
|
|
51
|
+
sTerm *= -h2 / ((2 * n) * (2 * n + 1));
|
|
52
|
+
const dc = cTerm / (4 * n + 1);
|
|
53
|
+
const ds = sTerm / (4 * n + 3);
|
|
54
|
+
c += dc;
|
|
55
|
+
s += ds;
|
|
56
|
+
if (Math.abs(dc) + Math.abs(ds) < EPS * (Math.abs(c) + Math.abs(s)))
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Complex continued fraction via modified Lentz (Numerical Recipes §6.9).
|
|
62
|
+
const pix2 = Math.PI * ax * ax;
|
|
63
|
+
let bRe = 1;
|
|
64
|
+
let bIm = -pix2;
|
|
65
|
+
const BIG = 1e100;
|
|
66
|
+
let ccRe = BIG;
|
|
67
|
+
let ccIm = 0;
|
|
68
|
+
let den = bRe * bRe + bIm * bIm;
|
|
69
|
+
let dRe = bRe / den;
|
|
70
|
+
let dIm = -bIm / den;
|
|
71
|
+
let hRe = dRe;
|
|
72
|
+
let hIm = dIm;
|
|
73
|
+
let n = -1;
|
|
74
|
+
for (let k = 2; k <= MAXIT; k++) {
|
|
75
|
+
n += 2;
|
|
76
|
+
const a = -n * (n + 1);
|
|
77
|
+
bRe += 4;
|
|
78
|
+
// d = 1 / (a*d + b)
|
|
79
|
+
let tRe = a * dRe + bRe;
|
|
80
|
+
let tIm = a * dIm + bIm;
|
|
81
|
+
den = tRe * tRe + tIm * tIm;
|
|
82
|
+
dRe = tRe / den;
|
|
83
|
+
dIm = -tIm / den;
|
|
84
|
+
// cc = b + a / cc
|
|
85
|
+
den = ccRe * ccRe + ccIm * ccIm;
|
|
86
|
+
ccRe = bRe + (a * ccRe) / den;
|
|
87
|
+
ccIm = bIm - (a * ccIm) / den;
|
|
88
|
+
// del = cc * d ; h *= del
|
|
89
|
+
const delRe = ccRe * dRe - ccIm * dIm;
|
|
90
|
+
const delIm = ccRe * dIm + ccIm * dRe;
|
|
91
|
+
tRe = hRe * delRe - hIm * delIm;
|
|
92
|
+
tIm = hRe * delIm + hIm * delRe;
|
|
93
|
+
hRe = tRe;
|
|
94
|
+
hIm = tIm;
|
|
95
|
+
if (Math.abs(delRe - 1) + Math.abs(delIm) < EPS)
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
// h *= (ax - i*ax)
|
|
99
|
+
const t2Re = ax * (hRe + hIm);
|
|
100
|
+
const t2Im = ax * (hIm - hRe);
|
|
101
|
+
hRe = t2Re;
|
|
102
|
+
hIm = t2Im;
|
|
103
|
+
// cs = (0.5 + 0.5i) * (1 - (cos(πx²/2) + i sin(πx²/2)) * h)
|
|
104
|
+
const cosv = Math.cos(0.5 * pix2);
|
|
105
|
+
const sinv = Math.sin(0.5 * pix2);
|
|
106
|
+
const mRe = 1 - (cosv * hRe - sinv * hIm);
|
|
107
|
+
const mIm = -(cosv * hIm + sinv * hRe);
|
|
108
|
+
c = 0.5 * (mRe - mIm);
|
|
109
|
+
s = 0.5 * (mRe + mIm);
|
|
110
|
+
}
|
|
111
|
+
if (t < 0) {
|
|
112
|
+
c = -c;
|
|
113
|
+
s = -s;
|
|
114
|
+
}
|
|
115
|
+
return { C: c, S: s };
|
|
116
|
+
}
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// Geometry evaluation
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
/** Evaluate a cubic polynomial record at a local offset ds. */
|
|
121
|
+
export function evalPoly3(rec, ds) {
|
|
122
|
+
return rec.a + ds * (rec.b + ds * (rec.c + ds * rec.d));
|
|
123
|
+
}
|
|
124
|
+
/** Derivative of a cubic polynomial record at a local offset ds. */
|
|
125
|
+
export function evalPoly3Derivative(rec, ds) {
|
|
126
|
+
return rec.b + ds * (2 * rec.c + ds * 3 * rec.d);
|
|
127
|
+
}
|
|
128
|
+
const CURVATURE_EPS = 1e-12;
|
|
129
|
+
function evalLine(geom, ds) {
|
|
130
|
+
return {
|
|
131
|
+
x: geom.x + Math.cos(geom.hdg) * ds,
|
|
132
|
+
y: geom.y + Math.sin(geom.hdg) * ds,
|
|
133
|
+
hdg: geom.hdg,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function evalArc(geom, curvature, ds) {
|
|
137
|
+
if (Math.abs(curvature) < CURVATURE_EPS)
|
|
138
|
+
return evalLine(geom, ds);
|
|
139
|
+
const hdg1 = geom.hdg + curvature * ds;
|
|
140
|
+
return {
|
|
141
|
+
x: geom.x + (Math.sin(hdg1) - Math.sin(geom.hdg)) / curvature,
|
|
142
|
+
y: geom.y - (Math.cos(hdg1) - Math.cos(geom.hdg)) / curvature,
|
|
143
|
+
hdg: hdg1,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Evaluate an Euler spiral (clothoid) with linearly varying curvature.
|
|
148
|
+
*
|
|
149
|
+
* The general spiral maps onto the unit clothoid κ(σ) = cDot·σ via the
|
|
150
|
+
* standard parameter transform (a textbook property of the Euler spiral —
|
|
151
|
+
* see e.g. Abramowitz & Stegun §7.3 on Fresnel integrals):
|
|
152
|
+
* the road geometry covers the parameter window σ ∈ [s0, s0 + ds] with
|
|
153
|
+
* s0 = curvStart / cDot. On that base clothoid,
|
|
154
|
+
* position(σ) = scale · (C(σ/scale), sign(cDot) · S(σ/scale)),
|
|
155
|
+
* tangent(σ) = cDot · σ² / 2,
|
|
156
|
+
* with scale = sqrt(π / |cDot|). The window is then rotated/translated so
|
|
157
|
+
* that its start coincides with the geometry's (x, y, hdg).
|
|
158
|
+
*/
|
|
159
|
+
function evalSpiral(geom, curvStart, curvEnd, ds) {
|
|
160
|
+
const cDot = (curvEnd - curvStart) / geom.length;
|
|
161
|
+
if (Math.abs(cDot) < CURVATURE_EPS) {
|
|
162
|
+
// Degenerate spiral: constant curvature (arc) or straight line.
|
|
163
|
+
return evalArc(geom, curvStart, ds);
|
|
164
|
+
}
|
|
165
|
+
const s0 = curvStart / cDot;
|
|
166
|
+
const scale = Math.sqrt(Math.PI / Math.abs(cDot));
|
|
167
|
+
const sgn = Math.sign(cDot);
|
|
168
|
+
const clothoid = (sigma) => {
|
|
169
|
+
const f = fresnel(sigma / scale);
|
|
170
|
+
return { x: scale * f.C, y: sgn * scale * f.S };
|
|
171
|
+
};
|
|
172
|
+
const p0 = clothoid(s0);
|
|
173
|
+
const p1 = clothoid(s0 + ds);
|
|
174
|
+
const theta0 = 0.5 * cDot * s0 * s0;
|
|
175
|
+
const rot = geom.hdg - theta0;
|
|
176
|
+
const cosR = Math.cos(rot);
|
|
177
|
+
const sinR = Math.sin(rot);
|
|
178
|
+
const dx = p1.x - p0.x;
|
|
179
|
+
const dy = p1.y - p0.y;
|
|
180
|
+
return {
|
|
181
|
+
x: geom.x + dx * cosR - dy * sinR,
|
|
182
|
+
y: geom.y + dx * sinR + dy * cosR,
|
|
183
|
+
hdg: geom.hdg + curvStart * ds + 0.5 * cDot * ds * ds,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
function evalParamPoly3(geom, ds) {
|
|
187
|
+
const p = geom.pRange === 'arcLength' ? ds : geom.length > 0 ? ds / geom.length : 0;
|
|
188
|
+
const u = geom.aU + p * (geom.bU + p * (geom.cU + p * geom.dU));
|
|
189
|
+
const v = geom.aV + p * (geom.bV + p * (geom.cV + p * geom.dV));
|
|
190
|
+
const du = geom.bU + p * (2 * geom.cU + p * 3 * geom.dU);
|
|
191
|
+
const dv = geom.bV + p * (2 * geom.cV + p * 3 * geom.dV);
|
|
192
|
+
const cosH = Math.cos(geom.hdg);
|
|
193
|
+
const sinH = Math.sin(geom.hdg);
|
|
194
|
+
return {
|
|
195
|
+
x: geom.x + u * cosH - v * sinH,
|
|
196
|
+
y: geom.y + u * sinH + v * cosH,
|
|
197
|
+
hdg: geom.hdg + Math.atan2(dv, du),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
function evalCubicPoly3(geom, ds) {
|
|
201
|
+
// Deprecated primitive (replaced by paramPoly3 in OpenDRIVE 1.6). The
|
|
202
|
+
// polynomial is v(u) in the local frame; we approximate the local abscissa
|
|
203
|
+
// u by the arc length ds, which is exact for flat curves and a small
|
|
204
|
+
// overestimate for strongly bent ones. Callers surface this as a warning.
|
|
205
|
+
const u = ds;
|
|
206
|
+
const v = evalPoly3(geom, u);
|
|
207
|
+
const dv = evalPoly3Derivative(geom, u);
|
|
208
|
+
const cosH = Math.cos(geom.hdg);
|
|
209
|
+
const sinH = Math.sin(geom.hdg);
|
|
210
|
+
return {
|
|
211
|
+
x: geom.x + u * cosH - v * sinH,
|
|
212
|
+
y: geom.y + u * sinH + v * cosH,
|
|
213
|
+
hdg: geom.hdg + Math.atan2(dv, 1),
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Evaluate a plan-view geometry at offset `ds` (m) from its start.
|
|
218
|
+
* Returns the inertial position and heading.
|
|
219
|
+
*/
|
|
220
|
+
export function evalGeometry(geom, ds) {
|
|
221
|
+
switch (geom.kind) {
|
|
222
|
+
case 'line':
|
|
223
|
+
return evalLine(geom, ds);
|
|
224
|
+
case 'arc':
|
|
225
|
+
return evalArc(geom, geom.curvature, ds);
|
|
226
|
+
case 'spiral':
|
|
227
|
+
return evalSpiral(geom, geom.curvStart, geom.curvEnd, ds);
|
|
228
|
+
case 'paramPoly3':
|
|
229
|
+
return evalParamPoly3(geom, ds);
|
|
230
|
+
case 'poly3':
|
|
231
|
+
return evalCubicPoly3(geom, ds);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const STATION_EPS = 1e-9;
|
|
235
|
+
const MIN_STEP = 1e-3;
|
|
236
|
+
const MAX_REFINE_DEPTH = 32;
|
|
237
|
+
/** Distance from point p to the chord segment a-b. */
|
|
238
|
+
function chordDeviation(a, b, p) {
|
|
239
|
+
const dx = b.x - a.x;
|
|
240
|
+
const dy = b.y - a.y;
|
|
241
|
+
const len2 = dx * dx + dy * dy;
|
|
242
|
+
if (len2 < 1e-18)
|
|
243
|
+
return Math.hypot(p.x - a.x, p.y - a.y);
|
|
244
|
+
let t = ((p.x - a.x) * dx + (p.y - a.y) * dy) / len2;
|
|
245
|
+
if (t < 0)
|
|
246
|
+
t = 0;
|
|
247
|
+
if (t > 1)
|
|
248
|
+
t = 1;
|
|
249
|
+
return Math.hypot(p.x - (a.x + t * dx), p.y - (a.y + t * dy));
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Adaptively sample a road's reference line.
|
|
253
|
+
*
|
|
254
|
+
* Stations always include s = 0, s = road.length, every plan-view geometry
|
|
255
|
+
* boundary, and the caller's `extraStations`. Between those, intervals are
|
|
256
|
+
* recursively bisected until the chord deviation at the interval midpoint is
|
|
257
|
+
* below `maxChordErrorMeters` and the step is at most `maxStepMeters`.
|
|
258
|
+
*/
|
|
259
|
+
export function sampleReferenceLine(road, options = {}) {
|
|
260
|
+
const tol = options.maxChordErrorMeters ?? 0.05;
|
|
261
|
+
const maxStep = options.maxStepMeters ?? 5;
|
|
262
|
+
const roadLength = road.length;
|
|
263
|
+
if (road.planView.length === 0 || roadLength <= 0)
|
|
264
|
+
return [];
|
|
265
|
+
// Base stations: geometry boundaries + caller stations + road ends.
|
|
266
|
+
const baseSet = [0, roadLength];
|
|
267
|
+
for (const g of road.planView) {
|
|
268
|
+
if (g.s > 0 && g.s < roadLength)
|
|
269
|
+
baseSet.push(g.s);
|
|
270
|
+
const end = g.s + g.length;
|
|
271
|
+
if (end > 0 && end < roadLength)
|
|
272
|
+
baseSet.push(end);
|
|
273
|
+
}
|
|
274
|
+
if (options.extraStations) {
|
|
275
|
+
for (const s of options.extraStations) {
|
|
276
|
+
if (s > 0 && s < roadLength)
|
|
277
|
+
baseSet.push(s);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
baseSet.sort((a, b) => a - b);
|
|
281
|
+
const base = [];
|
|
282
|
+
for (const s of baseSet) {
|
|
283
|
+
if (base.length === 0 || s - base[base.length - 1] > STATION_EPS)
|
|
284
|
+
base.push(s);
|
|
285
|
+
}
|
|
286
|
+
// Locate the geometry containing a station (last geometry with g.s <= s).
|
|
287
|
+
const geomAt = (s) => {
|
|
288
|
+
let found = road.planView[0];
|
|
289
|
+
for (const g of road.planView) {
|
|
290
|
+
if (g.s <= s + STATION_EPS)
|
|
291
|
+
found = g;
|
|
292
|
+
else
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
return found;
|
|
296
|
+
};
|
|
297
|
+
const evalAt = (s) => {
|
|
298
|
+
const g = geomAt(s);
|
|
299
|
+
return evalGeometry(g, Math.min(Math.max(s - g.s, 0), g.length));
|
|
300
|
+
};
|
|
301
|
+
const stations = [];
|
|
302
|
+
const refine = (sa, sb, pa, pb, depth) => {
|
|
303
|
+
const step = sb - sa;
|
|
304
|
+
if (step > MIN_STEP && depth < MAX_REFINE_DEPTH) {
|
|
305
|
+
const sm = (sa + sb) / 2;
|
|
306
|
+
const pm = evalAt(sm);
|
|
307
|
+
if (step > maxStep || chordDeviation(pa, pb, pm) > tol) {
|
|
308
|
+
refine(sa, sm, pa, pm, depth + 1);
|
|
309
|
+
refine(sm, sb, pm, pb, depth + 1);
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
stations.push(sa);
|
|
314
|
+
};
|
|
315
|
+
for (let i = 0; i < base.length - 1; i++) {
|
|
316
|
+
refine(base[i], base[i + 1], evalAt(base[i]), evalAt(base[i + 1]), 0);
|
|
317
|
+
}
|
|
318
|
+
stations.push(roadLength);
|
|
319
|
+
return stations.map(s => {
|
|
320
|
+
const pose = evalAt(s);
|
|
321
|
+
return { s, x: pose.x, y: pose.y, hdg: pose.hdg };
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=odrGeometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odrGeometry.js","sourceRoot":"","sources":["../../src/exporter/odrGeometry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { OdrGeometry } from './opendriveParser';
|
|
2
|
+
export interface FitPoint {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
}
|
|
6
|
+
export interface PlanViewFitOptions {
|
|
7
|
+
/** Maximum position deviation between samples and the fit (m). Default 0.05. */
|
|
8
|
+
maxPosErrorMeters?: number;
|
|
9
|
+
/** Maximum end-heading deviation per segment (rad). Default 0.5 degrees. */
|
|
10
|
+
maxHdgErrorRad?: number;
|
|
11
|
+
/** Moving-median window (odd) for heading de-noising. Default 3; 1 disables. */
|
|
12
|
+
headingMedianWindow?: number;
|
|
13
|
+
}
|
|
14
|
+
/** Station + pose on the fitted reference line for one input sample. */
|
|
15
|
+
export interface FittedSamplePose {
|
|
16
|
+
s: number;
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
hdg: number;
|
|
20
|
+
}
|
|
21
|
+
export interface PlanViewFit {
|
|
22
|
+
/** Fitted primitives with contiguous stations starting at s = 0. */
|
|
23
|
+
geometries: OdrGeometry[];
|
|
24
|
+
/** Fitted station and pose for every input point (duplicates share poses). */
|
|
25
|
+
samplePoses: FittedSamplePose[];
|
|
26
|
+
/** Total fitted arc length (m). */
|
|
27
|
+
length: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Fit a plan-view primitive sequence to a polyline of reference-line samples.
|
|
31
|
+
*
|
|
32
|
+
* The returned geometries are C1-continuous (each starts at the previous
|
|
33
|
+
* one's analytic end pose) except across degraded sharp-corner chords, and
|
|
34
|
+
* deviate from the input samples by at most the position tolerance.
|
|
35
|
+
*/
|
|
36
|
+
export declare function fitPlanView(points: readonly FitPoint[], options?: PlanViewFitOptions): PlanViewFit;
|
|
37
|
+
//# sourceMappingURL=odrGeometryFit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odrGeometryFit.d.ts","sourceRoot":"","sources":["../../src/exporter/odrGeometryFit.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAGpD,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,wEAAwE;AACxE,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,UAAU,EAAE,WAAW,EAAE,CAAA;IACzB,8EAA8E;IAC9E,WAAW,EAAE,gBAAgB,EAAE,CAAA;IAC/B,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAA;CACf;AAuDD;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,QAAQ,EAAE,EAC3B,OAAO,GAAE,kBAAuB,GAC/B,WAAW,CAsZb"}
|