Saya akan sedikit memperluas komentar TravisG dan memberikan jawaban lain, memanfaatkan fakta bahwa pertanyaan Anda memiliki tag "2D".
Anda bisa mendapatkan sudut antara dua vektor menggunakan produk titik, tetapi Anda tidak bisa mendapatkan sudut yang ditandatangani antara dua vektor menggunakannya. Dengan kata lain, jika Anda ingin mengubah karakter dari waktu ke waktu menuju titik, produk titik akan memberi Anda berapa banyak untuk berubah tetapi tidak ke arah mana. Namun, ada rumus sederhana lainnya, yang sangat berguna ketika dikombinasikan dengan produk titik. Anda tidak hanya memiliki
dot(A,B) = |A| * |B| * cos(angle)
Anda juga dapat memiliki formula lain (yang namanya saya buat untuk kebenaran politik):
pseudoCross(A,B) = |A| * |B| * sin(angle)
di mana jika A = (a, b), B = (x, y), maka pseudoCross (A, B) didefinisikan sebagai komponen ketiga dari produk silang (a, b, 0) x (x, y, 0 ). Dengan kata lain:
a*x+b*y = |A| * |B| * cos(angle)
-b*x+a*y = |A| * |B| * sin(angle)
Sudut yang ditandatangani penuh kemudian angle=atanfull(-b*x+a*y,a*x+b*y)
(fungsi atanfull atau atan2 memaafkan Anda jika Anda memberikan nilai yang tidak dinormalisasi). Jika A dan B dinormalisasi, yaitu, jika |A|=|B|=1
, ini hanya:
a*x+b*y = cos(angle)
-b*x+a*y = sin(angle)
Untuk penjelasan yang lebih dalam, perhatikan bahwa persamaan di atas dapat diekspresikan oleh persamaan matriks:
[ a,b] [x] [cos(angle)]
[-b,a] * [y] = [sin(angle)]
Tapi a dan b dapat dinyatakan sebagai a=cos(ang1)
, b=sin(ang1)
, untuk beberapa nilai ang1
(tidakangle
). Oleh karena itu, matriks di sebelah kiri adalah matriks rotasi yang memutar vektor (x, y) dengan jumlah -ang1. Ini sama dengan beralih ke kerangka acuan di mana vektor satuan "A" diperlakukan sebagai vektor / sumbu (1,0)! Jadi hanya dengan menggambar lingkaran satuan / segitiga siku-siku dalam bingkai ini, Anda dapat melihat mengapa vektor yang dihasilkan dari produk tersebut adalah (cos (sudut), sin (sudut)).
Jika Anda menulis (a, b) dan (x, y) dalam bentuk kutub, dan terapkan rumus perbedaan sudut cos(l)*cos(m)+sin(l)*sin(m)=cos(l-m)
dansin(l)*cos(m)-cos(l)*sin(m)=sin(l-m)
, Anda menyatakan kembali bahwa sinus / cosinus diberikan oleh produk ini, karena (lm) = sudut. Atau, identitas tersebut dapat digunakan untuk melihat mengapa produk linier yang diberikan di atas memutar vektor.
Semua identitas ini berarti Anda jarang membutuhkan sudut. Karena sudut bisa aneh - radian / derajat, konvensi untuk sinus / cosinus terbalik, fakta bahwa mereka mengulangi setiap 2 * pi - ini sebenarnya bisa lebih berguna dan menghemat banyak logika "jika (ang <180)" dll.