クロソイド曲線
公開 更新
クロソイド曲線とは
クロソイド曲線は道路や鉄道、ローラーコースター等で使われている曲線で、人体への負担を軽減し、乗り心地を向上させる効果がある。この曲線は、直線から円弧に移行する際に、急激な方向転換を避けるために使用されている。
クロソイド曲線は曲率を一定の割合で増加させて描かれる。
直線から円にいきなり進入すると急にハンドルを大きく切る必要が生じ、事故のリスクが高まる可能性がある。クロソイド曲線を挟むことでハンドル操作が徐々に行えるようになり、スムーズな移行が可能になる。事故削減効果が顕著で、多くの分野で積極的に使われるようになった。
公式と計算
クロソイドの公式
R⋅L=A2
τ=2RL
R:円の半径
L:クロソイド曲線長
A:クロソイドパラメータ
τ:接線角(タウと読む)
2つの要素を決めると残りが決まる
公式R⋅L=A2とτ=2RLから、RとLが決まれば残りのAとτが決まり、AとLが決まればRとτが決まる。先に2つを決めると残りが自動的に決まる、という関係性になっている。
RとLから
A(パラメータ)はA=R⋅Lで求まる。
τ (接線角)はτ=2RLで求まる。
例:R=10m、L=12mのときAは10.9545、τは34.3775°
AとLから
R(半径)はR=LA2から求まる。
τ (接線角)はτ=2RLで求まる。
AとRから
L(曲線長)はL=RA2から求まり
τ (接線角)はτ=2RLで求まる。
τとRから
A(パラメータ)はA=R2τで求まる。
L(曲線長)はL=RA2で求まる。
τとLから
R(半径)はR=2τLから求まる。
A(クロソイドパラメータ)はA=R⋅Lで求まる。
τとAから
R(半径)はR=2τAから求まる。
L(曲線長)はL=RA2で求まる。
R⋅L=A2
クロソイド曲線は曲率を一定の割合で増加させて描かれる曲線で、曲率半径Rと始点からの曲線長Lの積は一定となる。
曲率はR1なので、cを比例定数とすると以下の式が成り立つ。
R1=c×L
曲率と距離が比例関係になっている。これを変形すると
R⋅L=c1
となり、c1をA2に置き換えたものがクロソイドの基本式R⋅L=A2になる。
Aはクロソイドパラメータと呼ばれ、曲率の増加度をあらわす。Aの値が大きいほど与えられたLに対して曲率半径Rが大きくなり、緩やかな曲線になる。
τ=2RL
曲線長LがdLだけ微量変化したとすれば、x, y, τもdx, dy, dτだけ微量変化する。
dLdτ=R1・・・①
dx=dL⋅cosτ・・・②
dy=dL⋅sinτ・・・③
①を変形したdL=R⋅dτにR=LA2を代入すると
dL=LA2⋅dτ・・・④
④を積分すると
LdL=A2⋅dτ
21L2=A2τ
L2=2A2τ・・・⑤
これをτについて解くと
τ=2A2L2
となり、基本式からA2=RLを代入すると
τ=2RLL2
τ=2RL・・・⑥
が得られる。
X, Yの導出
②、③にそれぞれ④を代入し、さらに⑤よりL=A2τを代入して2つの微分方程式にする
dx=dLcosτ=LA2cosτdτ=2τAcosτdτ
dy=dLsinτ=LA2sinτdτ=2τAsinτdτ
2Aを前に出して積分する
x=2A∫0ττcosτdτ・・・⑦
y=2A∫0ττsinτdτ・・・⑧
sinτ、cosτをマクローリン展開する
cosτ=1−2!τ2+4!τ4−6!τ6+⋅⋅⋅
sinτ=τ−3!τ3+5!τ5−7!τ7+⋅⋅⋅
⑦の右辺から2Aを除いたものを整理していく
∫0ττcosτdτ=∫0ττ1(1−2!τ2+4!τ4−6!τ6+⋅⋅⋅)dτ
=∫0τ(τ−21−2!1τ2−21+4!1τ4−21−6!1τ6−21+⋅⋅⋅)dτ
=∫0τ(τ−21−2!1τ23+4!1τ27−6!1τ211+⋅⋅⋅)dτ
=2τ21−2!1×52τ25+4!1×92τ29−6!1×132τ213+⋅⋅⋅
=2τ21(1−2!×51τ2+4!×91τ4−6!×131τ6+…)
=2τ(1−2!×51τ2+4!×91τ4−6!×131τ6+…)
⑧の右辺から2Aを除いたものを整理していく
∫0ττsinτdτ=∫0ττ1(τ−3!τ3+5!τ5−7!τ7+⋅⋅⋅)dτ
=∫0τ(τ−3!τ25+5!τ29−7!τ213+⋅⋅⋅)dτ
=32τ23−3!×72τ27+5!×112τ211−7!×152τ215+⋅⋅⋅
=32τ23(1−33!×7τ2+35!×11τ4−37!×15τ6+⋅⋅⋅)
=32ττ(1−33!×7τ2+35!×11τ4−37!×15τ6+…)
まとめると以下の結果になる。(級数の···以下の値は小さいので無視してよい)
x=2A×2τ(1−2!×51τ2+4!×91τ4−6!×131τ6+⋅⋅⋅)
y=2A×32ττ(1−33!×7τ2+35!×11τ4−37!×15τ6+⋅⋅⋅)
これでAとτの値を使って曲線のX,Y座標が計算できるようになった。
曲線の描画
半径Rが10、τが45°のクロソイド曲線を描画する。
//
// クロソイド曲線の描画
// Run Over: Detail
//
// クロソイド曲線のX成分を求める関数(tauとAから)
function float clothoid_x(float tau; float A)
{
return A / sqrt(2) * 2 * sqrt(tau) * (1 - (pow(tau, 2) / 10.0) + (pow(tau, 4) / 216.0) - (pow(tau, 6) / 9360.0));
}
// クロソイド曲線のY成分を求める関数
function float clothoid_y(float tau; float A)
{
return A / sqrt(2) * (2/3.0) * sqrt(tau) * tau * (1 - (pow(tau, 2) / 14.0) + (pow(tau, 4) / 440.0) - (pow(tau, 6) / 25200.0) );
}
float R = 10;
float tau = radians(45);
float A = R * sqrt(2*tau);
// 原点にクロソイド曲線を描画する
int prim = addprim(0, "polyline");
int num = 100; // サンプルポイント数
for(int i = 0; i < num; i++)
{
float t = tau / float(num-1) * i;
float x = clothoid_x(t, A);
float y = clothoid_y(t, A);
vector pos = set(x, y, 0);
int pt = addpoint(0, pos);
addvertex(0, prim, pt);
}
三角関数微分曲線積分