[もくじへ|トップページへ|前ページへ|次ページへ]
2.2 方向角計算つづき
0010 Option
Explicit
0020 Const
PI = 3.14159265358979
0030 Private Sub
Command1_Click()
0040 Dim
X1, Y1 As Double
0050 Dim
X2, Y2 As Double
0070 Dim T
As Double
0080 Dim
doo, fun, byo As Single
'
'
0100 X1 =
Val(Text1.Text)
0110 Y1 =
Val(Text2.Text)
0120 X2 =
Val(Text3.Text)
0130 Y2 =
Val(Text4.Text)
'
'
0140 T =
Alph(X1, Y1, X2, Y2)
0150 Call
RadDeg(T, doo, fun, byo)
0160 Text5.Text
= doo & "-" & fun & "-"
& byo
0170 End Sub
0180 Private Sub
Command2_Click()
0190 Text1.Text
= ""
0200 Text2.Text
= ""
0210 Text3.Text
= ""
0220 Text4.Text
= ""
0230 Text5.Text
= ""
0240 End Sub
0250 Private Sub
Command3_Click()
0260 End
0270 End Sub
0280 Private Sub
Form_Load()
0290 Screen.MousePointer
= 0
0300 Me.Left
= (Screen.Width - Me.Width) / 2
0310 Me.Top
= (Screen.Height - Me.Height) / 2
0320 End Sub
0330 Private Sub
Text1_KeyPress(KeyAscii As Integer)
0340 If
KeyAscii = 13 Then
0350 KeyAscii
= 0
0360 Text2.SetFocus
0370 End
If
0380 End Sub
0390 Private Sub
Text2_KeyPress(KeyAscii As Integer)
0400 If
KeyAscii = 13 Then
0410 KeyAscii
= 0
0420 Text3.SetFocus
0430 End
If
0440 End Sub
0450 Private Sub
Text3_KeyPress(KeyAscii As Integer)
0460 If
KeyAscii = 13 Then
0470 KeyAscii
= 0
0480 Text4.SetFocus
0490 End
If
0500 End Sub
0510 Private Sub
Text4_KeyPress(KeyAscii As Integer)
0520 If
KeyAscii = 13 Then
0530 KeyAscii
= 0
0540 Command1.SetFocus
0550 End
If
0560 End Sub
0570 Private
Function Alph(xa, ya, xb, yb) As Double
0580 Dim
DX, DY As Double
0590 Dim
Thi As Double 'Atn(dy/dx)
'
0600 DX =
xb - xa
0610 DY =
yb - ya
'
0620 If DX
= 0 Then
0630 If
DY = 0 Then Alph = 0
0640 If
DY > 0 Then Alph = PI / 2
0650 If
DY < 0 Then Alph = PI * 3 / 2
0670 End
If
'
0680 If DX
<> 0 Then Thi = Atn(DY / DX)
'
0690 If DX
> 0 Then
0700 Alph
= Thi + 2 * PI
0710 End
If
'
0720 If DX
< 0 Then
0730 Alph
= Thi + PI
0740 End
If
'
0750 If
Alph >= 2 * PI Then Alph = Alph - 2 * PI
'
0760 End
Function
0770 Private Sub
RadDeg(r, d, f, b)
0780 Dim
deg As Double
'
0790 deg =
r * 180 / PI
0800 d =
Int(deg)
0810 f =
Int((deg - d) * 60)
0820 If f
< 0 Then f = 0
0830 b =
(deg - d - f / 60) * 3600
0840 If b
< 0 Then b = 0 Else b = Int(b + 0.5)
'
0850 End Sub
※リスト中の番号は説明のためにつけたもので、入力の必要はありません。
0010 Option
Explicit
変数の宣言を強制します。長いプログラムになってくると、どこでどのよう
な変数を使っているか分からなくなったり、ちょっとしたスペルミスにも気
づきにくいものです。なるべく宣言しておいた方がいいのです。
0020 円周率の変数PIに定数を代入します。
ここまでは、フォームモジュールの(General)部で宣言します。ここで宣言
された変数や定数は、そのモジュール(=フォームモジュール)内のすべて
のプロシージャ(=サブルーチン、関数)内で共通に使えます。
データも保持されます。
0030 コマンドボタン1をクリックしたとき、実行されます。
0140 T = Alph(X1, Y1, X2,
Y2)
関数Alphで方向角を計算します。
0150 Call RadDeg(T, doo,
fun, byo)
サブルーチンプロシージャRadDegでT(ラジアン)を度分秒に変換します。
0160 Text5.Text = doo
& "-" & fun & "-" &
byo
度分秒の値をテキストボックス5に表示します。「&」で前後の値をくっ付
けて表示されます。
0180〜0240
各テキストボックスをクリアします。
0280〜0320
スタート時の画面を中央に表示するには、Form_Load()にこのように記述し
ます。Form_Load()は、プログラムの最初に実行される部分です。初期値な
どをここで設定します。
0330〜0560
各テキストボックスにデータを入力した後、Enterキーを押せば、カー
ソルが次の入力箇所に移動するようになります。
マウスでクリックしながら進めるのは、面倒ですよね。
0570 Private
Function Alph(xa, ya, xb, yb) As Double
〜
0760 End
Function
2点の座標値から、方向角をラジアン単位で計算する関数プロシージャです。
Privateは省略してもかまいません。As
Doubleは倍精度で値を返すことを表
します。
0620 If DX
= 0 Then
0630 If
DY = 0 Then Alph = 0
0640 If
DY > 0 Then Alph = PI / 2
0650 If
DY < 0 Then Alph = PI * 3 / 2
0670 End
If
DX=0(X座標差=0)のときはY軸上になるので、0,π/2あるいは、
3π/2をAlphに代入します。
このように、Thenからあとに続く文がいくつもある時は、最後をEnd
Ifにし
て、入れ子にします。
0750 If
Alph >= 2 * PI Then Alph = Alph - 2 * PI
計算誤差の影響で2πを超える場合、Alphから2πを差し引きます。安全策
です。
0770 Private Sub
RadDeg(r, d, f, b)
〜
0850 End Sub
ラジアンを度分秒に変換するサブルーチンプロシージャです。
Privateは省略してもかまいません。
Int()は整数を取り出す関数でしたね。
0840 If b
< 0 Then b = 0 Else b = Int(b + 0.5)
b<0のときb=0にします。計算誤差があるとbがマイナスになる場合がありま
す。そうでない時、つまりb≧0のときはbを四捨五入します。
※このプログラムでは、テキストの表示を右揃えにしました。
各テキストボックスのプロパティーの設定を、次のようにします。
Alignment
= 1-右揃え
MultiLine
= True
次回は、距離と方向角を合体したプログラムです。
ここまでのソースプログラムは、次をクリックすればダウンロードできます。
ソースプログラムのダウンロード
圧縮されていますので、解凍してから使ってください。

これでおわります。 
[もくじへ|トップページへ|前ページへ|次ページへ]
|