代码之家  ›  专栏  ›  技术社区  ›  Shawn Mclean

C-三角码解释(物理)

  •  2
  • Shawn Mclean  · 技术社区  · 15 年前

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

    ball.velocity=新 vector2((float)math.cos(cannon.rotation) (float)math.sin(cannon.rotation));

    旋转是一个精灵的旋转,在我看来,是弧度。

    为什么他们可以用弧度表示的角度,只找到x的位置,然后同样的事情,找到斜边指向的方向的y的位置。

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

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

    更新:

    我发现物体所在的点A不是(0,0),因为xna使用的是反坐标系。现在我得到的变量是:

    目标点。 鼠标点。

    5 回复  |  直到 15 年前
        1
  •  10
  •   jason    15 年前

    每个角度都对应于单位圆上的一个点(单位圆是以半径为1的原点为中心的唯一圆,即单位圆是满足 x^2 + y^2 = 1 )对应关系如下:给定角度 theta , θ 与点相对应 (cos theta, sin theta) . 为什么 (cosθ,sinθ) 住在单位圈子里?因为每个人最喜欢的身份

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

    就是这样 x = cos theta y = sin theta (x, y) 满足 x^2+y^2=1 以便 (x,y) 在单位圆上。

    要反转这一点,在单位圆上给定一个点,可以使用 inverse tangent (也许你知道 arctan atan 有时 tan -1 )准确地说,给定 (x,y) 在单位圆上,你可以找到对应于 (x,y) 通过计算 theta = arctan(y / x) .

    当然,这里有一些混乱的细节。功能 阿尔坎 无法区分输入之间的差异 (x,y) (-x, -y) 因为 y / x (-y / -x) 有相同的标志。此外, 阿尔坎 无法处理输入 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 是函数 阿尔坎 我在上面提到的,以及 Math.Atan2 是函数 ATAN2 我在上面提到过。

        2
  •  4
  •   manji    15 年前
         |
        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
    

    有关详细信息(&prettier graphs): Wikipedia: Polar coordinate system

        3
  •  2
  •   Toad    15 年前

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

    在这方面,把正典的中间看作圆的中心。然后给定一个角度(佳能的角度),你可以得到它用sin和cos指向的圆上的位置。 如果你认为加农炮在0.0位置居中,那么这个值也是子弹应该到达的方向。

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

        4
  •  2
  •   Kai    15 年前

    不幸的是,这是一个很好的问题,所以不是最好的回答方式。

    我认为与其用文字解释,不如学习一下 参数方程 . 你可以从谷歌搜索“圆参数方程”开始。

    对我来说,这个概念适用的方式是用不同的代码进行实验,直到我理解sin、cos、圆和角度之间的关系。看图片和图片也很有帮助。在那之前,我会读描述,但从来没有牢牢把握解释。

        5
  •  0
  •   Jon Seigel    15 年前

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

    有问题的代码行计算出球的方向的单位向量,我猜想这将从大炮中发射。cos和sin分别提取大炮角度的x和y分量。所以,大炮指向的地方,就是球的发射方向。

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