4

我正在编写基于RoadXML格式的道路网络渲染器。

这种格式的道路曲线有四种类型:

  • 分割,
  • 圆弧,
  • 折线,
  • 布道弧。

我对最后一个有问题。

Clothoid与 Euler 螺旋和 Cornu 螺旋相同。在 RoadXML 中,布料弧由三个参数给出:

  • 开始曲率,
  • 末端曲率,
  • 长度。

对于弧三角测量,我需要一个像 foo(t) 这样的函数,它返回 t = 0..length 的 (x, y) 坐标。我为圆弧创建了类似的方法,没有问题,但我不能为圆弧做。

部分问题是我不完全了解如何在标准回旋曲线公式中应用开始和结束曲率参数。

例如,示例 RoadXML 道路。 RoadXML 示例 http://img560.imageshack.us/img560/8172/bigroandabout.png

这是红色椭圆中的布料曲线项目。它的参数:

  • 开始曲率 = 0,
  • 端曲率 = -0.0165407,
  • 长度 = 45.185。

我不知道如何实现这些参数,因为从 0 到 -0.0165 的回旋曲率非常直。

如果你给我这个函数的代码(C++、C#、Java、Python 或伪代码)或者只是一个我可以编码的公式,我会很高兴。

这是我的方程式:

x(t) ≈ t,
y(t) ≈ (t^3) / 6,
where length = t = s = curvature.

x(-0.0165) = -0.0165,
y(-0.0165) = -7.48688E-07.

Clotho length = 0.0165,
Source length = 45.185.

缩放坐标:

x'(l) = x / clotho_length * source_length = 45.185,
y'(l) = y / clotho_length * source_length = 5.58149E-07 ≈ 0.

x'(0) = 0,
y'(0) = 0.

因此我得到 (0, 0)...(45, 0) 点,这是非常直的。

我的错误在哪里?我究竟做错了什么?

4

2 回答 2

2

请参阅 Ryan Seng 和 Molly Severdia 的论文The Clothoid。通常,回旋曲线由菲涅耳积分定义。事实证明,回旋曲线C(t)具有 arclength t。因此,一般曲线的公式立即用弧长表示。一条特定的曲线只是一般螺旋线的一个子部分,从起始曲率到结束曲率。对于一般情况,您必须进行旋转和平移。

于 2012-09-28T04:08:38.600 回答
2

让我们来看看。您的数据是:

start curvature = 0,                straight line, R=INF
end curvature = -0.0165407,         circular arc, R_c = 1/k_c = 60.4569335
length = 45.185.                    distance along clothoid, s_c = 45.185

根据维基百科的文章

R s = const = R_c s_c                   ( s ~ k = 1/R by definition of clothoid )
d(s) = R d(theta)
d(theta) = k d(s)
d(theta) / d(s) = 1 / R = k = s / R_c s_c  

theta = s^2 / 2 R_c s_c = (s/a)^2 = s / 2 R = k s / 2 
                               where ___________________
                                     a = sqrt(2 R_c s_c)       (... = 73.915445 )
                                     ~~~~~~~~~~~~~~~~~~~
    and so  theta_c = k_c s_c / 2      (... = 0.37369576475 = 21.411190 degrees )
                                                     ( not so flat after all !! )

(注意:我a在这里称其为 WP 文章所称的倒数a)。然后,

d(x) = d(s) cos(theta)
d(y) = d(s) sin(theta)

x = INT[s=0..s] cos(theta) d(s) 
  = INT[s=0..s] cos((s/a)^2) a d(s/a) 
  = a INT[u=0..(s/a)] cos(u^2) d(u)   = a C( s/a )

y = a INT[u=0..(s/a)] sin(u^2) d(u)   = a S( s/a )

其中C(t)S(t)菲涅耳积分

就是您进行缩放的方式。不只是t = s,而是。在这里,对于终点,。t = s/a = sqrt(theta)t_c = sqrt( k_c s_c / 2) = sqrt( 0.0165407 * 45.185 / 2) = 0.6113066

现在,WolframAlpha 说{73.915445 Sqrt[pi/2] FresnelC[0.6113066/Sqrt[pi/2]], 73.915445 Sqrt[pi/2] FresnelS[0.6113066/Sqrt[pi/2]]} = {44.5581, 5.57259}. (显然 Mathematica 使用了一个用附加因子缩放的定义Sqrt[pi/2]。)

用你的函数测试它,,(原文如此!不是,你有一个错误)。x ~= t --> a*(s/a) = 45.185y ~= t^3/3 --> a*(s/a)^3/3 = 73.915445 * 0.6113066^3 / 3 = 5.628481/3/6

所以你看,仅仅使用泰勒级数表示菲涅耳积分的第一项是不够的——到目前为止。您必须使用更多,并且仅在达到所需精度时才停止(即,当最后计算的项小于您预设的精度值时)。

请注意,如果您只为一次性缩放回旋曲线计算实现通用菲涅耳积分函数,那么当您将结果乘以a(大约为 10 2 ... 10 3通常用于公路和铁路)。

于 2012-10-06T21:21:37.533 回答