Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Nächster Punkt einer Bewegung


theromi - So 07.12.08 22:43
Titel: Nächster Punkt einer Bewegung
Hi,

ich habe eine Klasse, die einmal die aktuelle X und Y Koordinate, und einmal eine X und Y Koordinate als Ziel gespeichert hat. Nun soll sie sich Punkt für Punkt fortbewegen. Das Problem ist, wie mache ich das? Also, wie berechne ich einen Punkt, der z.B. einen Pixel entfernt vom aktuellen Punkt in Richtung Ziel liegt?

Wenn ich einen Winkel hätte, würde ich über den Sinus rangehen. Aber das muss doch auch irgentwie effektiver gehen, oder? Gibt es da vllt. irgenteine Delphi-Methode für?

Danke schonmal,
Roman


Jann1k - So 07.12.08 22:54

Ich mache sowas immer über Strahlensätze.

€: Den Winkel könntest du ja auch über deine Daten errechnen.


theromi - So 07.12.08 23:00

Oh Gott, ja da dämmert es ganz leise im Hinterkopf. :D
Ich google gleich mal um meinem Gedächtnis auf die Sprünge zu helfen.

Wundert mich ein bisschen, dass man da keine Funkion für hat. Ich meine, so wenig wird es ja sicherlich auch nicht benutzt.

Danke für die schnelle Antwort.


GTA-Place - So 07.12.08 23:06

Mit Satz des Pythagoras die Strecke zwischen den zwei Punkten ausrechnen. Dann teilst du deltaX durch diese Länge und du weißt um wie viel du X pro Schritt verändern musst. Bei diesem Beitrag findest du noch zwei Bilder und einen Beispielsource von mir:

http://www.delphi-forum.de/viewtopic.php?p=473357#473357


Hidden - So 07.12.08 23:17

Hi :)

Wenn ich das richtig verstanden habe, hast du doch den Bewegungsvektor gegeben. Dann erhöhe einfach x- und y-Position um x- und y-Komponente der Bewegung.

Wenn du ncht um den vollen Vekor bewegen willst, wird das ganze etwas komplizierter: Solange du mit Integer-Koordinaten rechnest, kannst du den Vektor nicht richtig kürzen(5 div 3 = 1 :? damit haben wir eine völlig falsche Richtung..).

Das lässt sich lösen, indem du mit Double-Koordinaten rechnest. Zum Zeichnen musst du dann immer runden, dafür hast du keinen Wegfall beim einkürzen eines Vekltors.

Beispiel: v = (5; 3) m/s; => s(0,1s) = v*t = s_0 + (0,5; 0,3);

Imho solltest du das nach der Zeit machen: Dann kannst du dir genau überlegen, wie lange die Bewegung dauern soll.

mfG,


BenBE - Mo 08.12.08 15:33

Bezier-Kurven und B-Splines ...


theromi - Mi 10.12.08 17:58

Danke für eure Antworten. Hatte es schon mit dem Strahlensatz fertig bevor ich den Rest gelesen habe, damit läuft es sehr gut.