13.3 開放トラバース [もくじへ] [トップページへ] [前ページへ]
===================================================
プログラム例題24
開放トラバースのプログラムを作成せよ。
=========================================================
考え方
初点方向角αA、初点座標 A(XA,YA)、点Aでの測角 β1、測距S1 とすると、
点Aより点1への方向角α1は、
α1 = αA + β1 ( α1 が360°を超えたら360°を減ずる )
点1の座標は、
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
dy(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
dy(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'>"