13.3 開放トラバース          [もくじへ] [トップページへ] [前ページへ]

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

プログラム例題24

開放トラバースのプログラムを作成せよ。

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

考え方

        

初点方向角αA、初点座標 A(XA,YA)、Aでの測角 β1、測距S1 とすると、

Aより点への方向角α1は、

   α1 = αA + β1     ( α1 が360°を超えたら360°を減ずる )

の座標は、

   X1 = XA + S1cos(α1)

   Y1 = YA + S1sin(α1)

となります。

また、点1より点2への方向角α2は、

   α2 = α1 + β2 + 180°α2 が360°を超えたら360°を減ずる )

方向角α2が求められれば、点2の座標は点1の座標と同様に、

   X2 = X1 + S2cos(α2)

   Y2 = Y1 + S2sin(α2)

となります。

以下同様にして各点の座標を求めることができます。したがって、一般式は

次のようになります。

   αn = αn-1 + βn + 180° αn が360°を超えたら360°を減ずる )

   Xn = Xn-1 + Sncos(αn)

   Yn = Yn-1 + Snsin(αn)

 

 

プログラム

 

<HTML>
<HEAD>
   <TITLE>例題24</TITLE>

<SCRIPT LANGUAGE="VBScript">
<!--
'
        Dim an, xa, ya, alpa                          '初点名,X,Y,方向角
        Dim bn, xb, yb, alpb                          '終点名,X,Y,方向角
        Dim ii
        ii = 1                                        '測点番号
        Dim na(50), bt(50), ds(50)                    '測点名,夾角,距離
        Dim n                                         '測点数
'
        Dim ai(50), x(50), y(50)                      '方向角,X座標,Y座標
        Dim dx(50), dy(50)                            'X座標差,Y座標差
        Dim PI
        PI = 3.141592653589793
'
'
                'クリアボタンをクリック
'
        Sub INI_OnClick
                Dim i
                '
                document.Form1.AN.value = ""
                document.Form1.XA.value = 0
                document.Form1.YA.value = 0
                document.Form1.AA.value = 0
'
                '
                document.Form1.BN.value = ""
                document.Form1.XB.value = 0
                document.Form1.YB.value = 0
                document.Form1.AB.value = 0
'
                ii = 1
                For i=1 To 50
                       na(i) = ""
                       bt(i) = 0
                       ds(i) = 0
                Next
'
                document.Form1.NO.value = ii
                document.Form1.NA.value = na(ii)
                document.Form1.BT.value = bt(ii)
                document.Form1.DS.value = ds(ii)
        End Sub
'
'
                '後退ボタン(<)をクリック
'
        Sub BCK_OnClick
                na(ii) = document.Form1.NA.value
                bt(ii) = CDbl(document.Form1.BT.value)
                ds(ii) = CDbl(document.Form1.DS.value)
'
                ii = ii-1
                If ii <= 0 Then ii=1
                document.Form1.NO.value = ii
                document.Form1.NA.value = na(ii)
                document.Form1.BT.value = bt(ii)
                document.Form1.DS.value = ds(ii)
        End Sub
'
'
                '前進ボタン(>)をクリック
'
        Sub FRD_OnClick
                na(ii) = document.Form1.NA.value
                bt(ii) = CDbl(document.Form1.BT.value)
                ds(ii) = CDbl(document.Form1.DS.value)
'
                ii = ii+1
                If ii > 50 Then ii=50
                document.Form1.NO.value = ii
                document.Form1.NA.value = na(ii)
                document.Form1.BT.value = bt(ii)
                document.Form1.DS.value = ds(ii)
        End Sub
'
'
'  角度の変換(度を秒に)
'
        Function Dobyo( x )
                Dim d, f, b
                d = Int(x)
                f = Int((x - d)*100)
                b = Int(((x - d)*100 - f)*100 + 0.5)
                Dobyo = d*3600 + f*60 + b
        End Function
'
'
'  角度の変換(秒を度分秒に)
'
        Function Byodfb( x, doo, fun, byo )
       IF x<0 Then x = x + 1296000
                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 i
'
                '初点データ
                an = document.Form1.AN.value
                xa = CDbl(document.Form1.XA.value)
                ya = CDbl(document.Form1.YA.value)
                alpa = CDbl(document.Form1.AA.value)
'
                '終点データ
                bn = document.Form1.BN.value
                xb = CDbl(document.Form1.XB.value)
                yb = CDbl(document.Form1.YB.value)
                alpb = CDbl(document.Form1.AB.value)
'
                '測点データ
                na(ii) = document.Form1.NA.value
                bt(ii) = CDbl(document.Form1.BT.value)
                ds(ii) = CDbl(document.Form1.DS.value)
'
                '測点数のカウント
                n = 0
                For i = 1 To 50
                        If na(i)="E" Then Exit For
                             n = n + 1
                Next
'
'
'   *** 計算部 ***
'   角度を秒に変換
                alpa = Dobyo(alpa)
                For i = 1 To n
                        bt(i) = Dobyo(bt(i))
                Next
'
                ai(1) = alpa + bt(1)
                Do While ai(1)>=1296000
                      ai(1) = ai(1) - 1296000
                Loop
                For i = 2 To n
                        ai(i) = ai(i-1) + bt(i) + 648000
                        Do While ai(i)>=1296000
                              ai(i) = ai(i) - 1296000
                        Loop
                Next
'
                dx(1) = Rund(ds(1)*cos(ai(1)/648000*PI),3)
                dy(1) = Rund(ds(1)*sin(ai(1)/648000*PI),3)
                x(1) = xa + dx(1)
                y(1) = ya + dy(1)
                For i = 2 To n
                        dx(i) = Rund(ds(i)*cos(ai(i)/648000*PI),3)
                        dy(i) = Rund(ds(i)*sin(ai(i)/648000*PI),3)
                        x(i) = x(i-1) + dx(i)
                        y(i) = y(i-1) + dy(i)
                Next
                Kaiho
'
        End Sub
'
'
                '開放トラバース計算結果出力
'
Sub Kaiho
        Dim i
'
        document.write "<CENTER>","*** 開放トラバース計算 ***","</CENTER><BR>"
'
        document.write"<CENTER><TABLE BORDER='1'>"
        document.write"<TR ALIGN='CENTER'><TD ALIGN='left'>","測点 ","</TD>"
        document.write"<TD ALIGN='right'>","   夾角  ","</TD>"
        document.write"<TD ALIGN='right'>","  方向角  ","</TD>"
        document.write"<TD ALIGN='right'>","  距離  ","</TD>"
        document.write"<TD ALIGN='right'>","   X   ","</TD>"
        document.write"<TD ALIGN='right'>","   Y   ","</TD></TR>"
        document.write"<TR ALIGN='CENTER'><TD ALIGN='center' ></TD>"
        document.write"<TD ALIGN='right'>","   β  ","</TD>"
        document.write"<TD ALIGN='right'>","   α  ","</TD>"
        document.write"<TD ALIGN='right'>","   S  ","</TD>"
        document.write"<TD ALIGN='right'>","   ΔX   ","</TD>"
        document.write"<TD ALIGN='right'>","   ΔY   ","</TD></TR>"
        document.write"<TR ALIGN='CENTER'><TD ALIGN='center' ></TD>"
        document.write"<TD ALIGN='right'>","   δβ  ","</TD>"
        document.write"<TD ALIGN='right'>"," ","</TD>"
        document.write"<TD ALIGN='right'>"," ","</TD>"
        document.write"<TD ALIGN='right'>","   δX   ","</TD>"
        document.write"<TD ALIGN='right'>","   δY   ","</TD></TR>"
'
        '1行目
        document.write"<TR ALIGN='CENTER'><TD ALIGN='left' >",an,"</TD>"
        r = Byodfb(bt(1),doo,fun,byo)
        document.write"<TD ALIGN='right'>",doo & "-" & fun & "-" & byo,"</TD>"
        r = Byodfb(alpa,doo,fun,byo)
        document.write"<TD ALIGN='right'>",doo & "-" & fun & "-" & byo,"</TD>"
        document.write"<TD ALIGN='right'>"," ","</TD>"
        document.write"<TD ALIGN='right'>",xa,"</TD>"
        document.write"<TD ALIGN='right'>",ya,"</TD></TR>"
        '2行目
        document.write"<TR ALIGN='CENTER'><TD ALIGN='left' ></TD>"
        document.write"<TD ALIGN='right'>"," ","</TD>"
        r = Byodfb(ai(1),doo,fun,byo)
        document.write"<TD ALIGN='right'>",doo & "-" & fun & "-" & byo,"</TD>"
        document.write"<TD ALIGN='right'>",ds(1),"</TD>"
        document.write"<TD ALIGN='right'>",dx(1),"</TD>"
        document.write"<TD ALIGN='right'>",dy(1),"</TD></TR>"
        '3行目
        document.write"<TR ALIGN='CENTER'><TD ALIGN='left' ></TD>"
        document.write"<TD ALIGN='right'>"," ","</TD>"
        document.write"<TD ALIGN='right'>"," ","</TD>"
        document.write"<TD ALIGN='right'>"," ","</TD>"
        document.write"<TD ALIGN='right'>"," ","</TD>"
        document.write"<TD ALIGN='right'>"," ","</TD></TR>"
        'i
        For i=1 to n-1
                'iの1行目
                document.write"<TR ALIGN='CENTER'><TD ALIGN='left' >",na(i),"</TD>"
                r = Byodfb(bt(i+1),doo,fun,byo)
                document.write"<TD ALIGN='right'>",doo & "-" & fun & "-" & byo,"</TD>"
                document.write"<TD ALIGN='right'>"," ","</TD>"
                document.write"<TD ALIGN='right'>"," ","</TD>"
                document.write"<TD ALIGN='right'>",x(i),"</TD>"
                document.write"<TD ALIGN='right'>",y(i),"</TD></TR>"
                'iの2行目
                document.write"<TR ALIGN='CENTER'><TD ALIGN='left' ></TD>"
                document.write"<TD ALIGN='right'>"," ","</TD>"
                r = Byodfb(ai(i),doo,fun,byo)
                document.write"<TD ALIGN='right'>",doo & "-" & fun & "-" & byo,"</TD>"
                document.write"<TD ALIGN='right'>",ds(i+1),"</TD>"
                document.write"<TD ALIGN='right'>",dx(i+1),"</TD>"
                document.write"<TD ALIGN='right'>",dy(i+1),"</TD></TR>"
                'iの3行目
                document.write"<TR ALIGN='CENTER'><TD ALIGN='left' ></TD>"
                document.write"<TD ALIGN='right'>"," ","</TD>"
                document.write"<TD ALIGN='right'>"," ","</TD>"
                document.write"<TD ALIGN='right'>"," ","</TD>"
                document.write"<TD ALIGN='right'>"," ","</TD>"
                document.write"<TD ALIGN='right'>"," ","</TD></TR>"
        Next
        'n行目
        document.write"<TR ALIGN='CENTER'><TD ALIGN='left' >",na(n),"</TD>"
        document.write"<TD ALIGN='right'>"," ","</TD>"
        document.write"<TD ALIGN='right'>"," ","</TD>"
        document.write"<TD ALIGN='right'>"," ","</TD>"
        document.write"<TD ALIGN='right'>",x(n),"</TD>"
        document.write"<TD ALIGN='right'>",y(n),"</TD></TR>"
        document.write"</TABLE>"
End Sub
'
-->
</SCRIPT>

</HEAD>


<BODY>


<FORM NAME="Form1">
 *** トラバース計算 ***<BR>
<BR>
初点名= <INPUT TYPE="text" NAME="AN" size=15>
   XA= <INPUT TYPE="text" NAME="XA" size=15>
   YA= <INPUT TYPE="text" NAME="YA" size=15>
  αA= <INPUT TYPE="text" NAME="AA" size=15>
<BR>
終点名= <INPUT TYPE="text" NAME="BN" size=15>
   XB= <INPUT TYPE="text" NAME="XB" size=15>
   YB= <INPUT TYPE="text" NAME="YB" size=15>
  αB= <INPUT TYPE="text" NAME="AB" size=15>
<BR>
  番号= <INPUT TYPE="text" NAME="NO" size=15>
  点名= <INPUT TYPE="text" NAME="NA" size=15>
  測角= <INPUT TYPE="text" NAME="BT" size=15>
  距離= <INPUT TYPE="text" NAME="DS" size=15>
<BR>
<BR>
      <INPUT TYPE="button" NAME="BCK" VALUE=" < ">
<INPUT TYPE="button" NAME="FRD" VALUE=" > ">
      <INPUT TYPE="button" NAME="INI" VALUE="クリア">
<INPUT TYPE="button" NAME="CAL" VALUE="計 算">
<HR>

</FORM>



</BODY>
</HTML>

 

 

入力データと実行結果

 

        

        XA=-6132.14, YA=8462.15

 

閉合トラバースや、結合トラバースにも使える表にしました。空白になっている

箇所があるのは、そのためです。

 

プログラムの説明

 

        Dim ai(50), x(50), y(50)                        '方向角,X座標,Y座標
        
Dim dx(50), dy(50)                                 'X座標差,Y座標差
        
Dim PI
        
PI = 3.141592653589793

入力画面のプログラムに、追加したグローバル変数です。

 

'  角度の変換(度を秒に)
'
        Function Dobyo( x )
                
Dim d, f, b
                d = Int(x)
                f = Int((x - d)*100)
                b = Int(((x - d)*100 - f)*100 + 0.5)
                Dobyo = d*3600 + f*60 + b
        End Function
'
'
'  角度の変換(秒を度分秒に)
'
        
Function Byodfb( x, doo, fun, byo )
                doo = Int(x/3600)
                fun = Int((x - doo*3600)/60)
                byo = x - doo*3600 - fun*60
                
IF byo<0 Then byo = 0
        End Function

測量計算では、角度は1秒も無視できません。ラジアンや度のままだと、場合

によっては数秒の誤差が出る場合があります。したがって、秒に変換して計

算誤差が出ないようにしています。これらは、そのための関数プロシージャ

です。

 

'  四捨五入
'
        
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

変数 sg は、四捨五入するデータの符号(±1)を代入します。abs( ) は、絶

対値を求める関数です。したがって、このプロシージャでは、データの絶対値

を小数第y+1位を四捨五入した後、符号を元に戻します。

 

'   *** 計算部 ***
'   角度を秒に変換
                
alpa = Dobyo(alpa)  @
                For i = 1 To n
                        
bt(i) = Dobyo(bt(i))  A
                
Next
'
                ai(1) = alpa + bt(1)  
B
                
Do While ai(1)>=1296000  C
                      ai(1) = ai(1) - 1296000
                
Loop
                For i = 2 To n
                        ai(i) = ai(i-1) + bt(i) + 648000  
D
                        
Do While ai(i)>=1296000
                              ai(i) = ai(i) - 1296000
                        
Loop
                
Next
'
                
dx(1) = Rund(ds(1)*cos(ai(1)/648000*PI),3)  E
                d
y(1) = Rund(ds(1)*sin(ai(1)/648000*PI),3)  F
                
x(1) = xa + dx(1)  G
                
y(1) = ya + dy(1)  H
                For i = 2 To n
                        dx(i) = Rund(ds(i)*cos(ai(i)/648000*PI),3)
  I
                        d
y(i) = Rund(ds(i)*sin(ai(i)/648000*PI),3)  J
                        x(i) = x(i-1) + dx(i)
  K
                        
y(i) = y(i-1) + dy(i)  L
                
Next
                
Kaiho  M

開放トラバースの計算部です。

@A   入力された角度データをすべて秒に変換します。

B    初点から測点1への方向角の計算です。

C    Bの方向角が360°(129600秒)を超えたら、360°を減じます。


Do While 文

For 文はくり返し回数の決まっている場合に使いますが、Do While 文はくり

返し回数の決まっていない場合に用います。

    Do While 条件式

      くりかえす文

    Loop

のように記述し、条件式を満たしている間 Loop までの文をくり返します。


D    B以外の方向角の計算です。測点2以降の方向角計算は同じなの

で、ループに入れます。

EF   初点からの座標差を求めます。座標差は小数第3位に丸めます。

GH   測点1の座標を求めます。

I〜L 測点2以降の座標差と座標を求めます。 

M    開放トラバース計算結果出力のプロシージャを実行します。

 

                '開放トラバース計算結果出力
'
Sub Kaiho
  ・
  ・
  ・
End Sub

開放トラバース計算結果出力のプロシージャです。閉合トラバースと結合トラ

バースにも使えるように設計してあります。

VBScript には、表示桁をそろえるフォーマット文がないので、HTML の表作成

のタグを使って表を作成します。しかし、表作成はなかなか面倒でなものです。

このプログラムを作る時も、何回か試行錯誤をくりかえして、なんとか表らしい

ものにすることができました。

したがって、ここでは表作成のタグの説明をしますので、それを理解した上で

プログラムを解析し、すっきりした表を作ってみてください。

 

表作成のタグについて

表の始まりと終わりのタグは、<TABLE> </TABLE> です。その中に行を作

るには <TR> </TR> 、列を作るには <TD> </TD> のタグを使います。

また、HTML では行の中に列を作るという考え方をしますので、たとえ行の中

に列が1列しかなくても、<TR> <TD> </TD> </TR> のように使います。

表に枠を付ける時は <TABLE BORDER="1"> のようにします。BORDER

の数値は枠の太さを表します。

枠の中に入れるデータの位置を調整するには、<TD ALIGN="right"> のよ

うに、ALIGN を使います。左揃えは left、中央揃えは center、右揃えは

right を指定します。

たとえば、次のように HTML を書くと、

<TABLE BORDER="1">
<TR><TD>(1,1)</TD><TD>(1,2)</TD><TD>(1,3)</TD></TR>
<TR><TD>(2,1)</TD><TD>(2,2)</TD><TD>(2,3)</TD></TR>
</TABLE>

次のような、2行3列の表ができます。

     

BORDER などに値を指定する場合、"1" のようにダブルクォーテーション

で囲みますが、これを VBScript で記述する場合、次のように内側はシング

ルクォーテーションにしなければなりません。

document.write"<CENTER><TABLE BORDER='1'>"

 


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