12.距離と方向角計算          [もくじへ] [トップページへ]

12.1 2点間の距離

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

プログラム例題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 で、このようなビジュアルな測量計算のプログラムも作れる

ということが、おわかりいただけたと思います。

 


12.2 方向角               [もくじへ] [トップページへ]

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

プログラム例題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で、方向角が以上のとき、を減じます。

        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つのプログラムを組み合わせることができます。

このように、ひとつのプログラムはいくつかのプロシージャを組み合わせて作

られます。これをモジュール化プログラミングといいます。複雑な計算も細か

くモジュールに分けることにより、プログラミングが簡単になりメンテナンスも

楽です。

 


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