【问题标题】:cocos2d help find points on a circlecocos2d 帮助在圆上找点
【发布时间】:2009-04-18 10:47:55
【问题描述】:

我正在尝试在 cocos2d for iphone 上下文中解决一个棘手的数学问题。

基本上我有一个随时间旋转的轮盘。

我想让 Sprite 在某些点(如罗盘序数点 N、S、E、W)锁定在车轮上,并在所有其他点反弹。

我有车轮旋转的图像,只需要解决我可以测试精灵在旋转时是否与圆的正确点处的圆相交的部分。

我认为这个问题的方向是正确的,但我无法理解它。谁能帮忙解释一下?

Best way to find a point on a circle closest to a given point

【问题讨论】:

    标签: iphone math cocos2d-iphone trigonometry


    【解决方案1】:

    如果我理解正确:

    首先检查精灵与轮盘中心之间的距离。这会告诉你精灵是否在轮子的边缘。 (如果没有,什么都不会发生,对吧?)

    然后,求精灵与轮盘“x 轴”的夹角。

    spriteAngle = atan2(sprite.x - rouletteCentre.x, sprite.y - rouletteCentre.y)
    

    您需要找到atan2() 函数的等效项。它通常以弧度返回答案;如果您愿意,您可能需要将其转换为度数或四分之一圈或其他值。

    然后,减去轮盘本身旋转的角度(如果轮盘本身正在旋转,如果没有,那么您已经完成了)。确保您的角度测量值一致。

    actualAngle = spriteAngle - rouletteRotationAngle
    

    请注意,actualAngle 可能在 0-360 度范围之外,您需要使其“环绕”。

    最后,您需要允许可接受的小范围值(例如,98 度到 102 度可能算作“北”)。

    【讨论】:

      【解决方案2】:

      所以你有一个半径为 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) 所在的角度。大多数工具集都具有该功能。看到这里我已经减去了原点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多