지평좌표계로 변환할 때, 방위각을 계산하면 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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문에서 발생할 확률이 더 많은 것을 전진배치하면, 다음과 같이 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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 |
이보다 더 간단히 정리하면 다음과 같다.
1 2 3 4 5 6 7 8 |
Public Function GetAzimuthRadian(ByVal x As Single, ByVal y As Single) As Single '천구상의 방위각을 계산한다. '이 때 방위각은 y축의 양의 방향을 기준으로 시계방향으로 잰각 '즉, 시각좌표계에서 사용해야 함. ' Return Math.Atan2(x, y) ' End Function |