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

 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




   次回は、距離と方向角を合体したプログラムです。

  ここまでのソースプログラムは、次をクリックすればダウンロードできます。

ソースプログラムのダウンロード 

圧縮されていますので、解凍してから使ってください。


質問や感想をお聞かせ下さい。

■お名前

■メールアドレス

■質問


■このページの印象はいかがでしたか?


        

 これでおわります。              


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