두 직선, 벡터의 관계(사이각,회전각) 구하기

수학 이야기 2014.01.28 19:11

두 직선이 이루는 각 또는 두 벡터가 이루는 각을 구하는 문제는 영상처리나 각종 프로그래밍을 하다보면 필요한 경우가 많습니다. 그런데 그때마다 식을 세우는 것은 좀 번거롭기 때문에 이곳에 정리해 두고 참고하려 합니다.


풀고자 하는 문제는 다음의 두가지 입니다.

  • 두 벡터 v1, v2 사이의 ±회전각: 벡터 v1이 v2로 변했다고 했을 때 몇 도나 회전했고 또 어떤 방향으로(+, -) 회전했는지 계산
  • 두 직선 L1과 L2가 이루는 각: 두 점 (a1,b1), (a2,b2)를 지나는 직선 L1과 두 점 (c1,d1), (c2,d2)를 지나는 직선 L2가 이루는 사이각


두 벡터가 이루는 절대적인 사이각은 비교적 쉽게 구할 수 있지만 v1이라는 벡터가 v2로 변했을 때, 몇 도나 움직였고 또 어떤 방향으로(시계방향? 반시계방향?) 변했는지까지 알아내려면 머리가 조금 복잡해 집니다 (카메라의 팬, 틸트 구할 때, 비행체의 pitch, roll, yaw 구할 때 등). 또 직선의 경우에는 사이각이 2가지가 나올 수 있기 때문에 햇갈릴 소지가 있습니다.


☞ '사이각'이 맞는 걸까요? 아님 '사잇각'이 맞는 걸까요. 햇갈리네요..



위 계산은 기본적으로 벡터의 내적 또는 외적을 이용하기 때문에 벡터의 내적, 외적 수식을 먼저 적어봅니다.


1. 벡터의 내적

두 벡터 v1 = (x1,y1), v2 = (x2,y2)에 대해 그 사이각을 θ라 했을 때, 두 벡터의 내적(inner product 또는 dot product)는 다음과 같이 정의됨


 --- (1)


식 (1)에서 x1x2 + y1y2 = |v1||v2|cosθ 가 성립함을 알 수 있음 (단, |v|는 벡터 v의 크기).



2. 벡터의 외적

벡터의 외적은 기본적으로 3차원에서 정의되며 두 벡터를 v1 = (x1,y1,z1), v2 = (x2,y2,z2)라 했을 때, 두 벡터의 외적(cross product)는 다음과 같이 정의됨


 --- (2)


단, i=(1,0,0), j=(0,1,0), k=(0,0,1)는 좌표축 단위벡터.


벡터의 내적은 좌표 성분끼리 모두 곱하여 합한 것이므로 결과적으로 하나의 상수값이 나오지만, 벡터의 외적은 식 (2)와 같이 3차원의 새로운 벡터가 된다는 점에서 큰 차이가 있음.


기하학적으로 봤을 때, 외적 v1 × v2는 v1, v2로 이루어지는 평면에 수직이면서 그 크기가 (v1, v2로 이루어지는 평행사변형의 넓이인) |v1||v2|sinθ인 벡터로서 그 방향은 아래 그림과 같음:


<그림 1> 벡터의 외적  


☞ 벡터의 외적 방향이 위쪽인지 아래쪽인지 햇갈리기 쉽기 때문에 보통 오른손 법칙, 왼손 법칙 등으로 설명하는데 이게 오른손인지 왼손인지도 햇갈릴 수가 있습니다. 따라서 저는 그냥 첫번째 벡터를 x축, 두번째 벡터를 y축으로 생각했을 때 두 벡터의 외적은 z축 방향이라고 생각합니다. 이와 같이 생각해보면 위 그림에서 v1 × v2는 위쪽 방향, v2 × v1은 아래쪽 방향이 됨을 쉽게 알 수 있습니다.


☞ 벡터의 외적은 원래 3차원 공간에서 정의되지만 z = 0이라고 생각하면 2D 평면에서도 계산은 가능합니다. 즉, 두개의 2차원 벡터 (x1,y1), (x2,y2)에 대해 외적을 (x1,y1,0) × (x2,y2,0) = (0, 0, x1y2-y1x2)와 같은 식으로 계산할 수 있습니다. 결과로 나온 외적 z좌표의 크기 및 부호를 이용하면 2차원 평면에서도 두 벡터가 이루는 각, 각의 방향, 평행사변형 넓이 등을 손쉽게 계산할 수 있음을 알 수 있습니다.


☞ 참고로 영벡터가 아닌 두 벡터의 외적이 영벡터가 되는 경우는 두 벡터가 같은 방향이거나 또는 서로 반대 방향인 경우입니다.



3. 두 벡터의 사이각(회전각)

2차원 평면에서 두 벡터 v1 = (x1,y1), v2 = (x2,y2)가 이루는 각 및 각의 방향(시계방향, 반시계방향)은 다음과 같이 계산됨 (θ가 +면 v1->v2는 반시계방향, -면 시계방향).


 --- (3)


3차원 공간에서는 어떤 방향에서 봤느냐(이쪽에서 봤는지 반대편에서 봤는지)에 따라서 회전의 방향이 서로 반대가 될 수 있기 때문에 각의 방향을 부호로서 정할 수가 없음. 따라서 3차원에서는 두 벡터 v1 = (x1,y1,z1), v2 = (x2,y2,z2)의 절대적인 사이각은 내적을 이용하여 구하고 각의 방향은 외적 벡터의 방향을 보고 따로 판단해야 함. 두 벡터의 (부호가 없는) 절대적인 사이각은 다음과 같이 계산됨:


 --- (4)



4. 두 직선의 사이각

직선의 경우에는 아래 그림과 같이 어떻게 벡터를 잡느냐에 따라서 서로 다른 2개의 사이각이 나올 수 있기 때문에 보통은 최소 사이각을 계산하는 것이 일반적임.


<그림 2> 직선의 사이각


직선 L1 상의 임의의 두 점 (a1,b1), (a2,b2)에 대한 벡터를 v1 = (a2-a1, b2-b1), 직선 L2 상의 임의의 두 점 (c1,d1), (c2,d2)에 대한 벡터를 v2 = (c2-c1, d2-d1)라 할 때, 두 직선 L1과 L2의 최소 사이각은 v1, v2의 사이각을 θ1라 할 때, θ1와 π - θ1 중 작은 값.


 --- (5)



by 다크 프로그래머


저작자 표시 비영리 변경 금지
신고
  • BlogIcon Jason-Cheon 2014.11.12 18:07 신고 ADDR 수정/삭제 답글

    x1y2+x2y1 , 이 부분 오타가 조금 난 것 같습니다^.^ 확인 부탁드리며, 잘 정리해 주셔서 참고하고 갑니다.

    • BlogIcon 다크pgmr 2014.11.12 22:08 신고 수정/삭제

      어떤 부분을 말씀하시는 건지 잘 모르겠습니다. 수식 번호를 알려주시면 찾기 쉬울 것 같습니다.

  • BlogIcon BeanExpert 2014.11.13 10:00 신고 ADDR 수정/삭제 답글

    수식번호 3번에 내적부분을 말씀하시는것 같은데, 내적이라고 생각을 했던것인데, 올려주신 부분이 맞는 부분인가요?? 제 지식의 부족일것 같다는 불안감이...

    • BlogIcon 다크pgmr 2014.11.13 20:43 신고 수정/삭제

      네, 수식 (3)은 두 벡터의 외적의 크기가 두 벡터를 두 변으로 하는 평행사변형의 면적과 같다는 점을 이용해서 두 벡터의 각을 구하는 과정을 설명한 것입니다. 두 벡터의 절대적인 사잇각만을 구하려면 내적을 이용해도 되지만, v1 -> v2로의 +,- 방향성까지 알아내려면 외적을 이용하는 것이 효과적입니다.

  • k2 2015.03.29 21:52 신고 ADDR 수정/삭제 답글

    안녕하세요. 블로그 항상 잘 보고 있습니다. 다른이 아니라 궁금한 것이 있습니다.
    vector 외적이 매트랩에서 'cross' 함수를 사용하면 구해지는데요. 이것은 백터가 3d 일때인데요
    n dimension에서는 어떻게 구할수가 있는 건가요??

    • BlogIcon 다크pgmr 2015.03.30 07:05 신고 수정/삭제

      안녕하세요. 일반적으로 벡터의 외적은 3차원에서만 정의되는 것으로 알고 있습니다. 고차원의 벡터에 대해서도 기존의 수학적 정의를 이용하여 외적을 일반화하려는 몇 가지 해석(위키피디아 참조) 등이 있는 것 같습니다만 그렇다고 실제 4차원 이상에서 외적을 정의하는 것은 일반적이지는 않은 것 같습니다.

  • 키루 2016.07.21 09:06 신고 ADDR 수정/삭제 답글

    내용 감사합니다. 퍼갈께요 ~

  • 신입생 2016.08.19 15:18 신고 ADDR 수정/삭제 답글

    질문있습니다.

    저러한 벡터간의 관계를 이용하여 스테레오 비전에서의 카메라 사이의 각도도 직접 구할수 있나요??
    또한 카메라 사이의 각도를 구한다면 벡터 사이 각을 이용하여야 하는것인지 아니면 직선 사이각을 이용하여야 하는것인지 궁금합니다.

    • BlogIcon 다크pgmr 2016.08.19 17:27 신고 수정/삭제

      보통은 각도를 구하는게 아니라 카메라 사이의 3D 회전 및 평행이동 관계를 구합니다. 그리고 스테레오 카메라 캘리브레이션을 거치면 두 카메라 사이의 기하학적 관계가 얻어집니다.



티스토리 툴바