본문 바로가기

강의자료/수학이야기

2개의 벡터가 이루는 사이각 구하기.


벡터 A와 B가 있을 경우, 이 2개의 벡터가 이루는 각도Θ를 구해보자.
우선 벡터 A의 끝점에서 B로 수직인 선을 하나 그려 직각삼각형의 형태로 만든다.

여기서 이 직각삼각형의 밑변의 길이는 |A|cos(Θ)이다.
그러므로 이 밑변의 길이만 구하면 역코사인함수(acos)를 이용해서 우리가 구하고자 하는 각도 Θ를 구할수가 있다.

그럼 밑변의 길이는 어떻게 구할까?? 바로 벡터 A와 B의 내적을 이용하면 된다.
내적이 바로 벡터 A를 벡터 B에 정사영시킨 벡터 A`의 길이(직각삼각형의 밑변)와 벡터 B의 길이를 서로 곱한 것이기 때문이다.
즉 AΟB = |A`|*|B| = A.x*B.x + A.y*B.y 이다.
여기서 직각삼각형의 밑변 |A`| = (A.x*B.x + A.y*B.y) / |B| = |A|cos(Θ) 가 되는 것이다.
결국, cos(θ) = (A.x*B.x + A.y*B.y) / (|B|*|A|) 가 되므로 이를 역코사인함수(acos)에 대입하면 우리가 구하고자 하는 각도 Θ를 구할수가 있다.

----------------------------------------------------------------------------------------------------------------------------------

위의 계산과정에서는 벡터 A와 B의 길이를 구해야 하기 때문에 제곱근 계산이 필수로 들어간다.
컴퓨터에서 제곱근 계산은 cpu연산량이 많은 편이므로 좀 더 빠른 속도로 각도를 계산할 수 있는 다른 방법을 알아보자.

벡터 A를 벡터 B와 x축과의 각도 β만큼 반대로 회전해서 A`를 구한다면 A`와 x축과의 각도는 Θ 가 된다.
그래서 벡터 A의 성분 (x, y)에 대해 회전된 벡터 A` (x`, y`)를 구해보면...
x` = cos(β)*x - sin(β)*y
y` = sin(β)*x + cos(β)*y
β각을 구한후 sin, cos를 호출해야 한다.
그런데 우리는 벡터 B의 성분을 알고있다.
벡터 B의 성분 (x2, y2) 와 B의 길이 |B| 를 식에 대입하면...
x` = (x2/|B|)*x - (y2/|B|)*y = (x2*x - y2*y)/|B|
y` = (y2/|B|)*x + (x2/|B|)*y = (y2*x + x2*y)/|B|
그런데 이 식을 이용해 반대로 회전해야 하는데 그러기 위해서는 y2의 부호를 바꿔주면 된다.
그리고 우리가 구하려는건 각도뿐이기때문에 A`의 크기는 상관이 없다. 즉, |B|로 나눠주는 것을 생략할 수 있게 된다.
그래서 최종 공식은...
x` = x2*x + y2*y
y` = x2*y - y2*x
결국 우리가 구하고자 하는 각도 Θ는 cos(Θ) = y`/x` 임을 이용해서 acos(y`/x`) = acos((x2*y - y2*x)/(x2*x + y2*y))로 구할 수 있다.