Math.Atan2의 재발견

지평좌표계로 변환할 때, 방위각을 계산하면 다음과 같다.

[code lang-vb]Public Function GetAzimuthRadian(ByVal x As Single, ByVal y As Single) As Single
    '천구상의 방위각을 계산한다.
    '이 때 방위각은 y축의 양의 방향을 기준으로 시계방향으로 잰각
    '즉, 시각좌표계에서 사용해야 함.
    '
    '1) 특수한 경우의 방위각 계산
    If Math.Abs(x) < Single.Epsilon Then
        If y > 0 Then
            Return 0.0F '--> 예) (0,1)의 방위각은 0도
        Else
            Return Math.PI '--> 예) (0,-1)의 방위각은 180도
        End If
    End If
    '
    If Math.Abs(y) < Single.Epsilon Then
        Return Math.Sign(x) * Math.PI / 2 '--> 예) (1,0)은 90도, (-1,0)은 -90도
    End If
    '
    '2) 일반적인 경우의 방위각 계산
    Dim v1 As Single = Math.Atan(Math.Abs(x / y))
    If y > 0 Then
        Return Math.Sign(x) * v1 '--> 예) (1,1)은 45도, (-1,1)은 -45도
    Else
        Return Math.Sign(x) * (Math.PI - v1) '--> 예) (1,-1)은 135도, (-1,-1)은 -135도
    End If
    '
End Function[/code]


If문에서 발생할 확률이 더 많은 것을 전진배치하면, 다음과 같이 된다.

[code lang-vb]Public Function GetAzimuthRadian(ByVal x As Single, ByVal y As Single) As Single
    '천구상의 방위각을 계산한다.
    '이 때 방위각은 y축의 양의 방향을 기준으로 시계방향으로 잰각
    '즉, 시각좌표계에서 사용해야 함.
    '
    If Math.Abs(x) >= Single.Epsilon Then
        If Math.Abs(y) >= Single.Epsilon Then
            '2) 일반적인 경우의 방위각 계산
            Dim v1 As Single = Math.Atan(Math.Abs(x / y))
            If y > 0 Then
                Return Math.Sign(x) * v1 '--> 예) (1,1)은 45도, (-1,1)은 -45도
            Else
                Return Math.Sign(x) * (Math.PI - v1) '--> 예) (1,-1)은 135도, (-1,-1)은 -135도
            End If
        Else
            '1) 특수한 경우의 방위각 계산
            Return Math.Sign(x) * Math.PI / 2 '--> 예) (1,0)은 90도, (-1,0)은 -90도
        End If
    Else
        '1) 특수한 경우의 방위각 계산
        If y > 0 Then
            Return 0.0F '--> 예) (0,1)의 방위각은 0도
        Else
            Return Math.PI '--> 예) (0,-1)의 방위각은 180도
        End If
    End If
        '
End Function[/code]


이보다 더 간단히 정리하면 다음과 같다.

[code lang-vb]Public Function GetAzimuthRadian(ByVal x As Single, ByVal y As Single) As Single
    '천구상의 방위각을 계산한다.
    '이 때 방위각은 y축의 양의 방향을 기준으로 시계방향으로 잰각
    '즉, 시각좌표계에서 사용해야 함.
    '
    Return Math.Atan2(x, y)
    '
End Function[/code]

Posted by solarview

2008/12/31 10:43 2008/12/31 10:43
, ,
Response
No Trackback , No Comment
RSS :
http://www.solarview.net/rss/response/224

Trackback URL : http://www.solarview.net/trackback/224

« Previous : 1 : ... 96 : 97 : 98 : 99 : 100 : 101 : 102 : 103 : 104 : ... 296 : Next »