2011-09-16 21 views
1

所以我在這裏有一個數學函數假設返回一個旋轉的點,並採取原點,指向旋轉(原點)和弧度來旋轉它。函數在另一個點上旋轉一個點

然而,它以半速僅旋轉(又名180度運動= 90度旋轉)

sf::Vector2f RotatePoint(sf::Vector2f origin, sf::Vector2f point, float radian) { 
    float s = sin(radian); 
    float c = cos(radian); 

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

    // rotate point 
    float xnew = point.x * c - point.y * s; 
    float ynew = point.x * s + point.y * c; 

    // translate point back to global coords: 
    sf::Vector2f TranslatedPoint; 
    TranslatedPoint.x = xnew + origin.x; 
    TranslatedPoint.y = ynew + origin.y; 

    return TranslatedPoint; 
} 
+0

你爲什麼要在原地修改點參數? – sinelaw

+2

你的問題是什麼? –

+0

你的問題是什麼?結果是什麼? – Simon

回答

3

功能看起來確定我。在你想知道的情況下,旋轉只是將矢量乘以二維歐幾里德旋轉矩陣(http://en.wikipedia.org/wiki/Rotation_matrix)。我能想到的唯一的錯誤是對函數的使用有些誤解。例如。 2 * PI弧度= 360度,或者逆時針旋轉。

0

你的代碼似乎很好。我們是否同意以弧度爲單位的180度爲Pi?

0

該功能沒問題。但是,您可能要新鮮上你的線性代數一點:你基本上計算

return rotation * (point - origin) + origin; 

輪換作爲上關包括在對角線上的COS(弧度)和+/-罪(弧度)的矩陣-diagonals。所以,如果讓線性代數庫計算該矩陣,那麼整個函數就是一個單線程;如果你分解出-origin部分(記住,線性代數是線性的),就變成:

return rotation * point + (- rotation * origin + origin); 

其中第二部分是點不變,並可以預先計算。

+2

「線性代數是線性的。」嘿。 – quasiverse