我的应用程序允许基于鼠标位置围绕中心旋转点。我基本上是围绕这样的另一点旋转点:

void CGlEngineFunctions::RotateAroundPointRad( const POINTFLOAT &center, const POINTFLOAT &in, POINTFLOAT &out, float angle )
{
 //x' = cos(theta)*x - sin(theta)*y
 //y' = sin(theta)*x + cos(theta)*y

 POINTFLOAT subtr;
 subtr.x = in.x - center.x;
 subtr.y = in.y - center.y;

 out.x = cos(angle)*subtr.x - sin(angle)*subtr.y;
 out.y = sin(angle)*subtr.x + cos(angle)*subtr.y;

 out.x += center.x;
 out.y += center.y;
}


其中POINTFLOAT只是

struct POINTFLOAT {
float x;
float y;
}


问题是这些点需要在mousemove上进行更新。我正在寻找一种无需执行以下操作的方法:

Store original points
Rotate Original points
Copy result
Show Result
Rotate Original points
Copy result
Show Result....


我觉得存储原件似乎很麻烦,并占用了额外的内存。有没有一种方法,知道先前的旋转角度和当前的旋转角度,我可以以某种方式避免一直将变换应用于原始点,而仅建立在我要修改的点上?

*直到鼠标移到上方,中心才会改变,所以这不是问题

谢谢

最佳答案

如果从新旋转点中减去旧旋转点,则将获得一个值,可以用来旋转已经修改的点。请注意,这需要存储旧的旋转,并且随着旋转的越多,坐标的精度将越来越低。不过,它足够接近政府工作。

10-07 20:39