Hi Neo
Von Physik scheinst du nicht den blasesten Dunst zu haben. (

sorry)
Deshalb zum Verständnis:
Wir diskutieren hier einfache Wurfparabeln ohne irgdwelche Sonderfälle wie Luftwiederstand (das wäre dann Balistik) ect.
Bekannt sind im allgemeinen die Abschußgeschwindigkeit (V0), der Abschußwinkel (alpha) und die Abschußposition (X0 und Y0).
Um die Parabel leicht berechnen zu können mußt du die Bewegung in zwei sich überlagernde Bewegungen zerlegen. Dabei ist die Horizontale eine einfache lineare Bewegung. s(t) = s0 + V * t
Die Verikale ist durch die Fallbeschleunigung eine beschleunigte Bewegung. s(t) = s0 + V0 * t + a/2 · t²
Der erste Schritt - Geschwindigkeitskomponenten:
Wenn du die Bewegung ist in ihre x & y - Komponenten zerlegst, mußt du auch die V0-Geschwindigkeit zerlegen:
Vx0 = cos(alpha) * V0
Vy0 = sin(alpha) * V0
Der zweite Schritt - horizontale Position:
Das wäre der Weg in x-Richtung (->sx).
Formel : sx = sx0 + Vx * t
sx0 -> Abschuß-x-Position
Vx -> da die horizontale Geschwindigkeit konstant ist Vx0 aus Schritt 1
t -> die seit dem Abschuß vergangene Zeit, also t(jetzt) - t0
Der dritte Schitt - vertikale Position:
Das wäre der Weg in y-Richtung (->sy).
Formel : sy = sy0 + Vy0 * t + a/2 · t²
sy0 -> Abschuß-x-Position
Vy0 -> siehe oben
a -> Fallbeschleunigung z.b.: Erde -> -9,81 m/s²; Mond -1.622 m/s²; Mars -3,69 m/s² (negativ, da in -y Richtung gerichtet)
t -> die seit dem Abschuß vergangene Zeit, also t(jetzt) - t0
jetzt ist es eigentlich nur noch einsetzen und ausrechnen.
Noch ein Wort zu den Einheiten:
mit der Fallbeschleunigung in m/s² bist du schon gebunden. Geschwindigkeiten in m/s, Zeiten in Sekunden und Wege in Metern. Sonst mußt du noch umrechnen.
Beispiel:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65:
| uses ... math
...
private Alpha : single; V0 : single; Vx0 : single; Vy0 : single; s0 :TPoint; t : single;
st_alt :TPoint; st_akt :TPoint;
...
procedure TForm1.DrawImgBG; begin with ImgParabel.Picture.Bitmap do begin Canvas.Brush.Color := clWhite; Width := 700; Height := 400; Canvas.FillRect(rect(0,0,700,400)); Canvas.Pen.Color := clBtnShadow; Canvas.MoveTo(0,200); Canvas.LineTo(700,200); Canvas.MoveTo(10,0); Canvas.LineTo(10,400); end; end;
procedure TForm1.BuShotClick(Sender: TObject); begin Alpha := StrToFloat(EdAlpha.Text); V0 := StrToFloat(EdV0.Text); Vx0 := cos(DegToRad(Alpha)) * V0; Vy0 := sin(DegToRad(Alpha)) * V0; s0.X := 0; s0.Y := 0; t := 0; st_alt := s0; DrawImgBG; Timer.Enabled := true; end;
procedure TForm1.TimerTimer(Sender: TObject); begin t := t + ( Timer.Interval / 1000 ); st_akt.x := round(( s0.X + (Vx0 * t)) * 50) ; st_akt.y := round(( s0.Y + (Vy0 * t) + (-9.81 / 2 * t * t)) * 50) ; ImgParabel.Picture.Bitmap.Canvas.MoveTo(st_alt.x+10,-st_alt.y+200); ImgParabel.Picture.Bitmap.Canvas.LineTo(st_akt.x+10, -st_akt.y+200); st_alt := st_akt; if (st_akt.x >700) then Timer.Enabled := false; end; |