2010-07-02 9 views
14

क्या निम्न में से कोई भी दृष्टिकोण किसी बिंदु को घूर्णन के लिए सही गणित का उपयोग करता है? यदि हां, तो कौन सा सही है?उत्पत्ति के आसपास एक बिंदु घूर्णन के लिए उचित त्रिकोणमिति

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

मैं डॉन ' काफी समझ में नहीं आता है। सीएक्स और साइ क्या हैं? साथ ही, आपने अपना काम POINT प्रकार घोषित कर दिया है, लेकिन यह POINT, या वास्तव में कुछ भी वापस नहीं करता है। –

+1

@ ब्रायन हूपर: सार्थक परिवर्तनीय नामों के लाभों को इंगित करने के लिए +1;) – Cogwheel

उत्तर

22

यह कैसे आप angle परिभाषित पर निर्भर करता है।

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

From Wikipedia

मैट्रिक्स बिंदु (एक्स, वाई) घुमाया जा करने के लिए एक वेक्टर, तो एक मैट्रिक्स कोण से गणना की, θ, इसलिए तरह से गुणा रूप में लिखा है का उपयोग करते हुए एक रोटेशन बाहर ले जाने के लिए:

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

जहां (एक्स ', वाई') रोटेशन के बाद बिंदु के समन्वय, और एक्स के लिए फार्मूले हैं 'और वाई' देखा जा सकता है होना करने के लिए

alt text

+0

भूलें, कि यदि आप एक ठेठ स्क्रीन समन्वय स्थान में काम कर रहे हैं तो आपके वाई अक्ष गणितीय मानक से उलटा हो जाएगा (नीचे है + वाई, ऊपर है) और आपको इसके लिए खाते की आवश्यकता होगी। –

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' और' sinf' परिणामों को आधे से अधिक ट्रिगर फ़ंक्शन कॉल का उपयोग करने के लिए चरों में सहेज सकते हैं। :) –

+0

अच्छी पकड़ ..... – YeenFei

संबंधित मुद्दे