осуществить движение снаряда.андроид - PullRequest
1 голос
/ 17 октября 2011

Я пытаюсь реализовать движение снаряда для моего приложения. Для начала я пытаюсь нанести точки на снаряд. Я предполагаю, что моя начальная скорость равна 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);
     }

1 Ответ

2 голосов
/ 17 октября 2011

Я думаю, что вы хотите Math.cos(angle) и Math.sin(angle), а не Math.acos(angle) или Math.asin(angle).Кроме того, убедитесь, что angle указано в радианах, а не в градусах.

РЕДАКТИРОВАТЬ: Что касается "экспоненциальных значений", я предполагаю, что вы не должны использовать текущее системное время в своих расчетах.(Это количество миллисекунд с начала 1 января 1970 года; вряд ли это время, относящееся к вашей проблеме.) Вы должны использовать время, прошедшее с момента запуска вашей программы (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 итераций не будет равносильно заметному изменению системного времени..

...