![]() |
Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?
Hallo,
ich brauche einen Timer, der die Zeit zurückgibt, ein Koordinatensystem und einen bewegten Kreis darin - der Timer muss die jeweils aktuell vergangene Zeit seit Timerstart anzeigen, weil andere Berechnungen diese als Variable brauchen - abhängig vom Timer ist auch die jeweilige Position des Kreises im Koordinatensystem das hier ist so ungefähr der Ablauf, wie ich ihn mir vorstelle in pseudo-pseudo-code ;-)
Delphi-Quellcode:
Timer startet; //Timer ist bei 0, Position des Kreises ist 0/0 im Koo.-System
Timer ist bei z.B. 50ms := Position des Kreises ist bei x/y {abhängig vom aktuellen Timerwert} ErgebnisDerBerechnung := z {abhängig vom aktuellen Timerwert} Timer endet; ![]() Kann mir jemand helfen, wie ich diesen "Pseudocode" zu richtigem machen kann? Für ein wenig geduldige Hilfe wäre ich sehr dankbar! |
Re: Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?
Falls du nur einen Kreis über das Formular bewegen willst, ist der Code überdimensioniert. Der Code ist eher für kleine Spiele/Simulationen mit mehreren Objekten.
Falls es bei dem einen Kreis bleibt: Eine Schleife, die erst die Position des Objekts ändert und dann Application.Processmessages aufruft. Ansonsten hier nochmal eine Erklärung, zugegebenermaßen ist der Code den ich da (unten) gepostet habe schon etwas kniffelig. Aaaalso: Der Code benutzt keinen Timer, sondern eine Schleife. Dadurch ist die Bewegung so schnell wie möglich. Dann wird die Zeit ausgerechnet, die seit dem letzten Frame vergangen ist. Diese Zeitdifferenz wird dann an die Objekt weitergeben. Du brauchst nämlich nicht die Zeit seit Timerstart, sondern die Zeit seit dem letzten Frame. Dann kannst du dir zunutze machen, dass Geschwindigkeit ja nichtzs anderes ist als "Differenzstrecke pro Sekunde" - wenn du also die Geschwindigkeit mit der Zeitdifferenz multiplizierst, erhälst du eine Strecke - sozusagen eine Positionsdifferenz - die du zu deiner aktuellen Position addieren kannst, um die neue Position zu erhalten. |
Re: Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?
Naja, das Ganze soll ja im Endeffekt eine Art Simulation sein und es soll nur ein kleines Objekt entlang einer Kurve verschoben werden.
Und deshalb brauche ich auch die Zeit seit Timerstart, weil z.B. in der Formel zur Berechnung der jeweiligen Koordinaten etc. die Variable t für Zeit auftaucht. |
Re: Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?
Okay, dann sollte das so etwa gehen:
Delphi-Quellcode:
var
start: Cardinal; t: Double; begin start := Gettickcount(); t := 0; while (not Application.Terminated) && (t < 5) begin Kreis.Top := 100 + 0.5 * 9.81 * t * t; // t ist die Zeit in Sekunden seit Beginn der Animation Kreis.Left := 200 + 100 * sin(2 * t) Application.Processmessages; t := (Gettickcount() - start) / 1000.0; // Neue Zeit ausrechnen end; end; |
Re: Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?
Danke erstmal! Meine Fragen hab ich neben die betreffenden Zeilen kommentiert:
Delphi-Quellcode:
var
start: Cardinal; t: Double; begin start := Gettickcount(); t := 0; while (not Application.Terminated) && (t < 5) {wieso t < 5?} begin Kreis.Top := 100 + 0.5 * 9.81 * t * t; {was ist das für eine formel?} Kreis.Left := 200 + 100 * sin(2 * t) {was ist das für eine formel?} Application.Processmessages; {wofür ist das gut? ;-)} t := (Gettickcount() - start) / 1000.0; {Neue Zeit ausrechnen} end; end; |
Re: Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?
Wieso t < 5
:arrow: Nach 5 Sekunden endet die Animation Was isn das für ne Formel :arrow: Beschreibt die Position in Abhängigkeit der Zeit, also eine Bewegungsgleichung. Wofür ist das gut :arrow: Damit du während der Zeit der Animation das Fenster noch verschieben kannst, und die Anwendung nicht "eingefroren erscheint" Um die Frage vorweg zu beantworten: Eine Bewegungsgleichung beschreibt die Position in Abhängigkeit der Zeit. Wenn du z.B. auf der Autobahn A7 fährst, und zum Zeitpunkt t=0 bei Kilometer 34 bist, und mit konstant 100 km/h fährst, würde deine Bewegungsgleichung lauten: x(t) = 34 km + (t / 3600) * 100 km/h Wobei t die Zeit in Sekunden ist und x die Position zum Zeitpunkt t in Kilometern. Da die Geschwindigkeit in km/h angegeben war, müssen wir die Zeit noch durch 3600 teilen, um Stunden zu bekommen. |
Re: Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?
achso...naja, das war wohl fast zu viel der mühe =) ich hab ja die formel schon...soll ja ein wurf dargestellt werden.
Was du mir hier vorgeschlagen hast, ist ja ein Canvas...aber ich meine, irgendwo gelesen zu haben, dass das wohl irgendwie flimmert. Meinst du, ich kann das getrost verwenden? Hier mal ein Teil dessen, was ich bis jetzt habe:
Delphi-Quellcode:
Noch eine Frage, wo du schon dabei bist ;-)
var // Deklaration aller benötigten Variablen
Form1: TForm1; h0 : real; // Abwurfhöhe v0 : real; // Abwurfgeschwindigkeit winkel0, winkel0bogen : real; // Abwurfwinkel (+Bogenmaß) m : real; // Masse g : real; // Fallbeschleunigung x,y : real; // x,y-Koordinate t : real; // Zeit Dauer : real; // Wurfdauer W : real; // Wurfweite hmax : real; // maximale Wurfhöhe v : real; // aktuelle Geschwindigkeit vx,vy : real; // aktuelle Geschwindigkeit in x- und y-Richtung winkel, winkelbogen : real; // aktueller Winkel (+Bogenmaß) a : real; // Beschleunigung F : real; // Kraft (zum Erdmittelpunkt) Ekin,Epot,Eges : real; // kinetische, potentielle und gesamte Energie implementation {$R *.dfm} procedure TForm1.PlayClick(Sender: TObject); // PLAY-Taste gedrückt begin h0 := StrToFloat(Wurfhoehe.Text); v0 := StrToFloat(Wurfgeschwindigkeit.Text); winkel0 := StrToFloat(Wurfwinkel.Text); winkel0bogen := DegToRad(winkel0); // Abwurfwinkel ins Bogenmaß bringen m := StrToFloat(Masse.Text); case Fallbeschleunigung.ItemIndex of // Auswahl eines Planeten bzw. Eingabe einer Wunsch-Fallbeschleunigung 0: g := 9.81; // Erde 1: g := 1.62; // Mond 2: g := 3.69; // Mars 3: g := 3.7; // Merkur 4: g := 8.87; // Venus 5: g := 23.13; // Jupiter 6: g := 8.96; // Saturn 7: g := 8.69; // Uranus 8: g := 11; // Neptun else g := StrToFloat(Fallbeschleunigung.Text); // wenn g nicht aus der Liste gewählt wird end; // einlesen der variablen Werte Dauer := ((v0*sin(winkel0bogen))+sqrt((sqr(v0)*sqr(sin(winkel0bogen)))+(2*g*h0)))/g; Wurfdauer.Caption := FloatToStr(Dauer); W := (v0*cos(winkel0bogen)*((v0*sin(winkel0bogen))+sqrt((sqr(v0)*sqr(sin(winkel0bogen)))+(2*g*h0))))/g; Wurfweite.Caption := FloatToStr(W); hmax := h0+((sqr(v0)*sqr(sin(winkel0bogen)))/(2*g)); Maximalhoehe.Caption := FloatToStr(hmax); F := m*g; Kraft.Caption := FloatToStr(F); x := v0*t*cos(winkel0bogen); KoordinateX.Caption := FloatToStr(x); y := h0+(v0*t*sin(winkel0bogen))-(g*sqr(t)/2); KoordinateY.Caption := FloatToStr(y); v := sqrt(sqr(v0)-(2*v0*g*t*sin(winkel0bogen))+(sqr(g)*sqr(t))); Geschwindigkeit.Caption := FloatToStr(v); vx := v0*cos(winkel0bogen); GeschwindigkeitX.Caption := FloatToStr(vx); vy := (v0*sin(winkel0bogen))-(g*t)); GeschwindigkeitY.Caption := FloatToStr(vy); Ekin := (m/2)*(sqr(v0)-(2*v0*g*t*sin(winkel0bogen))+(sqr(g)*sqr(t))); Ekinetisch.Caption := FloatToStr(Ekin); Epot := m*g(h0+(v0*t*sin(winkel0bogen))-(g*sqr(t)/2)); Epotentiell.Caption := FloatToStr(Epot); Eges := (m*sqr(v0)/2)+(m*g*h0); Egesamt.Caption := FloatToStr(Eges); - kann ich die Simulation irgendwie pausieren und wiedder fortfahren lassen und vllt. auch mit einer progressbar darstellen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 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