2011-09-16 22 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