frog.raindrop.jp.knowledge > アルゴリズム ロジック etc.

September 25, 2006

弧度法(-π≦θ≦π)で表された角度を変換する

ラジアン(-π≦θ≦π)で表された角度を、0≦θ≦2π、あるいは度数法に変換します。

ラジアン(-π≦θ≦π)→ラジアン(0≦θ≦2π)

if (rad < 0.)
{
    rad = (2. * π) + rad;
}

ラジアン(-π≦θ≦π)→度数法(-180≦θ≦180)

deg = (rad * 180.) / π

ラジアン(-π≦θ≦π)→度数法(0≦θ≦360)

if (rad < 0.)
{
    rad = (2. * π) + rad
}
deg = (rad * 180.) / π

2点を通る直線の角度を求める

P1 (x1, y1)・P2 (x2, y2) の2点を通る直線の角度 θ を求めます。

まず、X方向・Y方向それぞれの変位を求めます。

// Cの場合です
dx = x2 - x1;
dy = y2 - y1;

Yの変位をXの変位で割ったもののアークタンジェントが求める角度(ラジアン、-π≦θ≦π)となります。ただし、これではXの変位が0の場合に0除算が発生してしまうので、分岐してやる必要があります。言語によっては関数側でXの変位が0でも適切に返してくれる関数が用意されていたりします。

// Cの場合は atan2 関数という、Xの変位とYの変位を引数に取って内部で判断してくれる関数があります。
rad = atan2 (dy, dx);

' VBでは、自分で判断しなければなりません
Pi = Atn (1#) * 4#
Select Case (dx)
Case 0#
    If (dy) Then
        theta = (Sgn (dy) * Pi) / 2#
    Else
        theta = 0#
    End If
    
Case Is < 0#
    If (dy) Then
        theta = (Sgn (dy) * Pi) + Atn (dy / dx)
    Else
        theta = Pi
    End If
    
Case Else
    theta = Atn (dy / dx)    
End Select

!     FORTRAN はCと同じです
      theta=ATAN2(dy,dx)

2点間の距離を求める

P1 (x1, y1)・P2 (x2, y2) の2点間の距離を求めます。

まず、X方向・Y方向それぞれの変位を求めます。

// Cの場合です
dx = abs (x2 - x1);
dy = abs (y2 - y1);

そして、X・Yそれぞれの変位を2乗したものの和の平方根を求めれば、それが2点間の距離です。

// Cの場合です
distance = sqrt (pow (dx, 2) + pow (dx, 2));

' VBでは
distance = Sqr ((dx ^ 2) + (dy ^ 2));

!     FORTRAN では
      distance=SQRT((dx**2)+(dy**2))