Math 回旋线的参数化函数
我正在为基于格式的道路网络渲染器编码 此格式的道路曲线有四种类型:Math 回旋线的参数化函数,math,3d,geometry,computational-geometry,Math,3d,Geometry,Computational Geometry,我正在为基于格式的道路网络渲染器编码 此格式的道路曲线有四种类型: 部分 圆弧 保利线 克洛托弧 最后一个我有问题 与Euler螺旋和Cornu螺旋相同。在ROADO中,圆弧由三个参数给出: 开始曲率 端部曲率 长度 对于圆弧三角剖分,我需要一个类似foo(t)的函数,它返回t=0..length的(x,y)坐标。我为圆弧创建了类似的方法,没有问题,但我不能为clotho圆弧创建类似的方法 部分问题在于,我不完全理解如何在标准回旋线公式中应用开始曲率和结束曲率参数 例如,示例RoadXM
- 部分
- 圆弧
- 保利线
- 克洛托弧
- 开始曲率
- 端部曲率
- 长度
- 开始曲率=0
- 端部曲率=-0.0165407
- 长度=45.185
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)分,这是非常直接的
我的错在哪里?我做错了什么?看报纸。通常,回旋面由菲涅耳积分定义。结果是回旋线
C(t)
具有弧长t
。所以一开始,一般曲线的公式是用弧长表示的。一条特定的曲线只是普通螺旋的一部分,从起点曲率到终点曲率。对于一般情况,您必须进行旋转和平移。让我们看看。您的数据是:
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
根据,
(注意:我在这里称a
为WP文章所称a
的倒数)。那么
其中C(t)
和S(t)
是
所以这就是缩放的方式。不仅是t=s
,而且t=s/a
=sqrt(θ)
。这里,对于终点,t_c=sqrt(k_c s_c/2)=sqrt(0.0165407*45.185/2)=0.6113066
现在,{73.915445sqrt[pi/2]湿壁画[0.6113066/Sqrt[pi/2]],73.915445sqrt[pi/2]湿壁画[0.6113066/Sqrt[pi/2]}=
{44.5581,5.57259}
。(显然,Mathematica使用a。)
用你的函数测试它,
=a*(s/a)
=45.185
=5.628481
/3
<6,你没有错误
所以你看,仅仅使用菲涅耳积分的泰勒级数表示的第一项是不够的-到目前为止。您必须使用更多,并且仅在达到所需精度时停止(即,当最后计算的项小于预设的精度值时)
请注意,如果您仅为一次性缩放回旋线计算实现常规菲涅耳积分函数,当您将结果乘以a
(对于公路和铁路,通常为102…103)时,您将失去额外的精度 谢谢你的链接,brainjam。但我的主要问题是实现RoadXML-clotho参数。我将示例添加到我的帖子“旋转和平移”。。。和缩放。你最好计算它,这样缩放就不会破坏所需的精度。不幸的是,链接不再工作。可能是这个:顺便说一句,你知道k=1/r
,对吗?在45.2米范围内达到60.6米的曲率半径远非笔直威尔·奈斯,是的,我知道,曲率=1/半径。我在问题中加入了我的方程式。
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 !! )
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 )