===================================================
プログラム例題20
2点の座標を入力して、その距離を求めよ。
=========================================================
<HTML>
<HEAD>
<TITLE>例題20</TITLE>
<SCRIPT LANGUAGE="VBScript">
<!--
'
Function Dist(xa,
ya, xb, yb)
Dim
ss
'
ss
= Sqr((xb-xa)^2 + (yb - ya)^2)
Dist
= ss
End Function
'
'
Sub calc_OnClick
Dim
x1,y1,x2,y2,s
'
x1
= CDbl(document.Form1.X1.value)
y1
= CDbl(document.Form1.Y1.value)
x2
= CDbl(document.Form1.X2.value)
y2
= CDbl(document.Form1.Y2.value)
'
s
= Dist(x1,y1,x2,y2)
document.Form1.S.value
= s
End Sub
'
'-->
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="Form1">
*** 2点間の距離計算 ***<BR>
<BR>
X1= <INPUT TYPE="text" NAME="X1"
size=15><BR>
Y1= <INPUT TYPE="text" NAME="Y1"
size=15><BR>
<BR>
X2= <INPUT TYPE="text" NAME="X2"
size=15><BR>
Y2= <INPUT TYPE="text" NAME="Y2"
size=15><BR>
<BR>
<INPUT TYPE="button"
NAME="calc" VALUE="計算"><BR>
<BR>
距離 S= <INPUT TYPE="text" NAME="S"
size=15><BR>
</FORM>
</BODY>
</HTML>
点1 ( X1,Y1) と点2 (X2,Y2) の距離は、次の式で求められます。
点1(-300, 200),点2(-250, 400)の場合の実行結果は、次のようになります。
Function Dist(xa, ya, xb, yb)
Dim ss
'
ss = Sqr((xb-xa)^2 + (yb - ya))
Dist = ss
End Function
2点間の距離を計算する関数プロシージャです。これぐらいの計算は関数プ
ロシージャにしなくてもいいのですが、座標値から距離を求める計算は後で
使うので独立させておきます。
Sub calc_OnClick
Dim x1,y1,x2,y2,s @
'
x1 = CDbl(document.Form1.X1.value) A
y1 = CDbl(document.Form1.Y1.value) B
x2 = CDbl(document.Form1.X2.value) C
y2 = CDbl(document.Form1.Y2.value) D
'
s = Dist(x1,y1,x2,y2) E
document.Form1.S.value = s F
End Sub
コマンドボタンをクリックすると、このサブルーチンプロシージャが実行されま
す。
Aは、
document (HTML文書)の、
Form1 という名前のフォームにある、
X1 という名前のテキストボックスの
データ(value)を
倍精度の数値に変換(CDbl( ))し、
変数 x1 に代入
しています。
CDbl( ) は、文字列を倍精度(14〜15桁の精度)の数値に変換する関数で
す。
Eは、x1, y1, x2, y2 の引数で Dist 関数プロシージャを呼び出し、計算結
果を変数 s に代入しています。
Fは、s の値をテキストボックスに表示します。
<FORM
NAME="Form1"> G
*** 2点間の距離計算 ***<BR> H
<BR>
X1= <INPUT
TYPE="text" NAME="X1" size=15><BR> I
Y1= <INPUT
TYPE="text" NAME="Y1" size=15><BR> J
<BR>
X2= <INPUT
TYPE="text" NAME="X2" size=15><BR> K
Y2= <INPUT
TYPE="text" NAME="Y2" size=15><BR> L
<BR>
<INPUT
TYPE="button" NAME="calc" VALUE="計算"><BR> M
<BR>
距離 S= <INPUT
TYPE="text" NAME="S" size=15><BR> N
</FORM> O
<FORM></FORM>タグのブロックで、入力画面を作ります。VBScript で、こ
のような画面を作るには、document.write ・・・ のような形でタグを書き込め
ばいいのですが、直接タグを使った方が簡単です。
計算は VBScript、画面はHTMLタグで作るというように、両方を組み合わせ
てプログラミングしていきます。
Gで、Form1 という名前のフォームを作ります。
Hは、そのフォーム画面に"*** 2点間の距離計算 ***"というタ
イトルを表示します。HTMLでは、その中に書かれた文字がそのまま表示さ
れます。普通に表示するだけなら、特別な命令やタグは必要ありません。
<BR> は改行のタグです。文字の間にスペースを入れる時は全角のスペー
スを入れます。
Iは、"X1=" の文字を表示し、X1 という名前の半角15文字分の大きさの
テキストボックスを作ります。先頭のスペースで、表示位置を少し右にずらし
ています。
Mは、calc という名前のコマンドボタンを作ります。"計算"はボタンに表示さ
れる文字です。
距離を四捨五入をすればもっと使い易くなりますが、インターネット用の言語
である VBScript で、このようなビジュアルな測量計算のプログラムも作れる
ということが、おわかりいただけたと思います。
===================================================
プログラム例題21
2点の座標を入力して、その方向角を求めよ。
=========================================================
考え方
●方向角の計算
方向角というのは、数学の三角関数の角度の扱いと同じで、X軸の正の方向
からY軸の正の方向に測った角のことです。通常、数学の座標では横軸をX
軸、縦軸をY軸としますが、測量の座標では北の方向を基準に角度を測るた
め、縦軸がX軸、横軸がY軸になっています。
しかし、測量座標は数学座標そのものをY軸周りに180度回転して裏返しに
し、右回り(時計回り)に90度回転しただけなので、角の向きが反対回りに見
えますが、考え方は数学座標と全く同じになります。当然のことですが、三角
関数の公式もそのまま使えます。
点1から点2への方向角αを求めるには、次のようにします。
(1)2点の座標の座標差を求めます。
dX = X2 - X1
dY = Y2 - Y1
(2)dX の符号で場合分けします。
@)dX = 0 の場合、
dY = 0 のとき、α = 0°
dY > 0 のとき、α = 90°
dY < 0 のとき、α = 270°
A)dX≠0 の場合、
まず、dY/dX の逆正接(θ
= )を求めます。
各象限での方向角αは、
(ア)T象限 ( X>0, Y>0 ) : α = θ
(イ)U、V象限 ( X<0 ) : α = θ + 180°
(ウ)W象限 ( X>0, Y<0) : α = θ + 360°
なぜなら、θ = で求められた角は90°以内の角になり、
図のように、dY/dX と同じ符号をもつからです。
また、T象限とW象限は360°(=1回転)の違いなので、
α = θ + 360°
として、もしαが360°超えたら360°を減ずるようにすると、1つの
式にまとめることができます。
●角度の変換(ラジアンを度分秒に変換)
コンピュータ内(組み込み関数)で扱われる角度の単位はラジアンです。した
がって、ラジアンを度分秒に変換したり、度分秒をラジアンに変換するプログ
ラムを作成しなければなりません。度分秒をラジアンに変換するプログラムは、
例題7で作成しましたので、ここではラジアンを度分秒に変換するプログラム
について考えます。
R は変換前の角度(ラジアン)とします。
D = R×180/π で度に変換
A = Int(D) で整数部の度を取り出す
B = (D - A)×60 で度を除いた値を分になおす
さらに、
B = Int(B) で分を取り出す
C = D - A - B/60 で秒の部分を取り出す
さらに、
C = C×3600 で秒になおす
これで、A, B, C にそれぞれ度、分、秒の値が求められます。
以上の考え方でプログラミングします。
<HTML>
<HEAD>
<TITLE>例題21</TITLE>
<SCRIPT LANGUAGE="VBScript">
<!--
Dim PI 'グローバル変数の宣言
PI =
3.141592653589793
'
'
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 RadDeg
(r, d, f, b)
Dim
deg
'
deg
= r * 180/PI
d
= int(deg)
f =
Int((deg - d)*60)
If
f<0
Then f=0
b =
(deg - d - f/60)*3600
If b<0 Then b=0 Else
b=Int(b+0.5)
'
End Function
'
'
Sub calc_OnClick
Dim
x1, y1, x2, y2, t, ret
'
x1
= CDbl(document.Form1.X1.value)
y1
= CDbl(document.Form1.Y1.value)
x2
= CDbl(document.Form1.X2.value)
y2
= CDbl(document.Form1.Y2.value)
'
t =
Alph(x1,y1,x2,y2)
ret
= RadDeg(t, doo, fun, byo)
document.Form1.T.value
= doo & "-" & fun & "-" & byo
End Sub
'
'
-->
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="Form1">
*** 方向角計算 ***<BR>
<BR>
X1= <INPUT TYPE="text"
NAME="X1" size=15><BR>
Y1= <INPUT TYPE="text"
NAME="Y1" size=15><BR>
<BR>
X2= <INPUT TYPE="text"
NAME="X2" size=15><BR>
Y2= <INPUT TYPE="text"
NAME="Y2" size=15><BR>
<BR>
<INPUT TYPE="button"
NAME="calc" VALUE="計算"><BR>
<BR>
方向角 T = <INPUT TYPE="text" NAME="T"
size=15><BR>
</FORM>
</BODY>
</HTML>
点1(250, -300),点2(-200, 400)の場合の実行結果は、つぎのようになりま
す。
Dim
PI 'グローバル変数の宣言
PI
= 3.141592653589793
プロシージャの外で宣言された変数は、各プロシージャで有効です。このよう
な変数をグローバル変数といいます。これに対し、プロシージャ内で宣言され
た変数は、そのプロシージャ内だけで有効です。このような変数をローカル変
数といいます。円周率 PI は2つ以上のプロシージャで使うので、グローバル
変数にしました。
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 A
'
End
Function
2点の座標から方向角を計算するプローシージャです。
@で、xa, ya, xb, yb にそれぞれ X1, Y1, X2, Y2 が渡されます。
Aで、方向角が2π以上のとき、2πを減じます。
Function
RadDeg (r, d, f, b)
Dim
deg
'
deg = r * 180/PI
d
= int(deg)
f = Int((deg - d)*60)
If
f<0 Then f=0 @
b = (deg - d - f/60)*3600
If
b<0 Then b=0 Else b=Int(b+0.5) A
'
End
Function
ラジアンの値を度分秒に変換するプローシージャです。
@は、減算の結果がちょうど0の場合、コンピュータの変換誤差で計算結果
がマイナスになる場合があるため、そのときは0にします。
Aは、マイナスのときは変換誤差を修正し、それ以外のときは四捨五入しま
す。
Sub
calc_OnClick
Dim
x1, y1, x2, y2, t, ret
'
x1
= CDbl(document.Form1.X1.value)
y1
= CDbl(document.Form1.Y1.value)
x2
= CDbl(document.Form1.X2.value)
y2
= CDbl(document.Form1.Y2.value)
'
t = Alph(x1,y1,x2,y2) @
ret = RadDeg(t, doo, fun, byo) A
document.Form1.T.value
= doo & "-" & fun & "-" & byo B
End
Sub
コマンドボタンをクリックしたとき、実行されるプロシージャです。
@は、引数 x1, y1, x2, y2 を方向角を求める関数プロシージャ Alph に渡し、
その結果(方向角)を t に代入します。
Aは、その t をラジアンを度分秒を求める関数プロシージャ RadDeg に渡し、
その結果を doo, fun, byo に受け取ります。この場合の ret はダミーと考え
られます。なければ構文的にエラーになりますし、その値は無意味なものです。
Bは、doo, fun, byo の値を "-" でつないでテキストボックスTに表示します。
長いプログラムになりましたが、このプログラムは後でも出てきますので、よく
理解しておいてください。
12.3 距離と方向角計算 [もくじへ] [トップページへ]
===================================================
プログラム例題22
例題20と例題21のプログラムを組み合わせて、2点間の距離と方向
角を求めるプログラムを作成せよ。
=========================================================
<HTML>
<HEAD>
<TITLE>例題22</TITLE>
<SCRIPT LANGUAGE="VBScript">
<!--
'
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 RadDeg
(r, d, f, b)
Dim
deg
'
deg
= r * 180/PI
d
= int(deg)
f =
Int((deg - d)*60)
If
f<0
Then f=0
b =
(deg - d - f/60)*3600
If b<0 Then b=0 Else
b=Int(b+0.5)
'
End Function
'
'
Sub calc_OnClick
Dim
x1, y1, x2, y2, s, t, ret
'
x1
= CDbl(document.Form1.X1.value)
y1
= CDbl(document.Form1.Y1.value)
x2
= CDbl(document.Form1.X2.value)
y2
= CDbl(document.Form1.Y2.value)
'
s
= Dist(x1,y1,x2,y2)
'
t =
Alph(x1,y1,x2,y2)
ret
= RadDeg(t, doo, fun, byo)
'
document.Form1.S.value
= s
document.Form1.T.value
= doo & "-" & fun & "-" & byo
'
End Sub
'
'
'-->
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="Form1">
*** 2点間の距離と方向角計算 ***<BR>
<BR>
X1= <INPUT TYPE="text"
NAME="X1" size=15><BR>
Y1= <INPUT TYPE="text"
NAME="Y1" size=15><BR>
<BR>
X2= <INPUT TYPE="text"
NAME="X2" size=15><BR>
Y2= <INPUT TYPE="text"
NAME="Y2" size=15><BR>
<BR>
<INPUT TYPE="button"
NAME="calc" VALUE="計算"><BR>
<BR>
距離 S= <INPUT TYPE="text" NAME="S"
size=15><BR>
<BR>
方向角 T= <INPUT TYPE="text" NAME="T"
size=15><BR>
</FORM>
</BODY>
</HTML>
点1(300, 200),点2(-320, -260)の場合の実行結果は、つぎのようになりま
す。
プログラムそのものは当然ながくなりますが、ほとんど変更することなしに、
2つのプログラムを組み合わせることができます。
このように、ひとつのプログラムはいくつかのプロシージャを組み合わせて作
られます。これをモジュール化プログラミングといいます。複雑な計算も細か
くモジュールに分けることにより、プログラミングが簡単になりメンテナンスも
楽です。