AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?
Thema durchsuchen
Ansicht
Themen-Optionen

Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?

Ein Thema von rajuneon · begonnen am 24. Feb 2009 · letzter Beitrag vom 24. Feb 2009
Antwort Antwort
rajuneon
(Gast)

n/a Beiträge
 
#1

Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?

  Alt 24. Feb 2009, 16:43
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;
HIER gibt es einen Thread, von dem ich das Gefühl habe, dass er mir irgendwie weiterhelfen sollte, tut er aber nicht

Kann mir jemand helfen, wie ich diesen "Pseudocode" zu richtigem machen kann?

Für ein wenig geduldige Hilfe wäre ich sehr dankbar!
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?

  Alt 24. Feb 2009, 17:05
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.
  Mit Zitat antworten Zitat
rajuneon
(Gast)

n/a Beiträge
 
#3

Re: Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?

  Alt 24. Feb 2009, 17:25
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.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?

  Alt 24. Feb 2009, 17:45
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;
  Mit Zitat antworten Zitat
rajuneon
(Gast)

n/a Beiträge
 
#5

Re: Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?

  Alt 24. Feb 2009, 18:11
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;
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

Re: Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?

  Alt 24. Feb 2009, 18:22
Wieso t < 5
Nach 5 Sekunden endet die Animation

Was isn das für ne Formel
Beschreibt die Position in Abhängigkeit der Zeit, also eine Bewegungsgleichung.

Wofür ist das gut
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.
  Mit Zitat antworten Zitat
rajuneon
(Gast)

n/a Beiträge
 
#7

Re: Timer + Zeichnen(+Bewegen) im Koordinatensystem - WIE?

  Alt 24. Feb 2009, 18:34
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:
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);
Noch eine Frage, wo du schon dabei bist

- kann ich die Simulation irgendwie pausieren und wiedder fortfahren lassen und vllt. auch mit einer progressbar darstellen?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 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