2010-07-02 17 views
14

Aşağıdaki yaklaşımlardan herhangi biri, bir nokta döndürmek için doğru matematiği kullanır mı? Varsa hangisi doğrudur?Menşei Arasında Bir Nokta Döndürmek İçin Uygun Trigonometri

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 oldukça anladım. Cx ve cy nedir? Ayrıca, POINT türündeki işlevinizi bildirdiniz, ancak bir NOKTA ya da hiçbir şey döndürmez. –

+1

@Brian Hooper: anlamlı değişken isimlerin faydalarını belirtmek için +1;) – Cogwheel

cevap

22

Size angle nasıl tanımladığına bağlı.

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

Ama saat yönünde ölçülür, sonra ikinci doğrudur: o (matematiksel kongre olan) saat yönünün ölçülürse sonra doğru rotasyonu, ilki

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

From Wikipedia

matrisler ise aşağıdaki gibi, θ, açı hesaplanan bir matris ile çarpılan bir vektör olarak yazılır döndürülmesine noktası (X, Y) kullanılarak bir dönüş gerçekleştirmek için: (x ', y') dönmeden sonra noktasının koordinatları ve x için formüller 've y "görülebilir

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

olmak

Bu benim kendi vektör kütüphanesinden elde edilir

alt text

+0

Unutmayın, tipik bir ekran koordinatında çalışıyorsanız, y ekseninizin matematiksel standarttan tersine çevrileceğini unutmayın. + y, yukarı -y) ve bunu hesaba katmanız gerekecek. –

1

..

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

'cosf' ve' sinf' sonuçlarının yarısı kadar trig fonksiyon çağrısının yarısını kullanmak için değişkenlere kaydedebilirsiniz. :) –

+0

iyi yakalama ..... – YeenFei

İlgili konular