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

사진을 찍다 보면, 곧게 뻗어야 할 건축물의 모서리가 휘어져 찍힌다든지 둥글게 찍히는 경우가 많이 있다. 즉, 찍힌 사진이 광학적으로 왜곡된 경우을 보게 된다. 이를 보정하는 방법은 여러 가지가 있다. 여기 그 몇 가지를 소개하고자 한다.

  1. http://www.astrosurf.com/buil/us/iris/iris.htm)
    - 공개용 (원래 천체사진이미지처리 프로그램 IRIS)
    - 어안렌즈의 왜곡을 처리하는 기능이 있음
  2. RectFish : http://www.acapixus.dk/software/rectfish/index.htm
    - 어안렌즈 왜곡 보정하는 프로그램 (공개용)
  3. 왜곡보정 설명 http://www.bythom.com/distortion.htm
  4. 왜곡보정 http://webuser.hs-furtwangen.de/~dersch/
  5. 왜곡보정 http://www.andromeda.com/
  6. PanoTools : http://www.panoguide.com/products/dersch/panotools/


외국 사진 사이트

http://photo.net
http://www.the-digital-picture.com/Reviews/

Posted by solarview

2008/10/23 08:35 2008/10/23 08:35
, , , , ,
Response
No Trackback , No Comment
RSS :
http://www.solarview.net/rss/response/204

형태계수 검증

투영법 버전과 벡터 버전 모두 형태계수에 대한 검증을 했다.

Posted by solarview

2008/03/13 04:30 2008/03/13 04:30
,
Response
No Trackback , No Comment
RSS :
http://www.solarview.net/rss/response/191

북방지시화살표를 추가

화살표도 도면정보와 마찬가지로 변환할 수 있도록 함. 변환에 따른 향을 언제나 정확하게 전달하기 위함임.

Posted by solarview

2008/02/18 10:19 2008/02/18 10:19
,
Response
No Trackback , No Comment
RSS :
http://www.solarview.net/rss/response/188

그림자 추가

그림자는 기본적으로 오블리크 투영(oblique projection)이다.
건물 정보를 oblique projection하면 그림자의 모양이 완성되는 것이다.

Posted by solarview

2008/02/18 09:17 2008/02/18 09:17
,
Response
No Trackback , No Comment
RSS :
http://www.solarview.net/rss/response/187