如何沿圆移动点?

5
我希望用圆的半径和移动角度让精灵以圆周运动的方式移动。
我知道例如精灵正在以半径10的圆上运动,其当前位置为(387,38),角度为28度。现在我想让它沿圆周周长移动100像素。
p1 = x&y coordinate, known (387,38) in example with movingangle 28 degrees
r = radius, known (10 in example)
l = distance to move along bend, known (100px in example)
p2 = new point, what is this x and y value?

我有一个可行的解决方案,但我不太喜欢它。在我看来,这种方法有些不合理,需要的计算量也比我认为的要多。它的工作原理是先使用p1计算出中心点,然后再反过来做同样的事情,以获得p2(使用余弦和正弦)。我相信应该有一种更快的方法,但我找不到任何人正好这样做。
我标记cocos2d的原因是因为那是我正在使用的框架,有时游戏框架提供的函数可以帮助进行三角函数计算。

就我个人而言,你所描述的方式是我会采用的方式。 - andrew cooke
在我的列车运动演示项目中,我就是这样做的,即将线性速度转换为角速度,以便围绕给定中心点和半径的曲线旋转铁路车辆。您可以从此处获取该项目:http://www.learn-cocos2d.com/2012/07/starting-point-train-game-freeform-tracks/ - CodeSmile
3个回答

6

试试这个:

a1 = 28*(π/180)
cen.x = p1.x - r*SIN(a1)
cen.y = p2.y - r*COS(a1)
a2 = a1 + l/r
p2.x = cen.x + r*SIN(a2)
p2.y = cen.y + r*COS(a2)

这没有比这更简单的了。从p1移动到圆心,然后再移动到p2。


我觉得我尝试过类似的东西,我会试一下看看效果如何。谢谢。 - Jonathan
1
这有什么帮助呢?它假设你在原点处。如果不是的话,你需要计算出自己所在的位置,也就是计算中心点。而问题明确要求避免计算中心点。 - andrew cooke
这是正确的,它会做圆周运动,但不在正确的位置上。 - Jonathan
@MrAzulay - 需要知道或计算原点。 - John Alexiou

3

通过锚点的魔力,您可以以非常简单的方式完成它 =) 对于任何节点的所有变换都是相对于其锚点完成的。旋转也是一种变换。因此,您可以像这样做

CGFloat anchorY = neededRadius / spriteHeight;
[yourSprite setAnchorPoint:ccp(0.5f, anchorY)];
[yourSprite setPosition:neededPosition]; //remember that position is also for anchor point
[self addChild: yourSprite];
[yourSprite runAction:anyRotateAction]; // i mean, CCRotateBy or CCRotateTo

不要改变锚点,而是将精灵添加到普通的CCNode中,并通过位置将其偏移,使CCNode成为圆形的中心。然后,您可以更改CCNode的旋转以旋转精灵。这样更容易,可以确保例如精灵碰撞仍然很简单。 - CodeSmile

2

计算原点,然后使用极坐标沿着圆移动点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接