2

这段代码取自使用 XNA 框架构建的游戏。我想从三角和物理方面解释它是如何工作的。

ball.velocity = new Vector2((float)Math.Cos(cannon.rotation), (float)Math.Sin(cannon.rotation));

ball.rotation 是我应该想到的精灵的旋转,弧度。

为什么他们只能使用弧度角来找到 x 位置,然后用同样的方法来找到斜边指向的方向的 y 位置。

我问这个的原因。我想了解一下这个框架如何进行三角计算。我试图让精灵转向鼠标所在的方向,即:x 和 y 是已知的,我只需要角度。

所以这里有2个问题。解释上面的代码并将精灵指向已知点的方向。

更新:

我发现对象所在的点a不是(0,0),因为xna使用逆坐标系。所以现在我拥有的变量是:

对象点。鼠标点。

4

5 回答 5

10

每个角度对应于单位圆上的一个点(单位圆是以原点为圆心,半径为 1 的唯一圆;即单位圆是满足 的点的集合x^2 + y^2 = 1)。对应关系如下:给定角度thetatheta对应点(cos theta, sin theta)。为什么(cos theta, sin theta)住在单位圆上?因为大家最喜欢的身份

cos^2 theta + sin^2 theta = 1.

x = cos thetay = sin theta,该点(x, y)满足x^2 + y^2 = 1,因此(x, y)在单位圆上。

为了扭转这一点,给定单位圆上的一个点,您可以通过使用反正切(也许您知道arctanatan有时称为tan-1)来找到角度。准确地说,(x, y)在单位圆上给定,您可以(x, y)通过计算找到对应的角度theta = arctan(y / x)

当然,这里也有一些乱七八糟的细节。该函数arctan无法区分输入之间的差异(x, y)(-x, -y)因为y / x(-y / -x)具有相同的符号。此外,arctan无法处理 where 的输入x = 0。因此,我们通常通过定义atan2将为我们处理这些杂乱细节的函数来处理这些问题

atan2(y, x) = arctan(y / x)       if x > 0
            = pi + arctan(y / x)  if y >= 0, x < 0
            = -pi + arctan(y / x) if y < 0, x < 0
            = pi / 2              if y > 0, x = 0
            = -pi / 2             if y < 0, x = 0
            = NaN                 if y = 0, x = 0

在 C# 中,Math.Atanarctan我上面提到Math.Atan2的函数,也是我上面提到的函数atan2

于 2009-10-14T15:10:50.477 回答
4
     |
    y.-----* P
     |    /|
     |   / |
     | r/  |
     | / a |
     |/)___.__
    O          x

    we have:

    a = angle in radians
    O: origin
    P: known point
    r: distince between O & P

    to calculate x, y:

         x = r*cos(a)
         y = r*sin(a)

(in your example : r = 1, a = cannon.rotation)

现在,如果你有 x, y 并且你想要一个:

if x!= 0  a = atan(y/x)
otherwise a = sign(y)*Pi/2

更多信息(和更漂亮的图表):维基百科:极坐标系

于 2009-10-14T15:18:30.600 回答
2

你可以看到 cos 和 sin 返回一个圆上的点。

在这方面,将佳能的中间视为圆的中心。然后给定一个角度(佳能的角度),您可以得到它与 sin 和 cos 所指向的圆上的位置。如果您认为大炮以 0,0 位置为中心,那么这个值也是子弹应该行进的方向。

答案 2:如果你知道 x 和 y 并且你需要知道角度..你需要 atan 函数,它返回从三角形的斜边形成的角度,其中一点是 0,0,另一点是 x,y点和一点是成 90 度角的点

于 2009-10-14T15:09:56.773 回答
2

可悲的是,这是一个很好的问题,因为 SO 不是最好的回答格式。

与其用文字解释,我认为学习参数方程会很有帮助。您可以先在 Google 中搜索“圆参数方程”。

这个概念对我来说很有效的方式是尝试不同的代码片段,直到我理解了 sin、cos、圆和角度之间的关系。看到图片和图像也有很大帮助。在此之前,我会阅读描述,但永远无法牢牢掌握解释。

于 2009-10-14T15:16:14.780 回答
0

如果您不熟悉 trig,您的问题很难解释。

有问题的代码行计算了球方向的单位矢量,我认为它会从大炮中发射。事物的 Cos 和 Sin 部分分别提取了大炮角度的 X 和 Y 分量。所以,大炮指向的地方,就是球的射向。

这有点误导,因为结果很可能只是一个方向,而不是实际速度。我会假设在该向量下方有一条线将该向量乘以一个常数,以使球具有最终的移动速度。

于 2009-10-14T15:23:38.320 回答