2010-07-02 8 views
14

Uno degli approcci seguenti utilizza la matematica corretta per la rotazione di un punto? Se sì, quale è corretto?Trigonometria corretta per la rotazione di un punto intorno all'origine

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 abbastanza comprensibile. Cosa sono cx e cy? Inoltre, hai dichiarato la tua funzione di tipo POINT, ma non restituisce un PUNTO, o anzi nulla. –

+1

@Brian Hooper: +1 per indicare i vantaggi di nomi di variabili significative;) – Cogwheel

risposta

22

Dipende da come si definisce angle. Se si misura in senso antiorario (che è la convenzione matematica), allora la rotazione corretta è la vostra prima:

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

Ma se viene misurato in senso orario, poi il secondo è corretta:

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

From Wikipedia

Per effettuare una rotazione utilizzando matrici il punto (x, y) per far ruotare è scritto come un vettore, poi moltiplicato per una matrice calcolata dall'angolo, θ, in questo modo:

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

dove (x ', y') sono le coordinate del punto dopo la rotazione, e le formule per x 'ey' possono essere visti come

alt text

+0

Non dimenticare che se stai lavorando in uno spazio di coordinate tipico dello schermo, il tuo asse y sarà invertito rispetto allo standard matematico (giù è + y, su è -y) e dovrai tenerne conto. –

1

Questo viene estratto dalla mia libreria di illustrazione ..

//---------------------------------------------------------------------------------- 
// 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

È possibile salvare i risultati di 'cosf' e' sinf' in variabili per utilizzare la metà delle chiamate di funzione trigonometrica. :) –

+0

buona cattura ..... – YeenFei