2011-01-27 6 views
1

Ранее я задавал этот вопрос, но, думаю, я это плохо сформулировал и, таким образом, не получил никакого ответа. Я пытаюсь сделать приложение для андроида, который рисует путь объекта при запуске снаряда. У меня есть уравнения, чтобы сделать эту работу, но по какой-то причине, когда я запускаю свою программу, все, что я получаю, это 2 связанные строки вместо правильной дуги. Я смотрел на это часами, может ли кто-нибудь сказать мне, что происходит, и что мне нужно сделать, чтобы исправить это? Вот мой код:Рисование траектории движения снаряда в 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)); 

    } 
} 

Update (Он также обращает на землю, но та часть, кажется, работает он включен, потому что некоторые из переменных, используемых для создания земли также используются в дуге..): После того, как глядя на это некоторое время и пытаясь разного числа, я считаю, что первая строка, нарисованная, является правильной первой (1/50) дуги. По какой-то причине это похоже на проблему с переменной poraby2 в цикле.

+0

Мой комментарий к предыдущей версии этого вопроса по-прежнему стоит. Если вы хотите решить эту проблему, вы должны приложить определенные усилия. – Beta

ответ

2

Я думаю, ваша проблема есть:

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

Вы зацикливание только один раз ...

+0

Прошу прощения. Я поставил это там, пока я пытался выяснить, что случилось. Он на самом деле петли 50 раз. –

0

я понял это. Как оказалось, моя проблема была только в коде. Во-первых, я не учитывал начальное вертикальное смещение, которое создало первую из двух строк. Вторая проблема заключалась в том, какие цифры я вводил. Я этого не осознавал, но я вводил скорости, которые составляли около семидесяти миль в час, в то время как снаряд двигался всего на пару футов. Это сделало путь прямым. И все это время я добавлял одинаковые цифры для согласованности тестирования. Это заняло всего 10 часов.