2011-10-17 2 views
1

J'essaie de mettre en œuvre un mouvement de projectile pour mon application. Pour commencer, j'essaie de tracer les points sur le projectile. Je suppose que ma vitesse initiale est de 5m/s.exécuter le mouvement du projectile. android

J'ai essayé de calculer ma vitesse initiale en me basant sur l'angle de projection pour la direction x et y respectivement. Mais j'obtiens que c'est vale us NaN (pas un nombre).

Aussi j'essaye de tracer les premiers 10 points sur le chemin de la trajectoire mais je reçois NaN pour eux aussi. Comme le temps retourné maintenant est en milliseconde je le convertis en secondes.

S'il vous plaît suggérer où je me suis trompé.

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); 
    } 

Répondre

2

Je pense que vous voulez Math.cos(angle) et Math.sin(angle), pas Math.acos(angle) ou Math.asin(angle). Assurez-vous également que angle est en radians et non en degrés.

EDIT: En ce qui concerne les "valeurs exponentielles", je suppose que vous ne devriez pas utiliser l'heure actuelle du système dans vos calculs. (Il s'agit du nombre de millisecondes écoulées depuis le début du 1er janvier 1970. Vous devez utiliser le temps écoulé depuis le début de votre programme (long start = System.currentTimeMillis(); avant la boucle, puis soustraire start de now à l'intérieur du boucle), ou (peut-être mieux) un temps simulé entre les points. Quelque chose comme ceci:

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 
} 

Si vous avez besoin d'utiliser le temps réel écoulé, cette boucle ne le fera pas, parce que le temps d'exécution des 10 itérations n'équivaloir à tout changement perceptible dans le temps du système.

+0

cela a résolu une partie de mon problème .., mais je reçois maintenant des valeurs exponentielles pour les points sur la trajectoire ... donc il ne peut pas être tracée sur la toile. – Ruchira

+0

@Ruchira - Voir mon edit. –

+0

Merci! C'est ce que je cherchais ... mais je n'avais aucune idée ... Je vais mettre en œuvre ceci et vous mettre au courant de mes résultats :) – Ruchira

Questions connexes