이 블로그는 동일 트래픽 대비 최소 몇배 이상의 수익 차이가 납니다. (인생 진짜)
광고 차단 프로그램 한번만 꺼주시길 부탁드립니다. 양해부탁드립니다...
수학

벡터의 각도 구하기(라디안, 도, 역탄젠트)

UniCoti(유니코티) 2022. 9. 20.
반응형

원래는 유니티 블로그지만 수학에도 관심이 많아

새로운 주제로 글을 써본다.

이 주제를 알게 된 건 굉장히 옛날부터이고 다양한 시도를 해보았지만

구할 수 없었는데 프로그래밍을 하다 벡터로 입사각을 구하는

게시물에

Mathf.atan2(y,x) * 180 / Mathf.PI;

라는 전혀 이해할 수가 없는 코드가 있어

나의 수학 선생님에게 물어본 결과

처음엔 이해가 안 되었지만 찍어주신 영상도 여러 번 보고,

인터넷도 찾아보며 여러 정보를 얻은 결과

글을 써도 될 것 같아 끄적여본다.

 

서론은 이쯤 하고,

 

본격적으로 코드를 한글로 풀어보겠다.

수학. 아크 탄젠트(y, x) 곱하기 180 나누기 3.14.....

이걸 수식으로 바꾼다면

arctan(x/y) x 180 ÷ π

로 나타낼 수 있고 인간친화적으로 그림으로 적어보면

이런 식이 된다.

하나도 뭔 소리인지 몰라도 괜찮다.

필자도 이 교육과정을 배울 나이가 아녔었다.

 

솔직히 설명을 잘할 수 있을지 모르겠다.

내가 기억하기 쉽게 하는 용도로 글을 적어보겠다.

 

이식을 알기 위해선 역함수, 라디안 개념을 알아야 한다.

먼저 라디안부터 알아보자

 

라디안은 쉽게 말하면 반지름의 크기가 1인 기준원을 그려서

호의 길이가 1인 부채꼴의 중심각이 1 라디안이다.

저 중심각의 크기가 1 라디안이다.

여기서 주의할 점은 저 중심각의 단위는 "도"가 아니라

"라디안"이라는 것이다.

 

도는 실수가 아니기 때문에 함수의 대응관계에서 쓰일 수 없다.

그렇기에 우리는 절대적인 호의 길이를 나타내는

라디안을 각도 대신 사용한다.

 

참고로 1라디안의 값을 도로 환산하면,

57.2958...° 이다. 

 

원안을 한 바퀴 돌리면 360도가 나온다.

 

그리고 원의 원주(원의 겉선 길이)는

2 x π x r인데,

r은 반지름을 뜻한다.

하지만 기준원에선 반지름이 1이기에

2 x π x 1로 

원주는 2π가 된다.

 

그렇다면 360도의 호의 길이는 2π가 되고,

180도는 π,

90도는 2분의 1 π

45도는 4분의 1π가 된다.

 

앞의 도가 붙은 것이 각도,

π가 붙은 값이 라디안이다.

 

만약 도에서 라디안으로 변환하고 싶다면 어떡해야 할까?

360(도)에 무엇을 곱해야 2π가 될까?를 생각해보자

360x = 2π

x = 2π / 360

x = π/180

그렇다 180분의 π를 곱하면

 

도에서 라디안으로 변환되는 것이다.

 

같은 방법으로 라디안에서 도로 변환하려면

x = 180 / π이다.

 

여기까지의 과정에서 우리는 두 가지 식을 세울 수 있다.

 

도 -> 라디안 변환식 : π/180 곱해주기.

라디안 -> 도 변환식 : 180/π 곱해주기.

 

반응형

 

이제 역함수를 알아보겠다.

이 문제에는 탄젠트만 알면 된다.

이 직각 삼각형은 탄젠트를 설명하기 위한 그림이다

탄젠트는 밑변분의 높이로 

이 그림에서 선분의 길이를 각각 x, y로 두고 탄젠트 세타(0 비슷하게 생긴 거)를 물어본다면

x분의 y이다.

여기서 세타는 라디안 값이다.

일반적인 함수는 오른쪽의 값을 구하지만

역함수는 세타의 값을 구하는 식이 된다.

 

이 식을 역함수로 바꾸면,

이런 식이 된다. 저 지수에 -1은 역함수를 나타내는 기호이다.

역함수에서 "역"은 영어로 arc이다.

그래서 -1을 빼고 arctan이라고 적어줘도 무방하다.

이제 중요한 건 세타가 라디안이라는 것이다

우리는 이걸 각도로 변환하길 원하기 때문에

세타에 라디안을 각도로 변환하는 식인

180 / π를 곱해준다.

 

어디서 보던 식이 등장하지 않았는가?

맨 위의 쯤을 보면 이 식이 그대로 나와있다.

우리가 잘 헤쳐왔다는 증거이다.

 

이걸 프로그램상으로 나타내면

Mathf.atan2(y, x) * 180 / Mathf.PI가 된다.

와우!

드디어 벡터를 가즈고 각도를 구할 수 있다.

 

활용해보자면

Mathf.atan2(Vec.y, Vec.x) * 180 / Mathf.PI처럼 활용할 수 있겠다.

 

또한 글의 윗부분에서,

1 라디안이 대략 57.2958...°라고 하였는데,

계산기로 1 x (180 ÷ 3.14)를 해보면

오차는 있겠지만 1라디안을 각도로 환산한 것과 같기에

계산해보면 57.324840764331206 이라는 매우 근사치가 나온다.

파이값을 조금 더 세밀하게

3.14159265358979로 놓고 계산해보면,

57.29577951308238 거의 똑같은 수치가 나온다.

실제 1라디안은 57.29577951308232...로 

소수점 13자리 까지 똑같은걸 볼 수 있다. 

 

여기서 검산까지 해보자면

만약 (2,2)라는 벡터가 있다고 하자.

그럼 Mathf.atan2(2,2) * 180 / Mathf.PI이다.

F12를 눌러 콘솔에 Math.atan2(2,2) * 180 / Math.PI

를 쳐서 결과를 확인해보면 45가 나오는 걸 볼 수 있다.

 

콘솔

 

좌표평면에서 가상의 직각 삼각형을 그려

활용하게 되는 것이다.

또한 역발상적인 생각으로

굳이 아크(역) 탄젠트로만 구할 수 있을까?라는 생각이 들어

아크(역) 사인으로도 구해보았는데,

잘 나오는 모습을 볼 수 있었다.

조금 번거롭긴 하지만

식을 조금 추가하면 아크 사인으로도 각도를 구할 수 있다.

 

도움이 되었길 바라며,

 

끝.

반응형

댓글