2010-07-02 23 views
14

¿Alguno de los siguientes enfoques usa las matemáticas correctas para girar un punto? Si es así, ¿cuál es correcto?Trigonometría adecuada para girar un punto alrededor del origen

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 bastante entender. ¿Qué son cx y cy? Además, ha declarado su función de tipo POINT, pero no devuelve un PUNTO, o de hecho nada. –

+1

@Brian Hooper: +1 para señalar los beneficios de nombres de variables significativos;) – Cogwheel

Respuesta

22

Depende de cómo se defina angle. Si se mide la izquierda (que es la convención matemática), entonces la rotación correcta es su primera:

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

Pero si se mide en sentido horario, a continuación, el segundo es correcta:

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

From Wikipedia

Para llevar a cabo una rotación usando matrices el punto (x, y) para ser girado está escrito como un vector, a continuación, multiplicado por una matriz calculado a partir del ángulo, θ, así:

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

donde (x ', y') son las coordenadas del punto después de la rotación, y las fórmulas para x 'e y' pueden ser visto para ser

alt text

+0

No olvide que, si está trabajando en un espacio de coordenadas de pantalla típico, su eje y se invertirá desde el estándar matemático (abajo está + y, up es -y) y tendrá que dar cuenta de eso. –

1

Esto se extrae de mi propia biblioteca de vectores ..

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

Puede guardar los resultados 'cosf' y' sinf' en las variables para usar la mitad de las llamadas a funciones trigonométricas. :) –

+0

buena captura ..... – YeenFei

Cuestiones relacionadas