0

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

我的代码:

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

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

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

关于如何解决这个问题的任何想法?谢谢!

4

4 回答 4

5

不,你犯了一个典型的错误: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

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

于 2013-07-11T01:26:25.963 回答
2

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

于 2013-07-11T01:24:55.707 回答
1

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

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

于 2013-07-11T01:27:34.227 回答
0

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

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

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

于 2013-07-11T01:29:12.297 回答