我试图围绕中心点旋转一个角度 - 标准问题。我已经看过很多关于此的帖子,但我无法让我的实现工作:
void Point::Rotate(const Point Pivot, const float Angle)
{
if (Angle == 0)
return;
float s = sin(Angle);
float c = cos(Angle);
x -= Pivot.x;
y -= Pivot.y;
x = (x * c) - (y * s) + Pivot.x;
y = (x * s) + (y * c) + Pivot.y;
}
这是我的代码,我从众多来源收集的逻辑,例如here和here。
据我所知,它应该有效。然而,当我将它应用于旋转时,例如,点(0,100)在90度(Pi / 2给予函数)周围(0,0),旋转点显然在(-100,-100) );它应该低于100px。
当试图画一个圆圈(36点)时 - 它会形成一个模糊的心形。它看起来像我看到的图表,我认为是在极坐标中 - 我是否需要将我的观点转换为笛卡尔或其他什么?
有人能发现我的代码有什么问题吗?
编辑:对不起,这个函数是Point类的成员函数 - x
和y
是成员变量:/
答案 0 :(得分:2)
您几乎就在那里,但是您在倒数第二行中修改x
,这意味着输入y
计算的坐标值不正确!
相反,请为新的x
和y
使用临时变量,然后在之后添加Pivot
坐标:
double nx = (x * c) - (y * s);
double ny = (x * s) + (y * c);
x = nx + Pivot.x;
y = ny + Pivot.y;