2009-10-14 70 views
2

这段代码取自用XNA框架构建的游戏。我想从trig和物理角度解释它是如何工作的。C# - 三角代码解释(物理)

ball.velocity =新 Vector2((浮点)Math.Cos(cannon.rotation) (浮点)Math.Sin(cannon.rotation));

ball.rotation是一个精灵在我应该思考的旋转,弧度。

为什么他们可以使用弧度角仅找到x位置,然后找到斜边指向的方向的y位置。

我之所以问这个问题的原因。我想了解这个框架是如何计算trig的。我试图让一个精灵转向鼠标所在的方向,那就是:x和y已知,我只需要角度。

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

更新:

我发现的一个点,其目的在于在不是(0,0),因为使用XNA逆坐标系。所以现在我有的变量是这些:

点的对象。 点的鼠标。

回答

10

每个角度对应于单位圆上的一个点(单位圆是以半径1为原点居中的唯一圆;即,单位圆是满足x^2 + y^2 = 1的点的集合)。对应关系如下:给定角度theta,theta对应点(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以上。

2

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

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

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

2

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

而是在文本解释的,我认为这将有助于了解参数方程。您可以先在Google中搜索“circle parametric equation”。

这个概念点击我的方式是试验不同的代码片段,直到我理解了罪,角,圆和角度之间的关系。看到图片和图片也有很大帮助。在此之前,我会阅读描述,但永远无法牢牢把握解释。现在

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

0

什么你问是难以解释的如果你不熟悉trig。

有问题的代码行计算球的方向的单位向量,我猜想会从大炮中发射。 Cos和Sin部分分别提取大炮角度的X和Y分量。所以,大炮指向哪里,这就是球发射的方向。

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