【问题标题】:implement projectile motion. android实现弹丸运动。安卓
【发布时间】:2011-10-17 04:30:31
【问题描述】:

我正在尝试为我的应用程序实现抛射运动。首先,我尝试在抛射体上绘制点。我假设我的初始速度为 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);
     }

【问题讨论】:

    标签: android game-physics


    【解决方案1】:

    我认为你想要Math.cos(angle)Math.sin(angle),而不是Math.acos(angle)Math.asin(angle)。另外,请确保 angle 的单位是弧度,而不是度数。

    编辑:关于“指数值”,我的猜测是您不应该在计算中使用当前系统时间。 (这是自 1970 年 1 月 1 日开始以来的毫秒数;与您的问题几乎没有关系。)您应该使用从程序启动时经过的时间(循环前的long start = System.currentTimeMillis();,然后减去start来自循环内的now),或者(也许更好)点之间的模拟时间。像这样的:

    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 次迭代的时间不会对系统时间造成任何可察觉的变化。

    【讨论】:

    • 这解决了我的部分问题..,但我现在得到轨迹上点的指数值......所以它不能在画布上绘制。
    • 谢谢!!这就是我一直在寻找的……但我不知道……我会实现它并向您更新我的结果:)
    • 我现在将值作为数字获取,并使用了你建议的第二种方法。我得到了不属于可见画布的点。如何确保画布上的点在范围内?
    • @Ruchira - 您需要按照画布大小与坐标值范围的比率来移动和缩放点。这可以通过对 x 和 y 使用相同的比例来防止失真或独立地对每个变量进行以获得最大的数据传播。
    猜你喜欢
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多