我的应用程序允许根据鼠标位置围绕中心旋转点。我基本上围绕另一个点旋转点:
void CGlEngineFunctions::RotateAroundPointRad( const POINTFLOAT ¢er, 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....
我觉得存放原件似乎很乱并且使用额外的内存。有没有办法,知道以前的旋转角度和当前旋转角度,我可以某种程度上避免将变换始终应用于原始点并且只是建立在我正在修改的点上?
*中心永远不会改变,直到鼠标上升,这不是问题
由于
答案 0 :(得分:1)
那么,不是存储前一个点,而是存储前一个角度?
也许我可以阻止你这样做。您不需要保留两个浮点数的结构,而是保留一个浮点数(角度),但会增加应用程序的复杂性,但收益很少。
在6个月内重新审视该代码,你会想知道为什么你花了所有时间摆弄三角函数只是为了节省一个浮点数。
我的2¢。尽管如此,这是一个有趣的触发问题:)
答案 1 :(得分:1)
如果从新旋转中减去旧旋转,您将获得一个值,您应该可以使用该值旋转已修改的点。请注意,这需要存储旧的旋转,并且您翻译它们的次数越多,坐标就会越来越准确。不过,它足够接近政府工作。