2012-04-13 28 views
11

(Trong ba chiều) Tôi đang tìm cách tính toán góc đã ký giữa hai véc tơ, không có thông tin nào khác ngoài các vectơ đó. Như được trả lời trong this question, nó đủ đơn giản để tính toán góc đã ký cho bình thường của mặt phẳng mà các vectơ vuông góc với nhau. Nhưng tôi không thể tìm ra cách để làm điều này nếu không có giá trị đó. Rõ ràng rằng sản phẩm chéo của hai vectơ tạo ra một bình thường như vậy, nhưng tôi đã chạy vào mâu thuẫn sau đây bằng cách sử dụng câu trả lời ở trên:Góc được ký giữa hai véc-tơ không có mặt phẳng tham chiếu

signed_angle(x_dir, y_dir) == 90 
signed_angle(y_dir, x_dir) == 90 

điều tôi chờ đợi kết quả thứ hai là âm tính. Điều này là do thực tế là sản phẩm chéo cross(x_dir, y_dir) là theo hướng ngược lại của cross(y_dir, x_dir), do psuedocode sau với đầu vào bình thường:

signed_angle(Va, Vb) 
    magnitude = acos(dot(Va, Vb)) 
    axis = cross(Va, Vb) 
    dir = dot(Vb, cross(axis, Va)) 
    if dir < 0 then 
     magnitude = -magnitude 
    endif 
    return magnitude 

Tôi không tin dir bao giờ sẽ là tiêu cực trên.

Tôi đã gặp sự cố tương tự với giải pháp atan2 được đề xuất.

Tôi đang tìm kiếm một cách để thực hiện:

signed_angle(a, b) == -signed_angle(b, a) 
+1

không phải là điều này: http://www.jtaylor1142001.net/calcjat/Solutions/VDotProduct/VDPTheta3D.htm những gì bạn đang tìm kiếm? – Jack

+0

Liên kết trong nhận xét trên không hoạt động – ephere

Trả lời

1

Cảm ơn tất cả.Sau khi xem xét các ý kiến ​​ở đây và nhìn lại những gì tôi đã cố gắng làm, tôi nhận ra rằng tôi có thể thực hiện những gì tôi cần làm với công thức chuẩn, đã cho cho một góc đã ký. Tôi vừa bị treo trong bài kiểm tra đơn vị cho chức năng góc đã ký của tôi.

Để tham khảo, tôi sẽ cho góc quay trở lại vào một chức năng xoay. Tôi đã không tính đến thực tế rằng điều này sẽ tự nhiên sử dụng cùng một trục như trong signed_angle (sản phẩm chéo của vectơ đầu vào), và hướng quay chính xác sẽ đi theo hướng nào mà trục đang đối diện.

Nhiều chỉ cần đặt, cả hai nên chỉ là "làm điều đúng" và xoay theo các hướng khác nhau:

rotate(cross(Va, Vb), signed_angle(Va, Vb), point) 
rotate(cross(Vb, Va), signed_angle(Vb, Va), point) 

Trường hợp số đầu tiên là trục quay và thứ hai là số tiền để xoay.

3

Signed góc giữa hai vectơ mà không có một mặt phẳng tham chiếu

angle = acos(dotproduct(normalized(a), normalized(b))); 

signed_angle (a, b) == -signed_angle (b, a)

Tôi nghĩ điều đó là không thể nếu không có một loại véc tơ tham chiếu nào đó.

+0

Tôi đã suy nghĩ về nó một số chi tiết, và điều này là đúng. Dấu của góc phụ thuộc vào trục quay bạn sử dụng làm tham chiếu. Và tất nhiên có hai trục khác nhau, một theo hướng của sản phẩm chéo và một theo hướng ngược lại. –

+0

@JeffE: Có, và trong khi bạn có thể tìm thấy trục "quay" bằng cách sử dụng sản phẩm chéo, bạn không thể xác định hướng nào ban đầu nó đang đối mặt - trong 'chéo b' hoặc trong' b chéo a' - vectơ hoán đổi, và bạn sẽ nhận trục quay ngược chiều. Kết quả là không thể xác định nếu góc quay nằm trong khoảng 0..pi hoặc nếu nó nằm trong phạm vi pi..pi * 2. – SigTerm

-2

Nếu tất cả các bạn muốn là một kết quả phù hợp, sau đó bất kỳ cách nào tùy ý lựa chọn giữa một × bb × một cho bình thường của bạn sẽ làm. Có lẽ chọn một từ nhỏ hơn?

(Nhưng bạn có thể muốn giải thích những gì vấn đề bạn đang thực sự cố gắng để giải quyết:. Có thể có một giải pháp mà không liên quan đến tính toán một góc ký nhất quán giữa tùy ý 3 vectơ)

18

Các công thức toán học có liên quan:

dot_product(a,b) == length(a) * length(b) * cos(angle) 
    length(cross_product(a,b)) == length(a) * length(b) * sin(angle) 

Đối với một góc mạnh mẽ giữa 3-D vectơ, tính toán thực tế của bạn nên là:

s = length(cross_product(a,b)) 
    c = dot_product(a,b) 
    angle = atan2(s, c) 

Nếu bạn sử dụngChỉ riêng, bạn sẽ gặp phải các vấn đề về độ chính xác nghiêm trọng đối với các trường hợp khi góc nhỏ. Máy tính s và sử dụng atan2() mang đến cho bạn kết quả mạnh mẽ cho tất cả các trường hợp có thể xảy ra.

s luôn không âm, góc kết quả sẽ nằm trong khoảng từ 0 đến pi. Sẽ luôn có một góc âm tương đương (angle - 2*pi), nhưng không có lý do hình học nào để thích nó.

+0

Cảm ơn, tôi sẽ giữ điều đó về acos. Tôi đoán nó là hiển nhiên khi bạn hình dung hàm. – metatheorem

+0

Cảnh báo: chức năng này là giao hoán và không được: góc từ hướng + x (1 0 0) đến hướng + y (0 1 0) phải là + 90 °. Ngược lại, từ + y đến + x, phải là -90 °. Nhưng với hàm này, 'f (x, y) == f (y, x)'. Nó không thể nói sự khác biệt vì 's' là không tiêu cực, và sản phẩm chéo đó là thứ duy nhất có thể nói với bạn về hướng giữa hai. –

+0

Nếu nó ở trong 2 chiều, nó sẽ chống giao hoán. Tuy nhiên, trong 3 chiều, đó là (và phải là) giao hoán - bởi vì, trong 3 chiều, bạn cần một véc-tơ thứ ba để xác định chirality. Nếu không có một vector thứ ba để phân biệt giữa các góc độ tích cực và tiêu cực cho hai đầu tiên, bạn không có lý do hình học để thích một hướng hơn khác. – comingstorm

Các vấn đề liên quan