logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak poprawić dokładność odbicia piłki w programie Pascal?

Brzozza93 14 Paź 2009 23:31 2009 3
REKLAMA
  • #1 7129995
    Brzozza93
    Poziom 15  
    Posty: 216
    Pomógł: 10
    Ocena: 11
    Witam. Z nudów napisałem w fpc programos, który symuluje spadającą i odbijającą się (od dolnej krawędzi ekranu) piłkę. TYlko zauważyłem dziwną rzecz: gdy ustawię siłę odbicia (tj stosunek prędkości przed i po odbiciu) na 1 to... piłka nie wraca dokładnie w swoje miejsce tylko trochę niżej i dalej odbija się do tego poziomu. Pewnie chodzi o to, że jest "zjadana" część przesunięcia przy odbiciu... Im mniejsza prędkość przy kolizji, tym błąd jest mniejszy.
    Będę wdzięczny za sugestię jak ten problem rozwiązać ;)
    Jak poprawić dokładność odbicia piłki w programie Pascal?
    Wiem że program jest nieco niechlujnie napisany ale co mi tam...
    program grav1ty;
    uses crt, graph;
    
    var y, yspeed, maxyspeed, grav, lasty, bounce: real;
    i, ster, tryb: integer;
    
    begin
    ster:=VGA; tryb:=VGAHi;
    initgraph(ster,tryb,'C:\TP\BGI');
    y:=0; lasty:=0;
    yspeed:=0;
    grav:=1;
    i:=1;
    bounce:=1;
    
    
    repeat
    yspeed:=yspeed+grav;
    y:=y+yspeed;
    if y>479 then
     begin
     y:=479;
     yspeed:=yspeed*-bounce;
     end;
    line(i,round(lasty),i+1,round(y));
    writeln('y: ',y:4:1,'; yspeed: ',yspeed:4:1);
    delay(50);
    inc(i);
    lasty:=y;
    until keypressed;
    
    
    end.
    
    
  • REKLAMA
  • Pomocny post
    #2 7130734
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    W podanym kodzie, przy odbiciu zmienna yspeed przyjmuje wielkość ok. 30. To jest ta
    różnica. Ponieważ sprawdzasz warunek na początku pętli lina nigdy nie przekroczy dolnej granicy 479-~30 = 449.
    Powoduje to także, że przy szczycie wykresu, zmienna yspeed zmienia wartość z ujemnej na dodatnią, juz przy y=14 a nie przy y=0. Stąd bierze się górny "margines".

    ============= EDIT ============

    Spróbuj tego :
    program grav1ty;
    uses crt, graph;
    
    var y, yspeed, maxyspeed, grav, lasty, bounce: real;
    i, ster, tryb: integer;
    tekst,tmp  : string;
    textx,texty : integer;
    maxtextheight,maxtextwidth : integer;
    begin
    textx:=10;
    texty:=450;
    
    ster:=VGA; tryb:=VGAHi;
    initgraph(ster,tryb,'C:\TP\BGI');
    ClearDevice;
    SetTextStyle(DefaultFont, HorizDir, 1);
    tekst:='y:  000.0; yspeed:  000.0   ';
    maxtextheight:=TextHeight(tekst);
    maxtextwidth:=TextWidth(tekst);
    y:=0; lasty:=0;
    yspeed:=0;
    grav:=1;
    i:=1;
    bounce:=1;
    
    repeat
    yspeed:=yspeed+grav;
    y:=y+yspeed;
    
    SetColor(6);
    rectangle(textx-5,texty-5,textx+MaxTextWidth+5,texty+MaxTextHeight+5);
    SetFillStyle(0,6);
    FloodFill(textx-4,texty-4,6);
    SetColor(15);
    line(i,round(lasty),i+1,round(y));
    tekst :='y: ';
    str(y:4:1,tmp);tekst:=tekst+tmp;
    tekst:=tekst+'; yspeed: ';
    str(yspeed:4:1,tmp); tekst:=tekst+tmp;
    OutTextXY(textx,texty,tekst);
    delay(50);
    inc(i);
    lasty:=y;
    if y>479 then
     begin
      y:=479;
      yspeed:=yspeed*-bounce;
     end;
    until keypressed;
    CloseGraph;
    end.
  • REKLAMA
  • #3 7131253
    Brzozza93
    Poziom 15  
    Posty: 216
    Pomógł: 10
    Ocena: 11
    Dzięki za próbę rozwiązania, ale problem wciąż występuje.
    Jak poprawić dokładność odbicia piłki w programie Pascal?Jak poprawić dokładność odbicia piłki w programie Pascal?
  • #4 7132031
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    To może w ten sposób :
    program gravity2;
    uses crt, graph;
    
    var
     ster,tryb,odbicia,
     progress,
     maxtextheight,
     maxtextwidth,
     textx,texty        : integer;
     y,x,xstep,
     lastY,grawitacja : real;
     tekst,tmp          : string;
     koniec               : boolean;
    begin
     koniec:=false;
     textx:=10;
     texty:=450;
     ster:=VGA; tryb:=VGAHi;initgraph(Ster,Tryb,'C:\TP\BGI'); ClearDevice;
    
     SetTextStyle(DefaultFont, HorizDir, 1);
     tekst:='y:  000.0; x:  000.0 '; maxtextheight:=TextHeight(tekst); maxtextwidth:=TextWidth(tekst);
    {************************}
     odbicia:=7;
     Grawitacja:=0;
    {************************}
     xstep  :=((Pi*odbicia)/GetMaxX);
     lasty:=0; x:=0; progress:=0;
    
    repeat
     if keypressed then koniec:=(readkey=#27);
     SetColor(6); rectangle(textx-5,texty-5,textx+MaxTextWidth+5,texty+MaxTextHeight+5); SetFillStyle(0,6); 
     FloodFill(textx-4,texty-4,6); SetColor(15);
    
     y:= cos(x)*(GetMaxY-(Grawitacja*Progress*(GetMaxY/GetMaxX))); if y<0 then y:=-y; x:= x + xstep;
    
     line(round(progress-1),GetMaxY-round(lasty),round(progress),GetMaxY-round(y));
     lasty:=y;
     progress:=progress+1;
    
     tekst :='y: '; str(y:4:1,tmp);tekst:=tekst+tmp; tekst:=tekst+'; x: '; str(x:4:1,tmp); tekst:=tekst+tmp; 
     OutTextXY(textx,texty,tekst);
    
     delay(10);
    until koniec or ( progress>=GetMaxX );
    repeat until keypressed;
    CloseGraph;
    end.
    Możesz sterować zmiennymi grawitacja i odbicia.
REKLAMA