Delphi-PRAXiS

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

sirius 5. Feb 2008 18:38

Re: Der Schiefe Wurf
 
Zitat:

du kannst doch keine beschleunigung mit einer geschwindigkeit addieren. du musst berechnen wie lange beschleunigt wird.
Das kann ich sehr wohl. Und dass es passt sieht man ja.
Und wenn du dich an der Physik störst, der Wert für die Zeit beträgt 1.
==>
Vx:=Vx+Ax*1s;

zufrieden?
Ist alles nur eine Frage der Skalierung/Normierung. :zwinker:

Edit: Spärlich, aber der einzige Link den ich zur Normierung auf die Schnelle gefunden habe

snow 5. Feb 2008 19:15

Re: Der Schiefe Wurf
 
wie wärs wenn Neutral General mal erklären würde was er will.

ich denke gerade, dass er eine animation schreiben will. In dieser wird ein körper nach unten fallen gelassen.

dazu soll man dann eine windgeschwindigkeit einstellen können.

die animation soll dann berechnen wo der körper dann landet.

zusätzlich soll berechnet werden wie sich der körper verhält, wenn er auf dem boden steht und ein Wind ihn wegblasen will.

Dazu hab ich die Physikalische methode oben genannt. Der Körper wird nach unten mit g = 9,81m/s² beschleunigt.

und zur seite mit einer beliebigen Beschleunigung a.

die anfangsgeschwindigkeit des körpers ist 0. (er wird ja nicht aus einem Flugzeug sondern von einem Turm abgeworfen).

v0 = 0 m/s

mit hilfe der obrigen formel lässt sich nun die aufschlagsgeschwindigkeit und die entfernung zum Aufschlagspunkt bei Wind = 0 berechnen.

Wenn der Körper nun auf dem boden steht, so ist g = 0; Somit wird er nur noch durch a beschleunigt. In wie weit er nun weggeschoben wird, hängt an den Reibungskräften Boden/Körper.

gruß snow


Ich check leider nicht was Neutral General überhaupt will. Zuerst schreibt er über Spieler, dann über figuren. Will er ein strickmännchen bei windstärke 12 von einem Turm springen lassen und sich anschaun, wie es zerrissen wird?

Neutral General 5. Feb 2008 19:28

Re: Der Schiefe Wurf
 
Zitat:

Zitat von snow
...

Ja du hast ja verstanden was ich will. Ich weiß auch wie das mit dem Sprung vom Turm funktionieren würde.

Es ist ja bei der Beschleunigung so, dass man mit der Zeit immer schneller wird. "t" wäre dann die Zeit in Millisekunden in der das Objekt sich schon im freien Fall befindet. Währenddessen ist es natürlich noch eine horizontale Kraft wie den Wind auf das Objekt einwirken zu lassen. Das ist aber nicht das Problem. Sobald das Objekt auf den Boden auftrifft muss ja t wieder auf 0 gesetzt werden weil das Objekt dann beim nächsten Fall mit einer falschen Geschwindigkeit starten würde.

Dann würde er in der ersten Sekunde (t müsste 1 sein, ist aber sagen wir vom letzten Fall noch 5) eine Strecke von

1/2*g*25 zurücklegen statt eine Strecke von 1/2*g*1.

Deswegen habe ich t beim Aufprall immer auf 0 gesetzt. Das funktioniert so aber nicht wenn man auch Horizontale Beschleunigung zulässt weil man da wie gesagt auch aufm Boden stehen kann und dann beschleunigt werden kann.
Also kann ich nicht sagen: Ich setzte t=0 wenn das Objekt aufm Boden ist, weil dann keine horizontale Beschleunigung zustande kommt weil t immer = 0 wäre.

Meine Frage ist jetzt halt: Wann setze ich t wieder auf 0?

Ich hoffe ihr versteht jetzt was mein Problem ist :oops: :wall:

snow 5. Feb 2008 19:38

Re: Der Schiefe Wurf
 
physikalisch musst du t in sekunden angeben.

außerdem musst du ein t für die vertikale und eins für die horizontale anlegen.

es könnte ja auch sein, dass erst nach 2 sekunden der wind einsetz, dann wäre vh = a * ta.

du trennst die beiden vorgänge einfach strickt voneinander.

wenn der körper den boden berürt, dann ist ja nur tg am ende aber ta geht so lange weiter, bis du den wind abschaltest.

gruß snow

Neutral General 5. Feb 2008 19:44

Re: Der Schiefe Wurf
 
Ok das ist doch schonmal eine Idee mit der ich was anfangen kann :mrgreen:

Und wenn man außer Reichtweite des Winds ist und nicht gegen ne Wand gedrückt wurde?^^

snow 5. Feb 2008 19:54

Re: Der Schiefe Wurf
 
du hast also einen wind, der nicht konstant ist. dann ist die beschleunigung auch nicht konstant.

wenn der wind nicht mehr wirkt, dann ist a = 0.

t wird solange erhöht, solange a wirkt.

gruß snow


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:06 Uhr.

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