我试图让一颗子弹以我放入的角度射击时遇到了一些麻烦。我正在使用eclipse与java。
我的代码:
x += (int) (spd * Math.cos(dir));
y -= (int) (spd * Math.sin(dir));`
感觉它不起作用的原因是因为它被转换为int,这可能使它如此不准确。但是为了绘制矩形它需要整数。
当输入dir为0时,它很好并且向右射击。问题是当我放入90,而不是向上拍摄时,它会向左侧射出一点点。
我对如何解决此问题有任何想法?谢谢!
答案 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)
一个问题是,当您为每次迭代增加x
和y
时,舍入错误会传播。一个可能的解决方案是根据计数器计算x
和y
坐标:
x = (int) (time * spd * Math.cos(dir));
y = (int) (time * spd * Math.sin(dir));
在这里,我使用变量名time
作为计数器,表明它是衡量子弹被释放后经过的时间量的一种衡量标准。