无法让子弹以正确的角度射击?

时间:2013-07-11 01:22:43

标签: java trigonometry angle projectile

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

我的代码:

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

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

当输入dir为0时,它很好并且向右射击。问题是当我放入90,而不是向上拍摄时,它会向左侧射出一点点。

我对如何解决此问题有任何想法?谢谢!

4 个答案:

答案 0 :(得分:4)

不,你犯了一个经典的错误:Java trig函数需要弧度,而不是度。你不应该通过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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

但更有可能的是,你说你使用0和90. Math.cos()和Math.sin()取弧度值。如果你通过学位,你肯定会有错误的方向。从度数转换为弧度,您的指示可能会更好。

答案 3 :(得分:0)

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

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

在这里,我使用变量名time作为计数器,表明它是衡量子弹被释放后经过的时间量的一种衡量标准。