クロソイド曲線・円曲線・クロソイド曲線の組み合わせを基本型といいます。
基本型には、両クロソイド曲線のパラメータが同じである対称型と、パラメータ
が異なる非対称型があります。非対称型の計算は対称型にも適用できるので、
ここでは、非対称型を考えます。
図(設置の)
図(計算のための)
上図において、
OA = R + F1
OB = R + F2
AO 線上に、A から F1-F2 の点を B' とし、B' から第1の直線に平行線を引き
第2の直線との交点を C とする。
OB' = R + F1 - ( F1 - F2 )
= R + F2
= OB
したがって、
△CB'O ≡ △CBO
∴ ∠COB' = ∠COB = I/2
また、
Z1tan I = F1 - F2
∴ Z1 = ( F1 - F2 )cot I
Z2sin I = F1 - F2
∴ Z2 = ( F1 - F2 )cosec I
以上により、
W = ( R + F2 )tan I/2
TC1 = Xm1 + W - Z1
TC2 = Xm2 + W + Z2
それでは、この式を使ってクロソイド曲線の座標を求めるプログラムを考えて
みましょう。
===================================================
プログラム例題30
クロソイド曲線上の任意点までの距離 L、半径 R、そしてパラメーター A
より、その点の座標を求めよ。
=========================================================
考え方
まず、τを計算します。
次に、X座標を求めますが、この式の( )内の第 k 項を一般式で表すと、次
のようになります。
この式の値を、求めたい座標の精度(例えば小数第3位)になるまで順次計算
します。
(1) 各項の符号
第1項を 1 にして、第2項以下に -1 を掛けます。
(2)1/ {2(k-1)}! の計算
分母は、
0! = 1, 2!=2×1,4!=4×3×2×1, 6!=6×5×4×3×2×1,・・・
ですから、
第1項・・・ 1
第2項・・・ 第1項×2
第3項・・・ 第2項×3×4
第4項・・・ 第3項×5×6
のように、第k項は第k−1項に、(2k-2)×(2k-3) を掛けます。
(3)1/ (4k-3) の計算
これはそのままです。
(4)τ2(k-1) の計算
第1項を1にして、第k項は第k−1項に、τ2 を掛けます。
(1)から(4)をまとめます。
第k−1項の(1)(2)(4)の積の部分を Pk−1、第k−1項を Qk−1 とします。
第k項をもとめるには、
(@) Pk = Pk−1×(-1)/((2k-2)×(2k-3))×τ2
(A) Qk = Pk/(4k-3)
(@)(A)を繰り返して( )内の各項を合計します。
このようにして、( )内を第k−1項まで計算したときと、第k項まで計算したと
きのX座標をそれぞれ Xk-1、Xk とすると、|Xk−Xk-1|<0.001 のとき計
算を終了させます。
Y座標も同様に考えます。Y座標の計算における Pk と Qk は次のようになり
ます。
(B) Pk = Pk−1×(-1)/((2k-1)×(2k-2))×τ2
(C) Qk = Pk/(4k-1)
また、半径 R(右カーブ:正、左カーブ:負)の符号によってY座標の符号は変
化することも考慮します。
プログラム
<HTML>
<HEAD>
<TITLE>例題30(クロソイド曲線)</TITLE>
<SCRIPT LANGUAGE="VBScript">
<!--
' 入力データ
Dim Li 'クロソイド曲線長
Dim Ri '半径
Dim Pa 'パラメーター
Dim Er '制限値
'
Li = 50
Ri = 200
Pa = 100
Er = 0.001
'
' 出力データ
Dim Xi,Yi 'クロソイド座標
'
Function
Cloxy(l,r,a,x,y)
Dim
s '()内の各項の合計
Dim
pk 'X: (-1)/((2k-2)×(2k-3))×τ^2
'Y: (-1)/((2k-1)×(2k-2))×τ^2
Dim
qk 'X: pk/(4k-3)
'Y: pk/(4k-1)
Dim
tau 'τ
Dim
k '第k項のk
Dim
xk '第k項までの座標値
Dim
xo '第k-1項までの座標値
Dim
sg 'rの符号
'
If
r>=0 Then sg = 1 Else sg =-1
' X座標
s
= 1
pk
= 1
k
= 1
tau
= l/(2*Abs(r))
xk
= a*Sqr(2*tau)
xo
= 0
x
= xk
Do
While Abs(x-xo)>=Er
xo
= x
k
= k + 1
pk = pk*(-1)/((2*k-2)*(2*k-3))*tau*tau
qk = pk/(4*k-3)
s = s + qk
x = xk*s
Loop
x
= Rund(x,3)
' Y座標
s
= 1/3
pk
= 1
k
= 1
xk
= a*tau*Sqr(2*tau)
xo
= 0
y
= xk*s
Do
While Abs(y-xo)>=Er
xo
= y
k
= k + 1
pk = pk*(-1)/((2*k-1)*(2*k-2))*tau*tau
qk = pk/(4*k-1)
s = s + qk
y = xk*s
Loop
y
= sg*Rund(y,3)
End Function
'
'
' 四捨五入
'
Function
Rund(x,y)
Dim
sg
If
x>=0 Then sg = 1 Else sg =-1
Rund
= sg*Int(abs(x)*10^y + 0.5)/10^y
End Function
'
'計算ボタンをクリック
'
Sub CAL_OnClick
'
Dim
ret
ret
= Cloxy(Li,Ri,Pa,Xi,Yi)
Cloprt
'
End Sub
'
'
'
Sub Cloprt
'
'
'=================== クロソイド曲線計算結果出力
=============================
'
document.write
"<CENTER>","*** クロソイド曲線 ***","</CENTER><BR>"
'
document.write"<CENTER><TABLE
BORDER='0'>"
document.write"<TR
ALIGN='CENTER'>"
document.write"<TD
ALIGN='right'>"," L =
","</TD>"
document.write"<TD
ALIGN='right'>",Li,"</TD></TR>"
document.write"<TD
ALIGN='right'>"," R =
","</TD>"
document.write"<TD
ALIGN='right'>",Ri,"</TD></TR>"
document.write"<TD
ALIGN='right'>"," A =
","</TD>"
document.write"<TD
ALIGN='right'>",Pa,"</TD></TR>"
document.write"<TD
ALIGN='right'>","</TD></TR>"
'
document.write"<TD
ALIGN='right'>"," X =
","</TD>"
document.write"<TD
ALIGN='right'>",Xi,"</TD></TR>"
document.write"<TD
ALIGN='right'>"," Y =
","</TD>"
document.write"<TD
ALIGN='right'>",Yi,"</TD></TR>"
document.write"</TABLE>"
End Sub
'
-->
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="Form1">
*** クロソイド曲線 ***<BR>
<BR>
<INPUT TYPE="button" NAME="CAL"
VALUE="計 算">
<HR>
</FORM>
</BODY>
</HTML>
入力データと実行結果
入力データ
クロソイド曲線長
L =
50
半径
R =
200
パラメータ
A =
100
※データ入力は、代入文で直接代入しています。
※ボタンをクリックして実行します。
計算結果
*** クロソイド曲線 ***
L = | 50 |
R = | 200 |
A = | 100 |
X = | 49.922 |
Y = | 2.081 |
プログラムの説明
このような級数計算を行うには、なるべく誤差を少なくしたり、計算速度を速く
する方法等がプログラミング技法として考えられますが、ここではオーソドック
スに計算式をそのままプログラミングすることにします。
Function
Cloxy(l,r,a,x,y)
Dim
s '()内の各項の合計
Dim
pk 'X: (-1)/((2k-2)×(2k-3))×τ^2
'Y: (-1)/((2k-1)×(2k-2))×τ^2
Dim
qk 'X: pk/(4k-3)
'Y: pk/(4k-1)
Dim
tau 'τ
Dim
k '第k項のk
Dim
xk '第k項までの座標値
Dim
xo '第k-1項までの座標値
Dim
sg 'rの符号
'
If
r>=0 Then sg = 1 Else sg =-1 @
' X座標
s
= 1
pk
= 1
k
= 1
tau
= l/(2*Abs(r))
xk
= a*Sqr(2*tau)
xo
= 0
x
= xk
Do
While Abs(x-xo)>=Er A
xo
= x
k
= k + 1
pk
= pk*(-1)/((2*k-2)*(2*k-3))*tau*tau
qk
= pk/(4*k-3)
s
= s + qk
x
= xk*s B
Loop
x
= Rund(x,3)
' Y座標
・
・
・
End Function
@ 半径 R の符号を調べ、変数 sg に代入します。
A 第k-1項まで計算したX座標と、第k項のX座標の差が制限値 Er より
小さくなるまで計算を繰り返します。
B 第k項までのX座標です。変数 s は、級数の( )内の第k項までの和で
す。
Y座標も同様です。
りょうかんのアドバイス
級数というのは、数列の各項を和・差の符号で結んだものです。これをプログ
ラミングするには、合計、階乗、そしてべき級数を求める方法を知らなければ
なりません。
合計を S、各データを Xi とすると、
S = 0 として
S = S + Xi をデータの個数繰り返します。
N! ( N の階乗 )を NK、カウントする変数を i とすると、
NK = 1、i = 1 として
NK = NK× i、 i = i + 1 を N 回繰り返します。
Ak を求めるには、べき乗の関数を使ってもいいですが、
Ak-1 まで求められている場合、
Ak = Ak-1 ×A で計算します。
次回は、『基本型クロソイド曲線の設置』の予定です。(11月15日ごろ)
この講座に対する、ご意見やご要望はメールでお願いします。
『VBScriptによる測量計算プログラミング入門』
講師 りょうかん