AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Der Schiefe Wurf

Ein Thema von Neutral General · begonnen am 5. Feb 2008 · letzter Beitrag vom 5. Feb 2008
 
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Der Schiefe Wurf

  Alt 5. Feb 2008, 17:29
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.
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz