지평좌표계로 변환할 때, 방위각을 계산하면 다음과 같다.
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
If문에서 발생할 확률이 더 많은 것을 전진배치하면, 다음과 같이 된다.
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
이보다 더 간단히 정리하면 다음과 같다.
Public Function GetAzimuthRadian(ByVal x As Single, ByVal y As Single) As Single
'천구상의 방위각을 계산한다.
'이 때 방위각은 y축의 양의 방향을 기준으로 시계방향으로 잰각
'즉, 시각좌표계에서 사용해야 함.
'
Return Math.Atan2(x, y)
'
End Function
Posted by 솔라뷰

