4

RoadXML形式に基づく道路ネットワーク用のレンダラーをコーディングしています。

この形式の道路曲線には、次の 4 つのタイプがあります。

  • セグメント、
  • 円弧、
  • ポリライン、
  • クロスアーク。

そして、私は最後のものに問題があります。

クロソイドは、オイラー螺旋やコルヌ螺旋と同じです。RoadXML では、クロス アークは次の 3 つのパラメータで指定されます。

  • 開始曲率、
  • 端の曲率、
  • 長さ。

円弧三角形分割には、t = 0..length の (x, y) 座標を返す foo(t) のような関数が必要です。サークル アークの場合は問題なく同様の方法を作成しましたが、クロス アークの場合は作成できません。

問題の一部は、標準のクロソイド式で開始曲率パラメーターと終了曲率パラメーターを適用する方法を完全に理解していないことです。

たとえば、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

どれどれ。あなたのデータは次のとおりです。

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

ご覧のとおり、フレネル積分のテイラー級数表現の最初の項だけを使用するだけでは十分ではありません。より多くを使用する必要があり、必要な精度に達したとき(つまり、最後に計算された項が事前に設定された精度値の大きさよりも小さいとき)にのみ停止します。

1回限りのスケーリングされたクロソイド計算に一般的なフレネル積分関数を実装するだけの場合、結果に(10 2 ... 10 3aのオーダー)を掛けると、精度が低下することに注意してください。通常、道路や鉄道の場合)。

于 2012-10-06T21:21:37.533 に答える
2

Ryan Seng と Molly Severdia による論文 The Closoid を参照してください。一般に、クロソイドはフレネル積分によって定義されます。クロソイドC(t)には arclength があることがわかりtます。したがって、すぐに、一般的な曲線の式は円弧長で表されます。特定の曲線は、始点の曲率から終点の曲率まで、一般的ならせんのサブセクションにすぎません。一般的なケースでは、回転と平行移動を行う必要があります。

于 2012-09-28T04:08:38.600 に答える