C# :: Lecture & TIPs

[C#] [Algorithm] 지구에서 두 지점 사이의 방위각 구하기

지구에서 두 지점 사이의 방위각을 구하는 방법을 알아봅시다.

 

방위각

일반적으로, 대원 경로를 따라가면 현재 진행방향에 변화가 생깁니다. 최종 방향은 거리와 위도에 따라 각도가 달라지므로, 초기 방향과 차이가 생기게 되는 것입니다.

만약, 이라크의 바그다드에서 일본 오사카로 이동한다고 가정할 때, 초기 방위각 60˚ 로 시작하여 오사카에 도착했을 때에는 120˚ 로 도달하게 됩니다.

본 게시물에서 소개드릴 공식은 초기 방위각 (전방 방위각, 출발지로부터 도착지까지의 방향) 을 구하기 위한 식으로, 대원 호를 따라 시작점에서 최종 도착점까지 직선으로 이동합니다.

 

공식

θ = atan2 ( sin Δλ ⋅ cos φ₁ , cos φ₁ ⋅ sin φ₂ − sin φ₁ ⋅ cos φ₂ ⋅ cos Δλ )

φ₁, λ₁ 은 출발 지점, φ₂, λ₂ 는 도착 지점의 좌표를 나타내며, Δλ 는 λ₁ λ₂ 의 차이다.

 

소스 코드

            string nl = System.Environment.NewLine;

            // Variables (Required)
            double latx = Double.Parse(X_Latitude.Text);
            double lngx = Double.Parse(X_Longitude.Text);
            double laty = Double.Parse(Y_Latitude.Text);
            double lngy = Double.Parse(Y_Longitude.Text);

            double Pi1 = latx * Math.PI / 180;
            double Pi2 = laty * Math.PI / 180;
            double Lambda1 = lngx * Math.PI / 180;
            double Lambda2 = lngy * Math.PI / 180;

            double y = Math.Sin(Lambda2 - Lambda1) * Math.Cos(Pi2);
            double x = (Math.Cos(Pi1) * Math.Sin(Pi2)) - (Math.Sin(Pi1) * Math.Cos(Pi2) * Math.Cos(Lambda2 - Lambda1));
            double t = Math.Atan2(y, x);

            var bearing = (t * 180 / Math.PI + 360) % 360;

            string results = t + nl + bearing;
            MessageBox.Show(results);

            // θ = 1.038408451477755
            // bearing = 59.49642168039071

            // ∴ 바그다드에서 오사카까지의 방위각은 약 60° 정도 된다.

 

atan2 함수는 -π ~ +π (- 180° ~ + 180°) 범위의 값을 반환하므로, 이 값을 나침반 방위로 정규화 해 줄 필요가 있습니다. Radian θ 를 Degree θ 값으로 변환하고 (θ + 360) % 360 (360 으로 나눈 나머지 값) 을 취하면, Degree 단위의 초기 방위각 도출이 완료됩니다.
 
초기 방위각은 이 처럼 구할 수 있으며, 최종 방위각을 구하는 방법도 어렵지 않습니다.
최종 방위각은 도착지로부터 출발지까지의 초기 방위각을 구한 뒤 뒤바꾸어 계산하면 됩니다. (θ = (θ + 180) % 360)

 

추가 링크

atan2

[C#] 두 개의 좌표점 사이의 절대 각도를 측정하는 atan2

두 개의 좌표점 사이의 절대 각도를 측정하는 atan2 프로그래밍 언어에서 역탄젠트를 계산하는 함수 atan2 의 특징을 알아봅시다.   아크탄젠트란 무엇일까요? 아크탄젠트 (arctangent) 는 역탄젠트라고도 불리우는, 탄젠트의 역함수입니다. 아크탄젠트 (arctangent) 를 이용하면 위에 첨부된 이미지에서의 θ 각도를 도출해낼 수 있습니다. 모든 프로그래밍 언어에는 아크탄젠트를 계산할 수 있도록 Math 모듈에 atan(y / x) 과 atan2(y, x) 함수를…

라디안
https://en.wikipedia.org/wiki/Radian

대원
https://en.wikipedia.org/wiki/Great_circle

 

Leave a comment