Я трохи розгорну коментар TravisG і дам ще одну відповідь, використовуючи той факт, що у вашому запитанні був тег "2D".
Ви можете отримати кут між двома векторами за допомогою крапкового добутку, але не можете отримати підписаний кут між двома векторами, використовуючи його. По-іншому, якщо ви хочете повернути персонажа в часі до точки, точковий продукт отримає вам скільки повернути, але не в якому напрямку. Однак є ще одна проста формула, яка дуже корисна в поєднанні з крапковим продуктом. Не тільки у вас є
dot(A,B) = |A| * |B| * cos(angle)
Ви також можете мати іншу формулу (чиє ім'я я склав за політичну коректність):
pseudoCross(A,B) = |A| * |B| * sin(angle)
де якщо A = (a, b), B = (x, y), то псевдокрос (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=cos(ang1)
, b=sin(ang1)
для деякого значення ang1
(НЕ angle
). Тому матриця зліва - це матриця обертання, яка обертає вектор (x, y) на величину -ang1. Це еквівалентно переключенню в систему відліку, де одиничний вектор "А" розглядається як вектор / вісь (1,0)! Тоді, лише намалювавши в цьому кадрі одиничне коло / правий трикутник, ви зможете зрозуміти, чому отриманий вектор цього добутку (cos (кут), sin (кут)).
Якщо ви пишете (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 * пі - це насправді може бути кориснішим і заощадить вам купу логіки "if (ang <180)" тощо.