我正在尝试在 cocos2d for iphone 上下文中解决一个棘手的数学问题。
基本上我有一个随时间旋转的轮盘。
我想在某些点(如罗盘序数点 N、S、E、W)将 Sprite 锁在车轮上,并在所有其他点反弹。
我有轮子旋转的图像,只需要解决我可以测试精灵在旋转时是否在圆的正确点与圆相交的部分。
我认为这个问题正朝着正确的方向发展,但我无法理解它。谁能帮忙解释一下?
我正在尝试在 cocos2d for iphone 上下文中解决一个棘手的数学问题。
基本上我有一个随时间旋转的轮盘。
我想在某些点(如罗盘序数点 N、S、E、W)将 Sprite 锁在车轮上,并在所有其他点反弹。
我有轮子旋转的图像,只需要解决我可以测试精灵在旋转时是否在圆的正确点与圆相交的部分。
我认为这个问题正朝着正确的方向发展,但我无法理解它。谁能帮忙解释一下?
所以你有一个半径为 r 的圆,中心为 (x0,y0)。
一个点位于圆外,坐标为 (x,y)。您的问题是在圆上找到最接近点 (x,y) 的点。
解决方案很简单。点到圆的最接近投影是通过简单的缩放来完成的。因此,
d = sqrt((x-x0)^2 + (y-y0)^2)
xp = x0 + (x - x0)*r/d
yp = y0 + (y - y0)*r/d
新点 (xp,yp) 将位于圆本身上。老实说,你最好在极坐标中工作,原点在圆的中心。然后一切都会变得容易得多。
您的下一个问题将是它在圆圈上的哪个位置?不要忘记圆上的指南针的点会随着时间而旋转。atan2 函数将为您提供点 (xp-x0,yp-y0) 所在的角度。大多数工具集都将具有该功能。看到我在这里减去了原点。
如果我理解正确:
首先检查精灵与轮盘中心之间的距离。这会告诉你精灵是否在轮子的边缘。(如果没有,什么都不会发生,对吧?)
然后,找出精灵与轮盘赌的“x 轴”形成的角度。
spriteAngle = atan2(sprite.x - rouletteCentre.x, sprite.y - rouletteCentre.y)
您需要找到该atan2()
功能的等价物。它通常以弧度返回答案;如果您愿意,您可能希望将其转换为度数或四分之一圈或其他东西。
然后,减去轮盘本身旋转的角度(如果轮盘本身正在旋转,如果没有,那么你已经完成了)。确保您的角度测量是一致的。
actualAngle = spriteAngle - rouletteRotationAngle
请注意,actualAngle 可能在 0-360 度范围之外,您需要使其“环绕”。
最后,您将希望允许小范围的值作为可接受的值(例如,98 度到 102 度可能算作“北”)。