본문 바로가기

게임개발/공부

각도(0~360도)를 방향 벡터(x, y)로 바꾸는 방법을 생각해 냈다.

벡터 : 보통은 x, y축(2차원) 혹은 x, y, z 축(3차원)을 가진 공간 좌표.

방향벡터 : 길이가 1인 벡터

 

게임을 만들다 보니 각도를 방향벡터로 바꿔야 하는 상황이 왔다.

조금 번거롭게 하면 가능은 하지만 최적화에도 안 좋고, 찾아놓으면 두고두고 쓸 수 있을 거라는 생각에 방법을 생각해 봤다.

처음에는 인터넷을 뒤졌는데 차라리 직접 생각해 내는게 빠를 거 같더라.

 

일단 규칙성을 찾아보려고 했다.

일단 명백하게 각도가 방향 벡터로 바뀔 수 있는 경우가 5개 있었다.

 

0도, 90도, 180도, 270도, 360도

 

0도와 360도는 같은 각도라 사실상은 4개인 샘이다.

 

0도 = 1, 0

90도 = 0, -1

180도 = -1, 0

270도 = 0, 1

360도 = 1, 0

몇가지 규칙성을 발견할 수 있었다.

 

-90도가 변할 때 x와 y가 변화한 값의 총합이 2다.

-x와 y의 변화값은 정확하게 반비례 한다.

-어떤 각도에서도 방향벡터의 길이는 1이다.

-대각선의 길이를 구하는 공식은 'a제곱 + b제곱 = c제곱'이다(피타고라스의 정리).

 

90도가 바뀔 때 x, y 변화값의 총합이 2라면,

45도가 바뀔 때 x, y 변화값의 총합은 1이다.

 

그러면 1도가 바뀔 때 x, y 변화값의 총 합은 2 / 90이다.

 

그 증거는 아래와 같다.

예 1) 2 / 90 * 90 = 2

예 2) 2 / 90 * 45 = 1

 

변화값의 총합을 구하고 나서는

'피타고라스의 정리''방향벡터의 길이는 어떤 경우에도 1이다'를 이용해 x, y의 값을 구할 수 있다.

 

 

예를 들어 283도의 방향벡터를 구해야 한다고 가정해 보자.

 

1. 283도 안에 몇 개의 90이 있는지 계산한다.

283 / 90 = 3.???

여기에서 필요한 건 3이다.

90 * 3 = 270 이기 때문에 270도를 시작 지점으로 잡으면 되고

그렇기 때문에 시작이 되는 방향벡터는 (0, 1)이다.

 

2. 283에서 모든 90을 제외하면 몇의 숫자가 남는지 계산한다. 

283 % 90 = 23

나머지 값이 23이니 '2 / 90 * 23'을 계산해 x, y 변화값의 총합이 '0.51111111111111111111111111111111'인 것을 알 수 있다.

 

3. 피타고라스의 정리를 사용한다.

a제곱 + b제곱 = c제곱(1)

즉, a제곱 + b제곱 = 1이다.

 

4. 시작 각도와 목표 각도를 확인한다.

시작 각도가 270도(0, 1)이었고 변화값이 0.511...이었다.

270 + 90이 360이니 시작 각도 270(0, 1)에서 360(1, 0)을 향해 움직인다는 걸 알 수 있다.

 

5. x, y 축의 변화 방향(+, -)을 확인한다.

시작 x축은 증가하고, y축은 감소한다.

 

6. 계산한다.

x, y의 값은 달라도 각각의 변화값 자체는 동일하니 변화값을 2로 나누어 x축에는 더해주고, y축에는 빼주면

283도의 방향벡터를 구할 수 있다.

 

0.51111111111111111111111111111111 / 2 = 0.25555555555555555555555555555556

x축 = 0 + 0.25555555555555555555555555555556

y축 = 1 - 0.25555555555555555555555555555556

 

283도의 방향 벡터 = (0.25555555555555555555555555555556, 0.74444444444444444444444444444444)