2011-01-27 6 views
1

J'ai déjà posé cette question auparavant, mais je pense que je l'ai mal formulée et que je n'ai donc reçu aucune réponse. J'essaie de faire une application pour Android qui dessine le chemin d'un objet en mouvement de projectile. J'ai les équations pour faire ce travail, mais pour une raison quelconque, quand je cours mon programme, tout ce que je reçois est de 2 lignes connectées au lieu de l'arc approprié. J'ai regardé cela pendant des heures, quelqu'un peut-il me dire ce qui se passe et ce que je dois faire pour le réparer? Voici mon code:Dessin d'un chemin de mouvement de projectile sous Android

float constx = 400; 
    float consty = 375; 
    float deltx = (float) ProjectileMotionDrawingActivity.dx; 
    float delty = (float) ProjectileMotionDrawingActivity.dy; 
    float maxDrawingHeight; 
    float totwidth; 
    float totheight; 
    float starty; 
    float ydist; 
    float cx = canvas.getWidth()/2; 
    float cy = 210; 
    boolean limiter; 

    float vin = (float) ProjectileMotionDrawingActivity.vin; 
    float vxd = (float) ProjectileMotionDrawingActivity.vxd; 
    float acc = (float) ProjectileMotionDrawingActivity.ac; 

    float scaleda; 
    float scaledv; 
    float scaledvi; 



    //Set background color and get paint ready 
    canvas.drawColor(Color.WHITE); 
    Paint linePaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    linePaint.setColor(Color.BLACK); 

    //Define maxDrawingHeight 
    if(delty >= 0){ 
     maxDrawingHeight = (float) ProjectileMotionDrawingActivity.mhe; 
    }else{ 
     maxDrawingHeight = (float) (ProjectileMotionDrawingActivity.mhe + Math.abs(delty)); 
    } 

    // Determine whether x or y is limiting factor (true=x, false =y) (For future use if needed) 
    if(Math.abs(maxDrawingHeight/deltx) >=consty/constx){ 
     limiter = false; 
    }else{ 
     limiter = true; 
    } 

    //set width and height of projectile motion 
    if(limiter){ 
     totwidth = constx; 
     totheight = constx*maxDrawingHeight/deltx; 
     scaleda = acc*constx/deltx; 
     scaledvi = vin*constx/deltx; 
     scaledv = vxd*constx/deltx; 

    }else{ 
     totheight = consty; 
     totwidth = consty*deltx/maxDrawingHeight; 
     scaleda = acc*consty/maxDrawingHeight; 
     scaledvi = vin*consty/maxDrawingHeight; 
     scaledv = vxd*consty/maxDrawingHeight; 
    } 

    //height of cliff 
    ydist = delty*totheight/maxDrawingHeight; 

    //start height 
    starty = cy+(totheight/2); 

    canvas.drawLine(0, starty, totwidth+35, starty, linePaint); 
    canvas.drawLine(totwidth+35, starty, totwidth+35, starty-ydist, linePaint); 
    canvas.drawLine(totwidth+35, starty-ydist, 2*cx, starty-ydist, linePaint); 

    //Parabola 

    float porabx = 35; 
    float poraby = starty; 
    float porabx2 = 35 + totwidth/50; 
    float poraby2 = (float) (starty - scaledvi*porabx2/scaledv-.5*scaleda*Math.pow(porabx2/scaledv,2)); 

    for(int i=0;i<50;i++){ 
     canvas.drawLine(porabx, poraby, porabx2, poraby2 , linePaint); 

     porabx = porabx2; 
     poraby = poraby2; 
     porabx2 += totwidth/50; 
     poraby2 = (float) (starty - scaledvi*porabx2/scaledv-.5*scaleda*Math.pow(porabx2/scaledv,2)); 

    } 
} 

Mise à jour (Il dessine aussi le sol, mais cette partie semble fonctionner Il est inclus parce que certaines des variables utilisées pour créer le sol sont également utilisés dans l'arc..): Après En regardant cela pendant un moment et en essayant des nombres différents, je crois que la première ligne tracée est la première (1/50) correcte de l'arc. Pour une raison quelconque, il semble qu'il y ait un problème avec la variable poraby2 dans la boucle.

+0

Mon commentaire sur la version précédente de cette question est toujours présent. Si vous voulez résoudre ce problème, vous devez faire des efforts. – Beta

Répondre

2

Je suppose que votre problème est là:

for(int i=0;i<1;i++){ 

Vous Looping qu'une seule fois ...

+0

Je m'excuse. Je l'ai mis là pendant que j'essayais de comprendre ce qui n'allait pas. Il boucle en fait 50 fois. –

0

I figured it out. En fait, mon problème n'était que la moitié du code. Premièrement, je n'avais pas pris en compte le décalage vertical initial, qui a créé la première des deux lignes. Le deuxième problème, c'était les chiffres que je posais. Je ne m'en rendais pas compte, mais je mettais des vitesses d'environ soixante-dix milles à l'heure alors que le projectile ne faisait que quelques mètres. Cela a fait que le chemin semble droit. Et pendant tout ce temps, j'ai mis les mêmes chiffres pour tester la cohérence. Il n'a fallu que 10 heures pour comprendre cela.