Tôi sẽ mở rộng một chút về nhận xét của TravisG và đưa ra một câu trả lời khác, sử dụng thực tế là câu hỏi của bạn có thẻ "2D".
Bạn có thể lấy góc giữa hai vectơ bằng cách sử dụng sản phẩm chấm, nhưng bạn không thể lấy góc đã ký giữa hai vectơ bằng cách sử dụng nó. Nói cách khác, nếu bạn muốn biến một nhân vật theo thời gian về một điểm, sản phẩm chấm sẽ giúp bạn có bao nhiêu để rẽ nhưng không phải là hướng nào. Có một công thức đơn giản khác, tuy nhiên, rất hữu ích khi kết hợp với sản phẩm chấm. Bạn không chỉ có
dot(A,B) = |A| * |B| * cos(angle)
Bạn cũng có thể có một công thức khác (tên mà tôi đã tạo nên cho chính xác):
pseudoCross(A,B) = |A| * |B| * sin(angle)
trong đó nếu A = (a, b), B = (x, y), thì pseudoCross (A, B) được xác định là thành phần thứ ba của sản phẩm chéo (a, b, 0) x (x, y, 0 ). Nói cách khác:
a*x+b*y = |A| * |B| * cos(angle)
-b*x+a*y = |A| * |B| * sin(angle)
Góc được ký đầy đủ là sau đó angle=atanfull(-b*x+a*y,a*x+b*y)
(các hàm atanfull hoặc atan2 tha thứ cho bạn nếu bạn chuyển các giá trị không chuẩn hóa). Nếu A và B được chuẩn hóa, nghĩa là, nếu |A|=|B|=1
, đây đơn giản là:
a*x+b*y = cos(angle)
-b*x+a*y = sin(angle)
Để giải thích sâu hơn, lưu ý rằng các phương trình trên có thể được biểu thị bằng phương trình ma trận:
[ a,b] [x] [cos(angle)]
[-b,a] * [y] = [sin(angle)]
Nhưng a và b có thể được diễn tả như a=cos(ang1)
, b=sin(ang1)
, đối với một số giá trị ang1
(không angle
). Do đó, ma trận bên trái là ma trận xoay làm cho vectơ (x, y) theo số lượng -ang1. Điều này tương đương với việc chuyển sang một khung tham chiếu trong đó vectơ đơn vị "A" được coi là vectơ / trục (1,0)! Vì vậy, chỉ bằng cách vẽ vòng tròn đơn vị / tam giác vuông trong khung này, bạn có thể thấy tại sao vectơ kết quả của sản phẩm đó là (cos (angle), sin (angle)).
Nếu bạn viết (a, b) và (x, y) ở dạng cực, và áp dụng các công thức sai lệch góc cos(l)*cos(m)+sin(l)*sin(m)=cos(l-m)
và sin(l)*cos(m)-cos(l)*sin(m)=sin(l-m)
, bạn thể hiện lại rằng các sin / cosin được đưa ra bởi sản phẩm này, vì (lm) = angle. Ngoài ra, những nhận dạng đó có thể được sử dụng để xem lý do tại sao sản phẩm tuyến tính được đưa ra ở trên xoay một vectơ.
Tất cả những đặc điểm này có nghĩa là bạn hiếm khi cần góc. Bởi vì các góc có thể kỳ lạ - radian / độ, quy ước cho sin / cosine nghịch đảo, thực tế là chúng lặp lại sau mỗi 2 * pi - điều này thực sự có thể hữu ích hơn và tiết kiệm cho bạn một loạt logic "if (ang <180)".