2011-01-24 44 views
39

Tôi có véc tơ euclide a ngồi ở tọa độ (0, 1). Tôi muốn xoay a 90 độ (chiều kim đồng hồ) quanh nguồn gốc: (0, 0).Xoay vector Euclide 2D

Nếu tôi có một sự hiểu biết đúng về cách thức hoạt động này, tọa độ kết quả (x, y) sau khi xoay phải là (1, 0). Nếu tôi đã xoay nó 45 độ (vẫn theo chiều kim đồng hồ) thay vào đó, tôi đã mong đợi các tọa độ kết quả là (0.707, 0.707).

theta = deg2rad(angle); 

cs = cos(theta); 
sn = sin(theta); 

x = x * cs - y * sn; 
y = x * sn + y * cs; 

Sử dụng đoạn mã trên, với một giá trị angle của 90,0 độ, tọa độ quả là: (-1, 1). Và tôi rất bối rối. Các ví dụ được thấy trong các liên kết sau đại diện cho cùng một công thức được hiển thị ở trên chắc chắn?

Tôi đã làm gì sai? Hoặc tôi đã hiểu sai cách một vectơ được xoay?

+0

Các loại của tất cả các biến là gì? –

+0

tăng gấp đôi, nhưng câu trả lời là đủ đơn giản, nhờ Caspar. – dcousens

+0

Ngoài ra - không phải là ngược chiều kim đồng hồ này? –

Trả lời

63

bạn nên loại bỏ các vars từ chức năng:

x = x * cs - y * sn; // now x is something different than original vector x 
y = x * sn + y * cs; 

tạo tọa độ mới trở nên, để tránh tính x trước khi nó đạt đến dòng thứ hai:

px = x * cs - y * sn; 
py = x * sn + y * cs; 
+3

Ôi trời ơi, tôi cần đôi mắt mới ... một thứ gì đó rất rõ ràng ... Cảm ơn bạn đời (làm việc một người đẹp, 2 giờ sau ... haha) – dcousens

+0

khi bạn thực hiện x = x * cs - y * sn ;, nó cho một giá trị khác với x trong y = x * sn + y * cs, vì vậy x sẽ "trật bánh" –

+2

@Daniel: Chữ x trong câu lệnh thứ hai đã có giá trị thay đổi theo thời gian bạn sử dụng để tính giá trị cho y . Vì vậy, về cơ bản, bạn tính toán tọa độ x để quay (0,1) (là -1). Sau đó, bạn lưu trữ điều này trong phối hợp x cho (-1,1) và sau đó bạn tính toán tọa độ y để quay (-1,1) (mà thực sự là -1, vì vậy tôi không chắc chắn làm thế nào bạn có (-1 , 1) thay vì (-1, -1)). Câu trả lời đúng, bằng cách này, không phải là (1,0), đó là (-1,0) kể từ khi xoay theo góc tích cực là ngược chiều kim đồng hồ khi xem từ trên cao. –

68

luân phiên một vector 90 độ là đặc biệt đơn giản.

(x, y) xoay 90 độ xung quanh (0, 0)(-y, x).

Nếu bạn muốn xoay theo chiều kim đồng hồ, bạn chỉ cần thực hiện theo cách khác xung quanh, nhận (y, -x).

+14

+1. Đối với bất kỳ ai quay một vector 2D cho màn hình máy tính: câu trả lời này giả định trục y được trỏ lên như trong toán học. Nếu nó là điểm xuống như trên màn hình máy tính, sau đó theo chiều kim đồng hồ và ngược chiều kim đồng hồ được đảo ngược. '(-y, x)' là chiều kim đồng hồ và '(y, -x)' là ngược chiều kim đồng hồ. –

5

Bạn đang tính toán phần y của tọa độ mới dựa trên phần x mới 'của tọa độ mới. Về cơ bản điều này có nghĩa tính của bạn kết quả mới về sản lượng mới ...

Cố gắng viết lại về đầu vào và đầu ra:

vector2<double> multiply(vector2<double> input, double cs, double sn) { 
    vector2<double> result; 
    result.x = input.x * cs - input.y * sn; 
    result.y = input.x * sn + input.y * cs; 
    return result; 
} 

Sau đó, bạn có thể làm điều này:

vector2<double> input(0,1); 
vector2<double> transformed = multiply(input, cs, sn); 

Lưu ý cách chọn tên riêng cho các biến của bạn có thể tránh được vấn đề này hoàn toàn!

5

Âm thanh dễ dàng hơn để làm với các lớp học tiêu chuẩn:

std::complex<double> vecA(0,1); 
std::complex<double> i(0,1); // 90 degrees 
std::complex<double> r45(sqrt(2.0),sqrt(2.0)); 
vecA *= i; 
vecA *= r45; 

Vector xoay là một tập hợp con của phép nhân phức tạp ..

+0

lưu ý rằng phương pháp này không cần tính toán sin hoặc cosines – jeffythedragonslayer

+1

TBH đó là vì 'r45' được tính toán trước. – MSalters

17

Rotate 90 degress khoảng 0,0:

x' = -y 
y' = x 

Xoay 90 độ cong xung quanh px, py:

x' = -(y - py) + px 
y' = (x - px) + py 
Các vấn đề liên quan