Math.Atan2의 재발견

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

[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[/vb]

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

[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[/vb]

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

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

Return Math.Atan2(x, y)

End Function[/vb]

Print Friendly, PDF & Email
%d bloggers like this: