我正试图解决一个棘手的数学问题,在iphone上下文的cocos2d中。
基本上我有一个随着时间推移而旋转的轮盘。
我希望在某些点上有一个Sprite闩锁(如指南针序数点N,S,E,W),并在所有其他点反弹。
我有车轮旋转的图像,只需要解决我可以测试的部分是否在旋转时测量精灵是否与圆上正确点处的圆相交。
我认为这个问题正朝着正确的方向发展,但我无法理解它。任何人都可以帮忙解释一下吗?
Best way to find a point on a circle closest to a given point
答案 0 :(得分:1)
所以你有一个半径为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)所在的角度。大多数工具集都具有该功能。看到我在这里减去了原点。
答案 1 :(得分:1)
如果我理解正确:
首先检查精灵与轮盘赌中心之间的距离。这将告诉你精灵是否在方向盘的边缘。 (如果没有,没有任何反应,对吗?)
然后,从轮盘赌轮的“x轴”找到精灵所做的角度。
spriteAngle = atan2(sprite.x - rouletteCentre.x, sprite.y - rouletteCentre.y)
您需要找到atan2()
函数的等价物。它通常以弧度返回答案;如果您愿意,您可能希望将其转换为度数或四分之一转。
然后,减去轮盘转轮本身旋转的角度(如果轮子本身在旋转,如果没有,那么你已经完成了)。确保角度测量一致。
actualAngle = spriteAngle - rouletteRotationAngle
请注意,actualAngle可能超出0-360度范围,您需要将其“环绕”。
最后,您需要允许一小部分值可接受(例如,98度到102可能算作“北”)。