[Pascal]Wahadło matematyczne

0

Witam chce napisac taki sobie programik ktory po wpisaniu danych wyswiatla animacje wahadła matematycznego. Oczywiscie w pascalu czyli TurboPascal nie w delphi. Mam juz taki kodzik ale to mi działa tak ze nie idzie tak równo tylko kiedy x>0 to sie odbija jakby i idzie w góre jak zrobic zeby to było płynne przejscie?? Wiecie idealny ruch wahadła. Na razie to jest bez wzrów itd tylko zrobilem tak zeby zrobic wstepnie płynny ruch. ale mi cos nie wychodzi.

program wahadlo;
uses
    crt, graph;

procedure start;
var
   karta,tryb:integer;
begin
     karta:=Detect;
     InitGraph(karta,tryb,'E:\pascal\bgi\');
     if (graphresult <> grOk) then
     begin
     Writeln ('Wystapil blad podczas inicjowania trybu graficznego');
     end;
end;
procedure kolo(x,y: Longint;r: integer;color_ob,color_c: WORD);
var
   i:integer;
begin
  for i:=0 to r do
   begin
     if i=r then SetColor(color_ob) else SetColor(color_c);
     Circle(x,y,i);
   end;
end;
procedure wah;
var
   x,y:integer;
   c:integer;
begin
     y:=0;
     for x:=-200 to 200 do
      begin
       ClearDevice;
       Circle(GetMaxX div 2 +x,GetMaxY div 2 +y,50);
{       kolo(GetMaxX div 2+x,GetMaxY div 2,50,white,red);}
       Delay(1000);
       if ((frac(x/10) = 0) and (x<0)) then
       begin
        y:=y+1;
        end
       else if((frac(x/10) = 0) and (x>0)) then
       begin
        y:=y-1;
        end;
      end;
end;
begin
start;
wah;
repeat until keypressed;
end.
0

Musisz skorzystać z funkcji trygonometrycznych do opisania współrzędnych wahadła:

alpha:=0;
repeat
  X := x_punktu_zawieszenia + promien*(Cos(alpha*wspolczynnik_x));
  Y := y_punktu_zawieszenia + promien*(Sin(alpha*wspolczynnik_y));
  alpha:=alpha+przyrost_kata
until KeyPressed;
 

Wartości współczynników x i y oraz przyrost_kata dobierz doświadczalnie

0

Wszystko fajnie wygląda ale juz sie z tym mecze kilka godzin i nie moge wymyslic jak zrobic aby wahadło się cofało jakiego ifa dac. Zaczyna powiedzmy z prawej strony przechodzi przez srodek konczy na lewej stroni i sie cofa znowy przez srodek do prawej i znowu sie cofa. ale nie wiem jakiego ida dac :(

0

Masz tu procedurkę wah zamień ze starą :

procedure wah;
var
   x,y:real; {dla płynności zalecam real :)}
   a:real;
begin
    a:=0;
    x:=0;y:=0;
    repeat
      a:=a+1;
      if a>360 then a:=0;
      x:=x+sin(a*pi/180)*1.9;
      y:=y+sin(a*2*pi/180);
      line(310,50,200+round(x),200+round(y));
      circle(200+round(x),200+round(y),10);
      delay(5);
      cleardevice;
    until keypressed;
end;

myslę, że ładnie zwalnia i przechodzi w stan powrotny i na zmiąnę.

0

A tu trochę inaczej ,bo z warunkami początkowymi dla długości wahadła
i kąta początkowego

program wahadlo;
uses
    crt, graph;
const pi=3.14159;g=9.81;n=200;
label skok;
var l,alf0,ok       :real;
    z               :char;
    k               :integer;
procedure start;
var
   karta,tryb:integer;
begin
     karta:=Detect;
     InitGraph(karta,tryb,'C:\TP\bgi\');
     if (graphresult <> grOk) then
     begin
     Writeln ('Wystapil blad podczas inicjowania trybu graficznego');
     end;
     setbkcolor(white);
end;
procedure wah;
var  alf,x,y,xp,yp,t   :real;
begin
 setcolor(Red);
 xp:=l*sin(alf0*pi/180);
 yp:=l*cos(alf0*pi/180);
 line(320,10,320+round(400*xp),10+round(400*yp));
 circle(320+round(400*xp),10+round(400*yp),20);
 outtextxy(10,470,'start-wcisnij dowolny klawisz');
  while keypressed do z:=readkey;
   z:=readkey;
 cleardevice;
 t:=0;
repeat
 while t<=ok do
  begin
   setcolor(red);
   alf:=alf0*cos(2*pi*t/ok);
   x:=l*sin(pi*alf/180);
   y:=l*cos(pi*alf/180);
   line(320,10,320+round(400*x),10+round(400*y));
   circle(320+round(400*x),10+round(400*y),20);
   delay(1000);
   setcolor(white);
   line(320,10,320+round(400*x),10+round(400*y));
   circle(320+round(400*x),10+round(400*y),20);
   t:=t+ok/n;
  end;
   if(t>=ok) then t:=0;
until keypressed;
end;

begin
writeln('Podaj dlugosc wahadla<=1m');
readln(l);
writeln('Podaj kat p
0

Nie wkleiłem całości.Przepraszam!.
program wahadlo;
uses
crt, graph;
const pi=3.14159;g=9.81;n=200;
label skok;
var l,alf0,ok :real;
z :char;
k :integer;
procedure start;
var
karta,tryb:integer;
begin
karta:=Detect;
InitGraph(karta,tryb,'C:\TP\bgi');
if (graphresult <> grOk) then
begin
Writeln ('Wystapil blad podczas inicjowania trybu graficznego');
end;
setbkcolor(white);
end;
procedure wah;
var alf,x,y,xp,yp,t :real;
begin
setcolor(Red);
xp:=lsin(alf0pi/180);
yp:=lcos(alf0pi/180);
line(320,10,320+round(400xp),10+round(400yp));
circle(320+round(400xp),10+round(400yp),20);
outtextxy(10,470,'start-wcisnij dowolny klawisz');
while keypressed do z:=readkey;
z:=readkey;
cleardevice;
t:=0;
repeat
while t<=ok do
begin
setcolor(red);
alf:=alf0cos(2pit/ok);
x:=l
sin(pialf/180);
y:=l
cos(pialf/180);
line(320,10,320+round(400
x),10+round(400y));
circle(320+round(400
x),10+round(400y),20);
delay(1000);
setcolor(white);
line(320,10,320+round(400
x),10+round(400y));
circle(320+round(400
x),10+round(400*y),20);
t:=t+ok/n;
end;
if(t>=ok) then t:=0;
until keypressed;
end;

begin
writeln('Podaj dlugosc wahadla<=1m');
readln(l);
writeln('Podaj kat poczatkowy -8<alfa0<8');
Readln(alf0);
ok:=2pisqrt(l/g);
start;
wah;
end.

0

zmieniam troszeczke ostatni wpis bo są problemy z wyjściem z programu
(trzeba czekać aż wahadło całkowicie wróci)

procedure wah;
var  alf,x,y,xp,yp,t   :real;
begin
 setcolor(Red);
 xp:=l*sin(alf0*pi/180);
 yp:=l*cos(alf0*pi/180);
 line(320,10,320+round(400*xp),10+round(400*yp));
 circle(320+round(400*xp),10+round(400*yp),20);
 outtextxy(10,470,'start-wcisnij dowolny klawisz');
  while keypressed do z:=readkey;
   z:=readkey;
 cleardevice;
 t:=0;
repeat
 while (t<=ok)and(not keypressed) do
  begin
   setcolor(red);
   alf:=alf0*cos(2*pi*t/ok);
   x:=l*sin(pi*alf/180);
   y:=l*cos(pi*alf/180);
   line(320,10,320+round(400*x),10+round(400*y));
   circle(320+round(400*x),10+round(400*y),20);
   delay(10);
   setcolor(black);
   line(320,10,320+round(400*x),10+round(400*y));
   circle(320+round(400*x),10+round(400*y),20);
   t:=t+ok/n;
  end;
   if(t>=ok) then t:=0;
until keypressed;
end;

Jak już piszesz program to pomyśl o innych bo wyjście z programu to podstawa! Nie rozumiem jak można robić to tak bezczelnie!

1 użytkowników online, w tym zalogowanych: 0, gości: 1