Autor Beitrag
neo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 179



BeitragVerfasst: Di 16.03.04 16:48 
Ich bräuchte die Formeln um eine Flugkurve eines Balls zu berechnen. Ein Beispiel wäre auch hilfreich.

Als Ergebnis sollte die Position des Balles (x,y) herauskommen.

thx neo
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 16.03.04 17:32 
Sollte in jeder Physik Formelsammlung zu finden sein. Die Gleichung dann zu programmieren ist trivial.
neo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 179



BeitragVerfasst: Di 16.03.04 17:57 
Titel: RE:
Habe aber leider keine Physik Formelsammlung.

Und im Net habe ich schon 100 verschiedene varianten gefunden, und keine funzt so richtig
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 16.03.04 18:05 
Koordinatensystem: x parallel zum Erdboden, y vom Erdboden weg.
Startbedingung: Ball startet bei x0 und y0 mit den Geschwindigkeiten vx0 und vy0.

Dann ist:

x(t) = x0 + vx0*t
y(t) = -0.5*g*t^2 + vy0*t + y0

So, ich hoffe, ich habe nirgendwo einen Fehler gemacht.

Kommt da noch ein Problem mit der Programmierung oder soll ich das hier mal ins Off Topic verschieben?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
neo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 179



BeitragVerfasst: Di 16.03.04 18:21 
Titel: RE:
Ich werds mal probieren zu programmen sonst meld ich mich nochmal
neo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 179



BeitragVerfasst: Di 16.03.04 18:50 
Titel: RE:
Ganz kapier ich das nicht. Wäre super wenn vielleicht jemand ein bissal Zeit hätte und mir ein kleines Beispiel proggt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 16.03.04 19:09 
Sag' doch erst einmal, was Du nicht kapierst! Wenn Dir jemand jetzt den Quelltext hier hin schreibt, dann verstehst Du es ja wahrscheinlich auch nicht besser, weil die Grundlagen zum Quelltext fehlen. :-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
neo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 179



BeitragVerfasst: Di 16.03.04 19:12 
Titel: RE:
Ok ich checke nicht wie das dann mit der Geschwindigkeit und Zeit funktioniert. (Mit v und t vor und nach dem 1. berechnen)

Ich möchte damit erstmals nur ein Shape ein wenig herumfliegen lassen
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 16.03.04 19:39 
Wenn Du einen Ball wirfst, dann hat der am Anfang eine bestimmte Geschwindigkeit. Sonst würde er ja gar nicht von Dir weg kommen.

Aus dieser Geschwindigkeit und dem Startpunkt (also da, wo der Ball losfliegt) kannst Du den Ort des Balles zu jedem Zeitpunkt berechnen (mit Hilfe der Erdbeschleunigung g).

Nehmen wir nun an, Du hast mit 5 m/s in x-Richtung und 5 m/s in y-Richtung geworfen und möchtest wissen, wo sich der Ball nach 2 Sekunden befindet. Dann setzt Du in die obigen Formeln folgende Werte ein. Ich gebe dabei davon aus, dass Du bei x = 0 stehst und der Ball in einer Höhe von 2m abgeworfen wird.

x0 = 0
y0 = 2
g = 9.81
vx0 = 5
vy0 = 5
t = 2

Das in die Formeln für x und y eingesetzt und Du weißt, wo sich der Ball nach 2 Sekunden befindet.


Sooooo, und jetzt nehmen wir mal an, Du machst das mit einem Timer, der alle 500ms das Shape verschiebt. (Bitte jetzt keiner kommen "Das kann man aber anders viel besser machen ...", es geht ums Prinzip.) Dann zählst Du einfach mit, wie oft der Timer schon sein Werk verrichtet hat und weist, wie lange Dein Shape schon geflogen ist. Wenn Du den Benutzer dann noch x0, y0, vx0, vy0 bestimmen lässt, dann weißt Du in jedem Timerschritt, wo sich Dein Shape befinden muss.

Ach ja, es macht natürlich keinen Sinn, das Ganze 1:1 auf den Bildschirm abzubilden. Du solltest eine Skala wählen, die sinnvoll ist. Also 100px = 1m oder so.

MfG
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Simon Joker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236
Erhaltene Danke: 1



BeitragVerfasst: Mi 17.03.04 11:26 
Hi Neo

Von Physik scheinst du nicht den blasesten Dunst zu haben. ( :roll: 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:

ausblenden volle Höhe Delphi-Quelltext
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
    { Private declarations }
    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); //0 - 90 Grad
  V0    := StrToFloat(EdV0.Text);    //1 - 100 m/s
  Vx0   := cos(DegToRad(Alpha)) * V0;
  Vy0   := sin(DegToRad(Alpha)) * V0;
  s0.X  := 0;
  s0.Y  := 0;
  t     := 0;
  st_alt := s0;
  //Initialisierung des Bildes
  DrawImgBG;
  //Anschalten des Timers
  Timer.Enabled := true;
end;

procedure TForm1.TimerTimer(Sender: TObject);
begin
  //Zeiterhöhen
  t := t + ( Timer.Interval / 1000 );
  //Errechner der aktuellen Position -> * 50 für Maßstab 50pix je Meter
  st_akt.x := round(( s0.X + (Vx0 * t)) * 50) ;
  st_akt.y := round(( s0.Y + (Vy0 * t) + (-9.81 / 2 * t * t)) * 50) ; 
  //Darstellen (y Werte negativ -> da Bitmap positve Werte nach unten) 
  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);
  //Merken der alten Position für später Darstellung
  st_alt := st_akt;
  //Abschalten des Timers
  if (st_akt.x >700) then
    Timer.Enabled := false;
end;


Zuletzt bearbeitet von Simon Joker am Mi 17.03.04 11:31, insgesamt 1-mal bearbeitet
neo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 179



BeitragVerfasst: Mi 17.03.04 11:30 
Titel: RE:
Danke!