我正在尝试为我的应用程序实现抛射运动。首先,我正在尝试绘制抛射物上的点。我假设我的初始速度为 5m/s。
我试图分别根据 x 和 y 方向的投影角来计算我的初始速度。但我得到它的值是 NaN(不是数字)。
此外,我正在尝试绘制轨迹路径上的前 10 个点,但我也为它们获取 NaN。由于现在返回的时间以毫秒为单位,我将其转换为秒。
请指出我哪里出错了。
public void drawProjectile(double angle)
{
Log.w(this.getClass().getName(),"drawProjectile called");
mUx = mUi*Math.acos(angle);
mUy = mUi*Math.asin(angle);
Log.d(this.getClass().getName(), "Value of mUx: " + Double.toString(mUx));
Log.d(this.getClass().getName(), "Value of mUy: " + Double.toString(mUy));
for(int i = 1;i<=10;i++)
{
Log.w(this.getClass().getName(),"In plotting points loop");
long now = System.currentTimeMillis();
mX1=(float) (mUx*now)/1000;
mY1 = (float) (mUy*now/1000+(mGravity/2)*now*now/1000000);
Log.d(this.getClass().getName(), "Value of mX1: " + Float.toString(mX1));
Log.d(this.getClass().getName(), "Value of mY1: " + Float.toString(mY1));
mCanvas.drawPoint(mX1, mY1, mPaint);
}
最佳答案
我认为您需要 Math.cos(angle)
和 Math.sin(angle)
,而不是 Math.acos(angle)
或Math.asin(角度)
。此外,请确保 angle
的单位是弧度,而不是度数。
编辑:关于“指数值”,我的猜测是您不应该在计算中使用当前系统时间。 (这是自 1970 年 1 月 1 日开始以来的毫秒数;几乎不是与您的问题相关的时间。)您应该使用从程序启动时起耗时 (long start = System.currentTimeMillis();
在循环之前,然后从循环内的 now
中减去 start
,或者(也许更好)点之间的模拟时间。像这样:
float now = 0f;
for(int i = 1; i <= 10; i++) {
Log.w(this.getClass().getName(),"In plotting points loop");
mX1 = mUx*now;
mY1 = mUy*now + (mGravity/2)*now*now;
Log.d(this.getClass().getName(), "Value of mX1: " + mX1);
Log.d(this.getClass().getName(), "Value of mY1: " + mY1);
mCanvas.drawPoint(mX1, mY1, mPaint);
now += 1f; // or whatever time increment you want
}
如果您需要使用实际耗时,则此循环不会执行此操作,因为执行 10 次迭代的时间不会达到系统时间的任何可察觉变化。
关于android - 实现弹丸运动。安卓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7789393/