围绕圆旋转时计算方向

时间:2013-02-07 02:17:31

标签: c++ visual-c++ trigonometry sfml

在尝试使用SFML编写一个包含多个sprite的类时,我最近遇到了一个温和的问题。

我有一个带有多个精灵的容器,每个精灵都可以从容器的中心点偏移刻度,旋转和位置。但是,在尝试旋转容器时遇到了问题。如果我只旋转各个精灵,它将不会考虑它们与容器中心的偏移(对于某些用户界面位,这是一个问题)。经过一些挖掘后,我发现了如何从中心获取角度并计算旋转时应该最终的位置。但是,我不知道如何保持他们的相关旋转相同。基本上,我希望能够做到这一点

enter image description here

旋转后,它看起来像这样

enter image description here

由于SFML如何处理旋转和原点,我不能只将每个精灵的原点设置到容器的中心并旋转。我需要有一些函数来计算它们应该去的位置以及它们应该具有的相对于它们已经具有的方向(所以如果精灵的角度为0,当容器旋转90度时,它应该现在有一个90度的角度。虽然如果它以90°的角度开始,它应该在之后旋转180度,以便保持它相对于容器中其余精灵的旋转)

我用来获取旋转时相对于容器的位置的代码如下

float angle = atan2(p1.y -p2.y, p1.x - p2.x);
float x     = radius * cos(angle);
float y     = radius * sin(angle);

icon.set_position(x + spriteX, y + spriteY);

感谢阅读。我从来没有那么精彩的数学,所以我不知道如何自己解决这个问题。在我开始研究这个问题之前,我甚至不知道cos和sin在哪里x.x任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

你知道如何旋转精灵而不移动它的位置吗?如果是这样,只需将实际精灵本身旋转的角度与上面圆圈上的位置相同。现在,你通过使用sin和cos来旋转位置。您还需要将“方向”设置为与计算的角度相同:float angle = atan2(p1.y - p2.y, p1.x - p2.x);

祝你好运!

-pBlack

答案 1 :(得分:0)

简单,从容器的中心点到精灵创建一个矢量。然后旋转矢量,你就有了新的精灵位置。