クロソイド曲線とは
クロソイド曲線は道路や鉄道、ローラーコースター等で使われている曲線で、人体への負担が軽減し、乗り心地が向上させる効果がある。この曲線は、直線から円弧に移行する際に、急激な方向転換を避けるために使用されている。
クロソイド曲線は曲率を一定の割合で増加させて描かれる。
直線から円にいきなり進入すると急にハンドルを大きく切る必要が生じ、事故のリスクが高まる可能性がある。クロソイド曲線を挟むことでハンドル操作が徐々に行えるようになり、スムーズな移行が可能になる。事故削減効果が顕著で、多くの分野で積極的に使われるようになった。
公式と計算
クロソイドの公式
\(R⋅L=A^2\)
\(τ=\frac{L}{2R}\)
R:円の半径
L:クロソイド曲線長
A:クロソイドパラメータ
τ:接線角(タウと読む)
\(R⋅L=A^2\)
クロソイド曲線は曲率を一定の割合で増加させて描かれる曲線で、曲率半径Rと始点からの曲線長Lの積は一定となる。
曲率は\(\frac{1}{R}\)なので、cを比例定数とすると以下の式が成り立つ。
\(\frac{1}{R}=c\times L\)
曲率と距離が比例関係になっている。これを変形すると
\(R⋅L=\frac{1}{c}\)
となり、\(\frac{1}{c}\)を\(A^2\)に置き換えたものがクロソイドの基本式\(R⋅L=A^2\)になる。
Aはクロソイドパラメータと呼ばれ、曲率の増加度をあらわす。Aの値が大きいほど与えられたLに対して曲率半径Rが大きくなり、緩やかな曲線になる。
\(τ=\frac{L}{2R}\)
曲線長LがdLだけ微量変化したとすれば、x, y, τもdx, dy, dτだけ微量変化する。
\(\frac{dτ}{dL}=\frac{1}{R}\)・・・①
\(dx=dL·cosτ\)・・・②
\(dy=dL·sinτ\)・・・③
①を変形した\(dL=R·dτ\)に\(R=\frac{A^2}{L}\)を代入すると
\(dL = \frac{A^2}{L}⋅dτ\)・・・④
④を積分すると
\(LdL=A^2⋅dτ\)
\(\frac{1}{2}L^2=A^2τ\)
\(L^2=2A^2τ\)・・・⑤
これをτについて解くと
\(τ=\frac{L^2}{2A^2}\)
となり、基本式から\(A^2=RL\)を代入すると
\(τ=\frac{L^2}{2RL}\)
\(τ=\frac{L}{2R}\)・・・⑥
が得られる。
X, Yの導出
②、③にそれぞれ④を代入し、さらに⑤より\(L=A\sqrt{2τ}\)を代入して2つの微分方程式にする
\(dx = dLcosτ = \frac{A^{2}}{L}cosτdτ = \frac{A}{\sqrt{2τ}}cosτdτ\)
\(dy = dLsinτ = \frac{A^{2}}{L}sinτdτ = \frac{A}{\sqrt{2τ}}sinτdτ\)
\(\frac{A}{\sqrt{2}}\)を前に出して積分する
\(x = \frac{A}{\sqrt{2}}\int_{0}^{τ} \frac{cosτ}{\sqrt{τ}}dτ\)・・・⑦
\(y = \frac{A}{\sqrt{2}}\int_{0}^{τ} \frac{sinτ}{\sqrt{τ}}dτ\)・・・⑧
sinτ、cosτをマクローリン展開する
\(cosτ=1-\frac{τ^2}{2!}+\frac{τ^4}{4!}-\frac{τ^6}{6!}+···\)
\(sinτ=τ-\frac{τ^3}{3!}+\frac{τ^5}{5!}-\frac{τ^7}{7!}+···\)
⑦の右辺から\(\frac{A}{\sqrt{2}}\)を除いたものを整理していく
\(\int_{0}^{τ} \frac{cosτ}{\sqrt{τ}}dτ = \int_{0}^{τ} \frac{1}{\sqrt{τ}}\left( 1-\frac{τ^2}{2!}+\frac{τ^4}{4!}-\frac{τ^6}{6!}+··· \right)dτ\)
\(=\int_{0}^{τ}\left( τ^{-\frac{1}{2}} – \frac{1}{2!}τ^{2-\frac{1}{2}} + \frac{1}{4!}τ^{4-\frac{1}{2}} – \frac{1}{6!}τ^{6-\frac{1}{2}} +··· \right)dτ\)
\(=\int_{0}^{τ}\left( τ^{-\frac{1}{2}} – \frac{1}{2!}τ^{\frac{3}{2}} + \frac{1}{4!}τ^{\frac{7}{2}} – \frac{1}{6!}τ^{\frac{11}{2}} +··· \right)dτ\)
\(=2τ^{\frac{1}{2}} – \frac{1}{2!}\times\frac{2}{5}τ^{\frac{5}{2}} + \frac{1}{4!}\times\frac{2}{9}τ^{\frac{9}{2}} – \frac{1}{6!}\times\frac{2}{13}τ^{\frac{13}{2}} +···\)
\(=2τ^{\frac{1}{2}}\left( 1-\frac{1}{2!\times5}τ^2+\frac{1}{4!\times9}τ^4+\frac{1}{6!\times13}τ^6+…\right)\)
\(=2\sqrt{τ}\left( 1-\frac{1}{2!\times5}τ^2+\frac{1}{4!\times9}τ^4+\frac{1}{6!\times13}τ^6+…\right)\)
⑧の右辺から\(\frac{A}{\sqrt{2}}\)を除いたものを整理していく
\(\int_{0}^{τ} \frac{sinτ}{\sqrt{τ}}dτ = \int_{0}^{τ} \frac{1}{\sqrt{τ}}\left( τ-\frac{τ^3}{3!}+\frac{τ^5}{5!}-\frac{τ^7}{7!}+··· \right)dτ\)
\(=\int_{0}^{τ} \left( τ-\frac{τ^{\frac{5}{2}}}{3!}+\frac{τ^{\frac{9}{2}}}{5!}-\frac{τ^{\frac{13}{2}}}{7!}+··· \right)dτ\)
\(=\frac{2}{3}τ^{\frac{3}{2}}-\frac{2}{3!\times7}τ^{\frac{7}{2}}+\frac{2}{5!\times11}τ^{\frac{11}{2}}-\frac{2}{7!\times15}τ^{\frac{15}{2}}+···\)
\(=\frac{2}{3}τ^{\frac{3}{2}}\left( 1-\frac{τ^2}{\frac{3!\times7}{3}}+\frac{τ^4}{\frac{5!\times11}{3}}+\frac{τ^6}{\frac{7!\times15}{3}}+···\right)\)
\(=\frac{2}{3}τ\sqrt{τ}\left( 1-\frac{τ^2}{\frac{3!\times7}{3}}+\frac{τ^4}{\frac{5!\times11}{3}}+\frac{τ^6}{\frac{7!\times15}{3}}+…\right)\)
まとめると以下の結果になる。(級数の···以下の値は小さいので無視してよい)
\(x=\frac{A}{\sqrt{2}}\times2\sqrt{τ}\left( 1-\frac{1}{2!\times5}τ^2+\frac{1}{4!\times9}τ^4+\frac{1}{6!\times13}τ^6+···\right)\)
\(y=\frac{A}{\sqrt{2}}\times\frac{2}{3}τ\sqrt{τ}\left( 1-\frac{τ^2}{\frac{3!\times7}{3}}+\frac{τ^4}{\frac{5!\times11}{3}}+\frac{τ^6}{\frac{7!\times15}{3}}+···\right)\)
これでAとτの値を使って曲線のX,Y座標が計算できるようになった。
2つの要素を決めると残りが決まる
公式から、RとLが決まれば残りのAとτが決まり、AとLが決まればRとτが決まる。先に2つを決めると残りが自動的に決まる、という関係性。
RとLから
A(パラメータ)は\(A=\sqrt{R⋅L}\)で求まる。
τ (接線角)は\(τ=\frac{L}{2R}\)で求まる。
AとLから
R(半径)は\(R=\frac{A^2}{L}\)から求まる。
τ (接線角)は\(τ=\frac{L}{2R}\)で求まる。
AとRから
L(曲線長)は\(L=\frac{A^2}{R}\)から求まり
τ (接線角)は\(τ=\frac{L}{2R}\)で求まる。
τとRから
A(パラメータ)は\(A=R\sqrt{2τ}\)で求まる。
L(曲線長)は\(L=\frac{A^2}{R}\)で求まる。
τとLから
R(半径)は\(R=\frac{L}{2τ}\)から求まる。
A(クロソイドパラメータ)は\(A=\sqrt{R⋅L}\)で求まる。
τとAから
R(半径)は\(R=\frac{A}{\sqrt{2τ}}\)から求まる。
L(曲線長)は\(L=\frac{A^2}{R}\)で求まる。
曲線の描画
半径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 - (1 / 10.0 * pow(tau, 2) + (1 / 216.0 * pow(tau, 4)) - (1 / 9360.0 * pow(tau, 6))));
}
// クロソイド曲線の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);
}