2014-10-19 193 views
0

我想通过一个角度标准问题来围绕中心点旋转一个点。我见过很多关于这个职位,但我不能让我的执行工作:围绕另一点旋转一个点

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; 
    } 

这是我的代码,我已经从众多的来源收集的逻辑,例如herehere

据我所知,它应该工作。然而,当我将它应用于旋转时,例如,在(0,0)周围将点(0,100)旋转90度(Pi/2被赋予该函数),旋转点显然在(-100,-100 ); 100px以下应该是。

当试图画一个圆(36分) - 它创建了一个模糊的心脏形状。它看起来像我看到的图形,我认为是在极坐标系中 - 我是否需要将我的观点转换为笛卡儿或其他?

任何人都可以找出什么毛病我的代码?

编辑:对不起,这个函数是一个成员函数的Point类 - xy是成员变量:/

+0

什么样的价值'x'在最后一行所使用的? – 2014-10-19 10:46:55

+0

@OliverCharleswoth感谢您指出,编辑 – hnefatl 2014-10-19 10:49:04

+0

我想你已经错过了我的观点!最后一行使用“x”值;该值在哪里计算? – 2014-10-19 10:49:52

回答

2

就快,但你在接下来的-TO-修改x最后一行,这意味着输入到y计算中的坐标值不正确!

相反,使用临时变量的新xy然后添加Pivot坐标上算账:

double nx = (x * c) - (y * s); 
double ny = (x * s) + (y * c); 

x = nx + Pivot.x; 
y = ny + Pivot.y; 
+0

Argh。谢谢,这是我的一个非常愚蠢的错误:/ – hnefatl 2014-10-19 10:54:46