所以我在这里有一个数学函数,假设返回一个旋转点,并取一个原点,指向旋转(原点)和弧度旋转它。
然而它只以半速旋转(又名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 :(得分: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 );
其中第二部分是点不变的,可以预先计算。