用于围绕另一个点旋转点的功能

时间:2011-09-16 06:22:37

标签: c++ algorithm function math rotation

所以我在这里有一个数学函数,假设返回一个旋转点,并取一个原点,指向旋转(原点)和弧度旋转它。

然而它只以半速旋转(又名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;
} 

3 个答案:

答案 0 :(得分:3)

该功能对我来说没问题。如果您想知道,旋转只是将矢量乘以2D欧几里德旋转矩阵(http://en.wikipedia.org/wiki/Rotation_matrix)。我能想到的唯一错误是对函数使用的一些误解。例如。 2 * PI弧度= 360度,或旋转是逆时针。

答案 1 :(得分:0)

您的代码似乎很好。我们是否同意180°度数是Pi弧度?

答案 2 :(得分:0)

功能很好。但是,您可能想要稍微了解线性代数:基本上计算

return rotation * (point - origin) + origin;

旋转作为矩阵,由对角线上的cos(弧度)和非对角线上的+/- sin(弧度)组成。因此,如果你让线性代数库计算出这个矩阵,那么整个函数就是一个单行;如果你将-origin部分分解出来(记住,线性代数是线性的),它就变成了:

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

其中第二部分是点不变的,可以预先计算。