我正在尝试为我的应用程序实现一个射弹动作。首先,我试图绘制射弹上的点。我假设我的初始速度为5米/秒。
我试图分别根据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);
}
答案 0 :(得分:2)
我认为你想要Math.cos(angle)
和Math.sin(angle)
,而不是Math.acos(angle)
或Math.asin(angle)
。另外,请确保angle
以弧度为单位,而不是度数。
编辑:关于“指数值”,我的猜测是你不应该在计算中使用当前的系统时间。 (这是自1970年1月1日开始以来的毫秒数;几乎没有时间与您的问题相关。)您应该使用从程序开始之前经过的时间(long start = System.currentTimeMillis();
在循环之前,然后减去{ {1}}来自循环内的start
,或者(或许更好)点之间的模拟时间。像这样:
now
如果你需要使用实际经过的时间,那么这个循环不会这样做,因为执行10次迭代的时间不会等于系统时间的任何可察觉的变化。