14 円曲線          [もくじへ] [トップページへ] [前ページへ]

道路の中心線は折れ線で構成されます。折れ線と折れ線を接合するには、車

両の進行を円滑にするために円曲線を設置します。

ここでは、円曲線の設置、中間点計算、巾杭計算までを考えます。

14.1 円曲線の設置

===================================================

プログラム例題27

BP、IP、EP の座標と円の半径Rを与えて、円曲線を設置せよ。

=========================================================

考え方

         

         BP:起点
         EP:終点
         IP:交点
         BC:曲線始点
         EC:曲線終点
         SP:曲線中点
         M :円の中心点
         R :円の半径
         IA:交角
         L1:BP〜IPまでの距離
         L2:IP〜EPまでの距離
         SL:外線長
         TL:接線長
         CL:曲線長
         α1:BPからIPへの方向角
         α2:IPからEPへの方向角

計算の順序と計算式を示します。

(1)α1、α2、L1、L2

   BP と IP の座標より、距離と方向角の計算でα1と L1を求める。

   IP と EP の座標より、距離と方向角の計算でα2と L2を求める。

(2)IA

   IA = α2 1 (負の場合は360°加える)

(3)TL

   TL = Rtan(IA/2)

(4)BC の座標

   XBC = XBP + (L1 - TL)cosα1

   YBC = YBP + (L1 - TL)sinα1

(5)EC の座標

   XEC = XIP + TLcosα2

   YEC = YIP + TLsinα2

(6)M の座標

   XM = XBC + Rcos(α1 + 90°)

   YM = YBC + Rsin(α1 + 90°)

(7)SL

   SL = Rsec(IA/2) - R

(8)SPの座標

   XSP = XIP + SLcos(α1 + 90°+ IA/2)

   YSP = YIP + SLsin(α1 + 90°+ IA/2)

(9)CL

   CL = R・IA

 

 

プログラム

 

<HTML>
<HEAD>
   <TITLE>例題27(円曲線の設置)</TITLE>

<SCRIPT LANGUAGE="VBScript">
<!--
' 入力データ
        Dim XBP,YBP          'BPの座標
        Dim XIP,YIP          'IPの座標
        Dim XEP,YEP          'EPの座標
        Dim RR               'R
'
        XBP = -51274.2779
        YBP = -31305.5806
        XIP = -51813.3467
        YIP = -31423.3201
        XEP = -52144.8230
        YEP = -31551.5362
        RR = 2000
'
' 出力データ
        Dim XBC,YBC          'BCの座標
        Dim XEC,YEC          'ECの座標
        Dim XSP,YSP          'SPの座標
        Dim XM,YM            'Mの座標
        Dim IA               'IA
        Dim CL               'CL
        Dim AL1,AL2          'α1,α2
        Dim L1,L2            'L1,L2
        Dim TL               'TL
        Dim SL               'SL
'
'
'
'
        Dim PI
        PI = 3.141592653589793
'
'
        Function Dist(xa, ya, xb, yb)
                Dim ss
'
                ss = Sqr((xb-xa)^2 + (yb - ya)^2)
                Dist = ss
'
        End Function
'
'
        Function Alph(xa, ya, xb, yb)
                Dim dx, dy
                Dim Thi              'Atn(dy/dx)
'
                dx = xb - xa
                dy = yb - ya
'
                If dx = 0 Then
                     If dy = 0 Then Alph = 0
                     If dy > 0 Then Alph = PI/2
                     If dy < 0 Then Alph = PI*3/2
                End If
'
                If dx <> 0 Then Thi = Atn(dy/dx)
'
                If dx > 0 Then
                     Alph = Thi + 2*PI
                End If
'
                If dx < 0 Then
                     Alph = Thi + PI
                End If
'
                If Alph >= 2*PI Then Alph = Alph - 2*PI
'
        End Function
'
'
'  角度の変換(秒を度分秒に)
'
        Function Byodfb( x, doo, fun, byo )
                IF x<0 Then x = x + 1296000
                doo = Int(x/3600)
                fun = Int((x - doo*3600)/60)
                byo = x - doo*3600 - fun*60
                IF byo<0 Then byo = 0
        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 x1,y1,x2,y2
'
                'α1, α2, L1, L2
                x1 = XBP
                y1 = YBP
                x2 = XIP
                y2 = YIP
                AL1 = Alph(x1,y1,x2,y2)
                L1 = Dist(x1,y1,x2,y2)
                x1 = XIP
                y1 = YIP
                x2 = XEP
                y2 = YEP
                AL2 = Alph(x1,y1,x2,y2)
                L2 = Dist(x1,y1,x2,y2)
'
                'IA
                IA = AL2 - AL1
                IF IA<0 Then IA = IA + 2*PI
'
                'TL
                TL = Abs(RR)*tan(IA/2)
'
                'BC
                XBC = XBP + (L1-TL)*cos(AL1)
                YBC = YBP + (L1-TL)*sin(AL1)
'
                'EC
                XEC = XIP + TL*cos(AL2)
                YEC = YIP + TL*sin(AL2)
'
                'M
                IF RR>0 Then
                   XM = XBC + RR*cos(AL1+PI/2)
                   YM = YBC + RR*sin(AL1+PI/2)
                Else
                   XM = XBC + Abs(RR)*cos(AL1-PI/2)
                   YM = YBC + Abs(RR)*sin(AL1-PI/2)
                End IF
'
                'SL
                SL = Abs(RR)/cos(IA/2) - Abs(RR)
'
                'SP
                IF RR>0 Then
                   XSP = XIP + SL*cos(AL1+PI/2+IA/2)
                   YSP = YIP + SL*sin(AL1+PI/2+IA/2)
                Else
                   XSP = XIP + SL*cos(AL1-PI/2-IA/2)
                   YSP = YIP + SL*sin(AL1-PI/2-IA/2)
                End IF
'
                'CL
                CL = Abs(RR)*IA
'
                En
'
        End Sub
'
'
                '円曲線設置計算結果出力
'
Sub En
      Dim i, r
'
      document.write "<CENTER>","*** 円曲線設置計算 ***","</CENTER><BR>"
'
      document.write"<CENTER><TABLE BORDER='0'>"
      document.write"<TR ALIGN='CENTER'>"
      document.write"<TD ALIGN='right'>","   IA","</TD>"
      r = Byodfb(IA*648000/PI,doo,fun,byo)
      byo = Rund(byo,2)
      document.write"<TD ALIGN='right'>",doo & "-" & fun & "-" & byo,"</TD>"
      document.write"<TD ALIGN='right'>","    R","</TD>"
      document.write"<TD ALIGN='right'>",RR,"</TD></TR>"
'
      document.write"<TR ALIGN='CENTER'>"
      document.write"<TD ALIGN='left'>","曲線の要素","</TD></TR>"
      document.write"<TR ALIGN='CENTER'><TD ALIGN='right'>","   TL","</TD>"
      TL = Rund(TL,4)
      document.write"<TD ALIGN='right'>",TL,"</TD>"
      document.write"<TD ALIGN='right'>","  (M) X","</TD>"
      XM = Rund(XM,4)
      document.write"<TD ALIGN='right'>",XM,"</TD></TR>"
'
      document.write"<TR ALIGN='CENTER'><TD ALIGN='right'>","   CL","</TD>"
      CL = Rund(CL,4)
      document.write"<TD ALIGN='right'>",CL,"</TD>"
      document.write"<TD ALIGN='right'>","    Y","</TD>"
      YM = Rund(YM,4)
      document.write"<TD ALIGN='right'>",YM,"</TD></TR>"
'
      document.write"<TR ALIGN='CENTER'><TD ALIGN='right'>","  CL/2","</TD>"
      r = Rund(CL/2,4)
      document.write"<TD ALIGN='right'>",r,"</TD></TR>"
'
      document.write"<TR ALIGN='CENTER'><TD ALIGN='right'>","   SL","</TD>"
      SL = Rund(SL,4)
      document.write"<TD ALIGN='right'>",SL,"</TD></TR>"
'
      document.write"<TR ALIGN='CENTER'>"
      document.write"<TD ALIGN='left'>","曲線の主要点座標","</TD></TR>"
'
      document.write"<TR ALIGN='CENTER'><TD ALIGN='right'>","  NAME","</TD>"
      document.write"<TD ALIGN='right'>","    X    ","</TD>"
      document.write"<TD ALIGN='right'>","    Y    ","</TD></TR>"
'
      document.write"<TR ALIGN='CENTER'><TD ALIGN='right'>","   BC","</TD>"
      XBC = Rund(XBC,4)
      document.write"<TD ALIGN='right'>",XBC,"</TD>"
      YBC = Rund(YBC,4)
      document.write"<TD ALIGN='right'>",YBC,"</TD></TR>"
'
      document.write"<TR ALIGN='CENTER'><TD ALIGN='right'>","   SP","</TD>"
      XSP = Rund(XSP,4)
      document.write"<TD ALIGN='right'>",XSP,"</TD>"
      YSP = Rund(YSP,4)
      document.write"<TD ALIGN='right'>",YSP,"</TD></TR>"
'
      document.write"<TR ALIGN='CENTER'><TD ALIGN='right'>","   EC","</TD>"
      XEC = Rund(XEC,4)
      document.write"<TD ALIGN='right'>",XEC,"</TD>"
      YEC = Rund(YEC,4)
      document.write"<TD ALIGN='right'>",YEC,"</TD></TR>"
'
      document.write"<TR ALIGN='CENTER'><TD ALIGN='right'>","   IP","</TD>"
      XIP = Rund(XIP,4)
      document.write"<TD ALIGN='right'>",XIP,"</TD>"
      YIP = Rund(YIP,4)
      document.write"<TD ALIGN='right'>",YIP,"</TD></TR>"
'
      document.write"<TR ALIGN='CENTER'><TD ALIGN='right'>","   α1","</TD>"
      r = Byodfb(AL1*648000/PI,doo,fun,byo)
      byo = Rund(byo,2)
      document.write"<TD ALIGN='right'>",doo & "-" & fun & "-" & byo,"</TD></TR>"
      document.write"<TR ALIGN='CENTER'><TD ALIGN='right'>","   α2","</TD>"
      r = Byodfb(AL2*648000/PI,doo,fun,byo)
      byo = Rund(byo,2)
      document.write"<TD ALIGN='right'>",doo & "-" & fun & "-" & byo,"</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>

 

 

入力データと実行結果

      BPの座標
            XBP = -51274.2779
            YBP = -31305.5806
      IPの座標
            XIP = -51813.3467
            YIP = -31423.3201
      EPの座標
            XEP = -52144.8230
            YEP = -31551.5362
      半径
            RR = 2000.0000

     ※データ入力は、代入文で直接代入しています。

     ※ボタンをクリックして実行します。

     ※半径は、進行方向に対して右廻りを正、左廻りを負で入力します。

 

      

 

 

プログラムの説明

入力画面は、中間点計算や巾杭計算などの後続のプログラムが完成した後

で作成することにします。プログラムの作成中は、代入文の方が計算結果を

確認し修正(デバッグ)のたびにデータを入力する必要がなく便利です。

また、四捨五入などのプロシージャは、トラバース計算のものをそのままそっ

くり使っています。

 

IF RR>0 Then
   XM = XBC + RR*cos(AL1+PI/2)
   YM = YBC + RR*sin(AL1+PI/2)
Else
   XM = XBC + Abs(RR)*cos(AL1-PI/2)
   YM = YBC + Abs(RR)*sin(AL1-PI/2)
End IF

右カーブか左カーブかで、計算式が異なる部分です。このプログラムでは理

解を簡単にするために、右カーブ、左カーブの判定を行わず、それぞれ正、

負の値を入力するようにしています。

 

Sub En
 ・
 ・
End Sub

トラバース計算のときと同じように、<TABLE> </TABLE> タグを使って表形

式で出力します。<TABLE BORDER='0'> で、罫線は隠してあります。表作

成のタグについては、13.3 開放トラバース をご覧ください。

 r = Byodfb(AL1*648000/PI,doo,fun,byo) は、ラジアン単位のAL1

を度分秒に変換します。トラバース計算では、1秒の値まで合わせる必要が

あったので、秒単位で計算するようにしました。しかし、今回はその必要はな

いのでラジアン単位で計算処理し、結果表示の時に度分秒に変換しています。

 


[もくじへ] [トップページへ]

 りょうかんのアドバイス

計算式のとおりプログラミングするだけでしたから、比較的簡単にプログラム

を作れたのではないでしょうか。

それにしても、表作成は面倒ですね。りょうかんも、何回もやり直しました。

しかし、プログラムの善し悪しは入力と出力の部分で決まります。当然、時間

と労力をかけなければなりません。また、デザインのセンスも必要です。

りょうかんは、デザインには自信がありません。面倒くさいことは嫌いなのです。

あとは、みなさんが、りょうかんのプログラムを参考にして、すばらしいプログ

ラムにしてくださることを希望します。

 

次回は、『中間点計算』の予定です。(10月15日ごろ)

この講座に対する、ご意見やご要望はメールでお願いします。

      『VBScriptによる測量計算プログラミング入門』 

                                講師 りょうかん


[もくじへ] [トップページへ] [次ページへ]