Ich habe mal diese analytischen Formeln völlig links liegen gelassen und lieber Variante 2 gewählt:
Weg ist Integral der Geschwindigkeit und Geschwindigkeit ist Integral der Beschleunigung. Also müssen wir nur immer die Beschleunigung zur Geschwindigkeit addieren und die Geschwindigkeit zum Weg (oder zur Position)
Delphi-Quellcode:
type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure FormPaint(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private-Deklarationen }
Pos:array of TPoint;
PosX,PosY:double;
Vx,Vy:double;
Ax,Ay:double;
procedure add(x,y:double);
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
const ScaleX=1;
ScaleY=2;
implementation
{$R *.dfm}
procedure TForm1.FormPaint(Sender: TObject);
begin
if length(Pos)>1 then canvas.Polyline(Pos);
end;
procedure TForm1.add(x,y:double);
var p:integer;
begin
p:=length(Pos);
setlength(Pos,length(Pos)+1);
Pos[p].X:=round(X*scaleX);
Pos[p].Y:=clientheight-round(Y*scaleY);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
PosX:=0;
PosY:=0;
Vx:=10;
Vy:=12;
Ax:=0;
Ay:=-1;
setlength(pos,0);
add(PosX,PosY);
timer1.Interval:=20;
timer1.Enabled:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
PosX:=PosX+Vx;
PosY:=PosY+Vy;
if PosY<=0 then
begin //Korrektur bei Abprall (kann noch verbessert werden)
PosY:=-PosY+Vy;
Vy:=-Vy;
if PosY<>0 then add(Posx-Vx/2,0); //Abprallpunkt auf der Hälfte des Weges zeichnen
end;
Vx:=Vx+Ax;
Vy:=Vy+Ay;
add(PosX,PosY);
if Pos[high(pos)].X>clientwidth then timer1.enabled:=false;
repaint;
end;
Und wenn du jetzt Wind haben willst, dann setze eben Ax auf einen Wert<>0 (z.B. -0.1)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.