【问题标题】:Can't get bullets to shoot at correct angle?无法让子弹以正确的角度射击?
【发布时间】:2013-07-11 01:22:42
【问题描述】:

我在尝试让子弹以我放入的角度发射时遇到了一些麻烦。我正在使用 java 的 eclipse。

我的代码:

x += (int) (spd * Math.cos(dir));
y -= (int) (spd * Math.sin(dir));`

感觉它不起作用的原因是因为它被强制转换为 int,这可能使它变得如此不准确。但是为了让它绘制矩形,它需要整数。

当输入 dir 为 0 时,它很好并且向右射击。问题是当我输入 90 时,它不是直接向上射击,而是向左一点。

知道如何解决这个问题吗?谢谢!

【问题讨论】:

    标签: java trigonometry angle projectile


    【解决方案1】:

    不,您犯了一个典型的错误:Java 三角函数需要弧度,而不是度数。你应该通过的不是90;它是 π/2.0。

    因此,请务必通过乘以 π/180.0 将角度以度为单位转换为弧度。

    这适用于 C、C++、Java、JavaScript、C# 以及我所知道的所有其他语言。我无法命名使用度数作为角度的单一语言。

    double radians = dir*Math.PI/180.0;
    x += (int)(spd*Math.cos(dir));
    y -= (int) (spd * Math.sin(dir));`  // I don't know why you do this.  Funny left-handed coordinate system.
    

    速度是速度矢量的大小。所写的方程仅将速度表示为 (vx, vy) 分量。

    如果你想要位移,你必须乘以一个时间步长:

    vx = speed*Math.cos(angle);
    vy = speed*Math.sin(angle);
    dx = vx*dt;
    dy = vy*dt;
    x += dx;  // movement in x-direction after dt time w/ constant velocity
    y += dy;  // movement in y-direction after dt time w/ constant velocity
    

    如果涉及加速度(例如重力),您应该以相同的方式计算速度随时间的变化。

    【讨论】:

    • 哦,是的,那也是!完全错过了那部分。
    • 我认为这是问题的真正根源。
    • 好吧,我不确定如何解释发生了什么,但我这样做了:dir = dir * Math.PI / 2.0;但真正奇怪的是子弹似乎相互环绕。
    • 实际上我通过将它放在构造函数类中解决了这个奇怪的问题,但它只在 4 个方向上触发。编辑:实际上(再次)你的权利它有效我只是放了 pi/2.0 这是我首先看到的不是 180。对不起,但谢谢你的帮助!
    • 90 度 = π/2.0 弧度。我不知道你在做什么。
    【解决方案2】:

    将坐标保持为浮点数,仅在调用绘图方法时将它们转换(或将它们转换为另一个变量)。您需要为下一次迭代保留精确值。

    【讨论】:

    • 嗯,我所做的就是取出 (int)s 并将其放入 get 方法中,但它仍然只向大约 8-9 个不同的方向射击。
    【解决方案3】:

    是的,您需要将角度保持为浮动。

    但更有可能的是,您说您使用的是 0 和 90。Math.cos() 和 Math.sin() 采用弧度值。如果你通过学位,你肯定会让事情朝着错误的方向发展。将度数转换为弧度,您的方向可能会更好。

    【讨论】:

      【解决方案4】:

      一个问题是,当您为每次迭代增加 xy 时,会传播舍入错误。一种可能的解决方案是根据计数器计算 xy 坐标:

      x = (int) (time * spd * Math.cos(dir));
      y = (int) (time * spd * Math.sin(dir));
      

      在这里,我使用变量名称time 作为计数器来表示它是从子弹发射后经过的时间量的某种度量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-17
        • 1970-01-01
        • 1970-01-01
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多