【问题标题】:C# -Trigonometric code explaination (Physics)C# - 三角函数代码解释(物理)
【发布时间】:2010-12-06 17:14:55
【问题描述】:

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

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

ball.rotation 是我认为的精灵的旋转,弧度。

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

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

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

更新:

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

对象点。 鼠标点。

【问题讨论】:

    标签: c# xna physics trigonometry


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      每个角度对应单位圆上的一个点(单位圆是以原点为圆心,半径为 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)在单位圆上。

      为了扭转这种情况,给定单位圆上的一个点,您可以使用inverse tangent(您可能知道为arctanatan,有时是tan-1)。准确地说,给定单位圆上的(x, y),通过计算theta = arctan(y / x),就可以找到(x, y)对应的角度。

      当然,这里有一些乱七八糟的细节。函数arctan 无法区分输入(x, y)(-x, -y),因为y / x(-y / -x) 具有相同的符号。此外,arctan 无法处理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.Atan是我上面提到的函数arctanMath.Atan2是我上面提到的函数atan2

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案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
          

          更多信息(和更漂亮的图表):Wikipedia: Polar coordinate system

          【讨论】:

            【解决方案5】:

            如果你不熟悉三角,你的问题很难解释。

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

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

            【讨论】:

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