귀하의 질문에 "2D"태그가 있다는 사실을 이용하여 TravisG의 의견을 조금 더 넓히고 다른 답변을 드리겠습니다.
내적을 사용하여 두 벡터 사이의 각도를 얻을 수 있지만 두 벡터 사이 의 부호가있는 각도를 얻을 수는 없습니다 . 달리 말하면, 시간이 지남에 따라 캐릭터를 특정 지점으로 돌리려면 내적은 어느 방향으로 돌리지 않아도됩니다. 그러나 또 다른 간단한 공식이 있는데 이는 내적과 결합 될 때 매우 유용합니다. 당신은뿐만 아니라
dot(A,B) = |A| * |B| * cos(angle)
또 다른 공식 (정치적 정확성을 위해 만든 이름)을 가질 수도 있습니다.
pseudoCross(A,B) = |A| * |B| * sin(angle)
여기서 A = (a, b), B = (x, y)이면 pseudoCross (A, B)는 교차 곱 (a, b, 0) x (x, y, 0의 세 번째 구성 요소로 정의됩니다. ). 다시 말해:
a*x+b*y = |A| * |B| * cos(angle)
-b*x+a*y = |A| * |B| * sin(angle)
그러면 부호있는 전체 각도가됩니다 angle=atanfull(-b*x+a*y,a*x+b*y)
(정규화되지 않은 값을 전달하면 atanfull 또는 atan2 함수가 사용자를 용서합니다). A와 B가 정규화되면 |A|=|B|=1
, 즉는 다음과 같습니다.
a*x+b*y = cos(angle)
-b*x+a*y = sin(angle)
자세한 설명은 위의 방정식을 행렬 방정식으로 표현할 수 있습니다.
[ a,b] [x] [cos(angle)]
[-b,a] * [y] = [sin(angle)]
그러나, A 및 B는 다음과 같이 표현 될 수있는 a=cos(ang1)
, b=sin(ang1)
어떤 값 ang1
(하지 angle
). 따라서 왼쪽의 행렬은 벡터 (x, y)를 -ang1만큼 회전시키는 회전 행렬입니다. 이것은 단위 벡터 "A"가 벡터 / 축 (1,0)으로 취급되는 기준 프레임으로 전환하는 것과 같습니다! 따라서이 프레임에서 단위 원 / 오른쪽 삼각형을 그리면 해당 제품의 결과 벡터가 (cos (angle), sin (angle)) 인 이유를 알 수 있습니다.
사용자가 (a, b)과 극성기 형태 (X, Y)를 작성하고, 각도 차 수식을 적용하는 경우 cos(l)*cos(m)+sin(l)*sin(m)=cos(l-m)
와 sin(l)*cos(m)-cos(l)*sin(m)=sin(l-m)
, 사용자는 사인은 / 코사인은 (LM) = 각도 때문에,이 제품에 의해 주어진 것을 다시 표현한다. 대안 적으로, 이러한 아이덴티티는 위에서 주어진 선형 곱이 벡터를 회전시키는 이유를보기 위해 사용될 수 있습니다.
이 모든 정체성은 각도가 거의 필요하지 않음을 의미합니다. 라디안 /도, 역 사인 / 코사인에 대한 규칙, 각도가 이상 할 수 있기 때문에 2 * pi마다 반복한다는 사실은 실제로 더 유용 할 수 있으며 "if (ang <180)"등의 논리를 절약 할 수 있습니다.