( Tôi đã thử nghiệm phương pháp này trước đây và tôi nhớ nó hoạt động chính xác, nhưng tôi chưa thử nghiệm cụ thể cho câu hỏi này. )
Theo như tôi có thể nói, cả hai và v 1 ⋅ v 2 có thể bị hủy thảm khốc nếu họ đang gần như song song / vuông góc-atan2 không thể cung cấp cho bạn độ chính xác tốt nếu một trong hai đầu vào là tắt.∥v1×v2∥v1⋅v2
Bắt đầu bằng cách định dạng lại bài toán khi tìm góc của một tam giác có độ dài cạnh , b = | v 2 | và c = | v 1 - v 2 | (tất cả đều được tính toán chính xác trong số học dấu phẩy động). Có một biến thể nổi tiếng trong công thức của Heron do Kahan ( Vùng tính toán và góc của tam giác giống như kim ), cho phép bạn tính diện tích và góc (giữa a và ba=|v1|b=|v2|c=|v1−v2|ab) của một tam giác được chỉ định bởi độ dài cạnh của nó và thực hiện ổn định bằng số. Bởi vì việc giảm đối với bài toán con này cũng chính xác, cách tiếp cận này sẽ hoạt động cho các đầu vào tùy ý.
Trích dẫn từ giấy (xem p.3), giả sử ,
μ = { c - ( một - b ) , nếu b ≥ c ≥ 0 , b - ( một - c ) , nếu c > b ≥ 0 , không hợp lệ tam giác , nếu không a n g l e = 2 arctan ( √a≥b
μ=⎧⎩⎨c−(a−b),b−(a−c),invalid triangle,if b≥c≥0,if c>b≥0,otherwise
Tất cả các dấu ngoặc đơn ở đây được đặt cẩn thận, và chúng quan trọng; nếu bạn thấy mình lấy căn bậc hai của một số âm, thì độ dài cạnh đầu vào không phải là độ dài cạnh của một hình tam giác.
angle=2arctan(((a−b)+c)μ(a+(b+c))((a−c)+b)−−−−−−−−−−−−−−−−−−−−√)
Có một lời giải thích về cách thức hoạt động của nó, bao gồm các ví dụ về các giá trị mà các công thức khác không thành công, trong bài báo của Kahan. Công thức đầu tiên của bạn cho là C ″ trên trang 4.αC′′
Lý do chính tôi đề xuất công thức Heron của Kahan là bởi vì nó tạo ra rất nhiều câu hỏi hình học phẳng có khả năng rất khó có thể giảm xuống để tìm diện tích / góc của một tam giác tùy ý, vì vậy nếu bạn có thể giảm vấn đề của mình sang đó, thì có một công thức ổn định tốt đẹp cho nó, và không cần phải tự mình nghĩ ra thứ gì.
v1=(1,0)v2=(cosθ,sinθ)θ=ϵθ=π/2−ϵϵ