2010-07-02 28 views
14

Một trong các cách tiếp cận dưới đây có sử dụng toán học đúng để xoay một điểm không? Nếu vậy, cái nào là đúng?Lượng giác thích hợp để quay một điểm xung quanh nguồn gốc

POINT rotate_point(float cx,float cy,float angle,POINT p) 
{ 
    float s = sin(angle); 
    float c = cos(angle); 

    // translate point back to origin: 
    p.x -= cx; 
    p.y -= cy; 

    // Which One Is Correct: 
    // This? 
    float xnew = p.x * c - p.y * s; 
    float ynew = p.x * s + p.y * c; 
    // Or This? 
    float xnew = p.x * c + p.y * s; 
    float ynew = -p.x * s + p.y * c; 

    // translate point back: 
    p.x = xnew + cx; 
    p.y = ynew + cy; 
} 
+10

I don' t khá hiểu. Cx và cy là gì? Ngoài ra, bạn đã khai báo chức năng của bạn loại POINT, nhưng nó không trả lại một ĐIỂM, hoặc thực sự bất cứ điều gì. –

+1

@Brian Hooper: +1 để chỉ ra lợi ích của các tên biến có ý nghĩa;) – Cogwheel

Trả lời

22

Nó phụ thuộc vào cách bạn định nghĩa angle. Nếu nó được đo ngược chiều kim đồng (đó là quy ước toán học) sau đó xoay đúng là bạn đầu tiên:

// This? 
float xnew = p.x * c - p.y * s; 
float ynew = p.x * s + p.y * c; 

Nhưng nếu nó được đo chiều kim đồng hồ, sau đó thứ hai là đúng:

// Or This? 
float xnew = p.x * c + p.y * s; 
float ynew = -p.x * s + p.y * c; 
27

From Wikipedia

Để thực hiện một vòng quay sử dụng ma trận điểm (x, y) để được luân chuyển được viết dưới dạng một vector, sau đó nhân với một ma trận tính từ góc θ, như vậy:

https://upload.wikimedia.org/math/0/e/d/0ed0d28652a45d730d096a56e2d0d0a3.png

nơi (x ', y') là tọa độ của điểm sau khi luân chuyển, và các công thức cho x 'và y' có thể được xem là

alt text

+0

Đừng quên, nếu bạn đang làm việc trong một không gian tọa độ màn hình điển hình, trục y của bạn sẽ được đảo ngược từ tiêu chuẩn toán học (xuống là + y, lên là -y) và bạn sẽ cần phải tính toán cho điều đó. –

1

này được chiết xuất từ ​​thư viện vector riêng tôi ..

//---------------------------------------------------------------------------------- 
// Returns clockwise-rotated vector, using given angle and centered at vector 
//---------------------------------------------------------------------------------- 
CVector2D CVector2D::RotateVector(float fThetaRadian, const CVector2D& vector) const 
{ 
    // Basically still similar operation with rotation on origin 
    // except we treat given rotation center (vector) as our origin now 
    float fNewX = this->X - vector.X; 
    float fNewY = this->Y - vector.Y; 

    CVector2D vectorRes( cosf(fThetaRadian)* fNewX - sinf(fThetaRadian)* fNewY, 
          sinf(fThetaRadian)* fNewX + cosf(fThetaRadian)* fNewY); 
    vectorRes += vector; 
    return vectorRes; 
} 
+2

Bạn có thể lưu kết quả 'cosf' và' sinf' vào các biến để sử dụng một nửa số cuộc gọi hàm trig. :) –

+0

tốt bắt ..... – YeenFei

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