Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Der Schiefe Wurf (https://www.delphipraxis.net/107970-der-schiefe-wurf.html)

Neutral General 5. Feb 2008 15:42


Der Schiefe Wurf
 
Hi,

Das ist mein offizieller Thread zum schiefen Wurf :mrgreen:
Versuche ihn gerade in ein Programm von mir einzubauen. Bisher hatte ich nur eine einfache Formel für den freien Fall im Vakuum benutzt. Und sobald der Spieler auf dem Boden aufknallt habe ich die "Fallzeit" t wieder auf 0 gesetzt.

Beim schiefen Wurf habe ich ja jetzt auch noch andere Möglichkeiten. z.B. könnte ich damit einfach den Spieler nach hinten beschleunigen während er auf dem Boden steht. Z.B. ein Wind oder so der ihn etwas nach hinten drückt. Das Problem ist ja das ich t dann nicht = 0 setzen kann wenn die Spielfigur den Boden berührt. Falls jemand das Problem versteht ... :?

Gruß
Neutral General

Zacherl 5. Feb 2008 16:05

Re: Der Schiefe Wurf
 
Wenn du es richtig korrekt haben willst, dann musst du die Reibung unter anderem beachten und die hängt ja bekanntlich vom Material und der Figur deines Objektes ab .. Das dürfte leicht kompliziert werden.

Neutral General 5. Feb 2008 16:12

Re: Der Schiefe Wurf
 
Ja ich werde später den Luftwiderstand miteinberechnen aber das reicht dann auch. Mein Problem ist ja eher die Zeit. Ich meine man beschleunigt ja und die Geschwindikeit nimmt immer weiter zu, umso länger man beschleunigt. Beim freien Fall hab ich t auf 0 gesetzt wenn die Figur den Boden berührt hat. Das geht ja jetzt nichtmehr weil man ja z.B. nach hinten oder vorne beschleunigt werden kann und gleichzeitig auf dem Boden steht.

sirius 5. Feb 2008 16:18

Re: Der Schiefe Wurf
 
Was ist denn t? Normerweise die Zeit. Man setzt doch die Zeit nicht zurück.

Edit:
Zitat:

Falls jemand das Problem versteht ...
Nö.

igel457 5. Feb 2008 16:21

Re: Der Schiefe Wurf
 
Soweit ich weiß, habe ich den "Schiefen Wurf" in folgendem Programm recht ordentlich implementiert:
http://www.delphipraxis.net/download.php?id=29988

Neutral General 5. Feb 2008 16:25

Re: Der Schiefe Wurf
 
Hi,

Naja ich habe vorher diese einfache Formel benutzt:

http://upload.wikimedia.org/math/1/5...e4ec64ec18.png

Und sobald die Spielfigur auf den Boden aufgeknallt ist, wird t wieder auf 0 gestellt weil sonst würde man beim nächsten Fall ja mit der Geschwindigkeit "weiterfallen" mit der man aufgeknallt ist...

sirius 5. Feb 2008 16:44

Re: Der Schiefe Wurf
 
Ach, du bist noch bei den Grundlagen der Dynamik. (Oh, da muss ich mal tief kramen; mal sehen ob etwas Sinnvolles herauskommt)

Ja, in dem Fall ist es gut die Zeit auf 0 zu setzen. So und jetzt benötigst du beim schrägen wurf eben eine Anfangsgeschwindigkeit.
Desweiteren gilt das Superpositionsprinzip. Du kannst also alle Dimmensionen einzeln betrachten.
Beim schrägen Wurf (von (0,0) aus)
für y gilt für dich y(t)=vy0*t-1/2g*t^2
und für die x richtung einfach x(t)=vx0*t
wobei vx0 und vy0 die Anfangsgeschwindigkeiten sind.
Das kannst du jetzt natürlich so analytisch durchrechnen und für bestimmte Zeitpunkte die Position berechnen. Wenn das Objekt dann irgendwo abprallt musst du eben mit neuen Anfagsgeschwindigkeiten und wieder mit t=0 reingehen.


Möglichkeit Zwei (habe ich immer bevorzugt) macht das ganze etwas numerischer.
Du legst dir anfangs drei Werte zurecht:
Geschwindigkeit, Ort und Beschleunigung
Und das am besten für die x und die y Richtung. Und dann errechnest du wie in einer Folge aus den vorangegangenen werten einfach die nächssten. Und wenn irgendwo ein Abpraller ist änderst du halt das Vorzeichen einer Geschwindigkeitskomponente.

Neutral General 5. Feb 2008 16:51

Re: Der Schiefe Wurf
 
Hi,

Ja wie ich das ganze ausrechne habe ich schon verstanden.
Da hat mir folgende Seite gehofen:

Matheplanet - Schiefer Wurf

Habs bis 3.2 durchgelesen und mittlerweile denke ich mal auch verstanden.

Aber die Frage ist ja, wann ich t auf 0 setze wenn die Figur schon auf dem Boden steht also:

Delphi-Quellcode:
//
    Figur
      |        <--- Wind
      |        <--- Wind
 ----------------------
bei so einem Fall kann ich ja auch die Regeln des schiefen Wurfs anwenden soweit ich das verstanden habe aber sofern die Windkraft parallel zum Boden verläuft bleibt die Figur ja stehen und so kann ich nicht die Regel anwenden - "Wenn die Figur den Boden berührt oder irgendwo gegenknallt, dann setze ich t=0" weil die Figur ja die ganze Zeit den Boden berührt und eben nur zurückgedrückt würde. Versteht ihr?^^

sirius 5. Feb 2008 17:29

Re: Der Schiefe Wurf
 
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)

snow 5. Feb 2008 17:40

Re: Der Schiefe Wurf
 
Wenn v << c dann gilt:

vv = Geschwindigkeit vertical
vh = Geschwingigkeit horizontal

vv = g * t

vh = a * t + v0


v² = (vh)² + (vv)²

v = (g * t)² + (a * t + v0)²

v = g² + 2gt + t² + a² + v0² + t² + 2at + 2av0 + 2tv0

v = g² + 2gt + a² + 2at + 2t² + 2tv0 + 2av0


Zitat:

Vx:=Vx+Ax;
Vy:=Vy+Ay;
du kannst doch keine beschleunigung mit einer geschwindigkeit addieren. du musst berechnen wie lange beschleunigt wird.

angenommen ein ball fällt 10 sek lang herunter. und hat dabei eine beschleunigung durch den wind von a = 1m/s², dann ist

vh = a * t + v0 //v0 ist Null
vh = 1m/sek² * 10 sek
vh = 1m/s

wenn du jetz den ort bestimmen willst an dem der ball einschlägt, so ist dies

s = v * t

s = 1m/s * 10 sek

s = 10m

der ball schlägt also 10 meter entfernt ein*** .


*** = entfernt vom einschlagspunkt beim Fall ohne wind, in richtung der beschleunigungskraft.



gruß snow


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:10 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz