Zwischenraum von zwei punkten berechnen
-
Hallo,
ich habe ein Objekt und den jetzigen Standpunkt und den Zielpunkt(in 2d)
Ich messe die Zeit, die zwischen jedem Frame vergangen ist.
Jetzt möcht ich, das sich das Objekt innerhalb von einer Sekunde von dem startpunkt zum Zielpunkt bewegt.
Wie berechne ich je nach der vergangegen Zeit den aktuellen standpunkt?
-
Hattest du schon Sinus, Cosinus und den Pythagoras in der Schule?
-
sinus, cosinus, pythagoras braucht man nicht.
Du hast den Startpunkt A=(xa,ya) und den Zielpunkt B=(xb,yb) der nach k Sekunden erreicht wird und willst den Punkt C(t) berechnen der den Aktuellen Standpunkt nach t Sekunden angibt. Das mach man so: C(t)=A+t/k*(B-A)=(xa+t/k*(xb-xa),ya+t/k*(yb-ya)) ,in deinem Fall mit k=1 also : C(t)=A+t*(B-A)=(xa+t*(xb-xa),ya+t*(yb-ya)).
-
und am allerallerbesten macht man das mit \LaTeX.
außerdem hatte ich auch das bild eines koordinatensystems vor augen, und da braucht man eben winkelfunktionen.
-
außerdem hatte ich auch das bild eines koordinatensystems vor augen, und da braucht man eben winkelfunktionen.
Wieso?
-
hey, abbadon
Guck Dir doch erstmal, deine Gleichung an. da kommen Ja schonmal nich die gleichen Einheiten draus.
-
Einheiten?
-
ehem joar
die zeit hat glaub ich schon ne einheit. die länge auch und wennse nur "LE" genannt wird.
und wenn das ergebnis einer rechnung lautet: x = y
dann kann das wohl nicht stimmen, wenn nicht x und y die selben einheiten haben.
-
Also wenn ich dich richtig verstanden habe, dann hast du doch den kürzesten weg (sprich eine gerade) zwischen den beiden punkten.
falls dem so ist, kannst du das entweder mir vektoren oder mit einer funktionsgleichung lösen.bei einer funktionsgleichung sieht das so aus.
wegen der zeit (bei dir ist die nullte sek. der start und beim erreichen der ersten sek. bist du am ziel)
wenn du dann z.b. die position zum zeitpunkt 23ms wissen willst, setzt du für x 0,023 (1 sek = 1000 ms) ein. und bekommst mit folgender formel deinen y wert, so dass du deine koordinaten hast (0,023 / y ).Bedingung dafür ist, das du deinen startpunkt auf (0/irgendwas) und deinen zielpunkt auf (1/irgendwas) skalierst.
Angenommen dein y_startwert liegt bei 10 Meter und dein y_zielwert liegt bei 121 Metern, dann hast du folgende koordinaten: Start(0/10) und Ziel(1/121).
Jetzt brauchst du nur noch die punktsteigungsformel y=mx+b in die du deine zeit nach belieben einsetzt und dafür dann die fehlende y-koordinate bekommst.
bei unserem bei spiel: m=(y2-y1)/(x2-x1)=(121-10)/(1-0)=111=m
also
y=111x+b
b ist in diesem fall auch 10, allgemeiner der schnittpunkt mit der y-achse.
also
y=111x+10
wenn du nun die position zum zeitpunkt der 23ms wissen willst, setzt du 0,023 für x ein:
y=1110,023+10=2,553+10=12,553
also wäre die position zur 23ms (0,023/12,553)
nochmal zur 960ms also 0,96
y=1110,96+10=106,56+10=116,56
also wäre die position kurz vor ende, zur 960ms (0,96/116,56)ich hoffe, das war dein problem, ansonsten habe ich mir die ganze mühe umsonst gemacht...
dann musst du erstmal die steigung "m" berechen:
-
hmmmm schrieb:
ehem joar
die zeit hat glaub ich schon ne einheit. die länge auch und wennse nur "LE" genannt wird.
und wenn das ergebnis einer rechnung lautet: x = y
dann kann das wohl nicht stimmen, wenn nicht x und y die selben einheiten haben.Du kannst dir natürlich irgendeine Längeneinheit dazudenken, aber die Zeit (t) hat in meiner Gleichung keine Einheit, das steht in meinem Text aber auch indirekt drin.
@evilass
Soweit ich das überflogen habe funktioniert deine Methode aber nur in einer Dimension.
-
Abbadon schrieb:
Du kannst dir natürlich irgendeine Längeneinheit dazudenken, aber die Zeit (t) hat in meiner Gleichung keine Einheit, das steht in meinem Text aber auch indirekt drin.
ach, und wieso hat sie das nicht? warum lassen wir dann nicht einfach alle einheiten genrell weg?
die situation, die du durch deine rechnerei erzeugst, ist äquvalent zum ergebnis "2apfel = 3birne". merkste was?Abbadon schrieb:
@evilass
Soweit ich das überflogen habe funktioniert deine Methode aber nur in einer Dimension.seine methode funktioniert problemlos. aber die zurückgelegte strecke hat er damit nicht ausgerechnet.. darum gehts doch. und das geht halt nur mit pythagoras oder winkelfunktionen.
-
@Abbadon:
Also, meine Lsg.weg funktioniert natürlich nicht im R_hoch2, aber mit 2D denke ich, dass er das normale kartesische Koordinatensystem mit einer x und einer y achse meinte und nicht eine abbildung von R in den R_hoch2, sondern von R nach R.@scrub:
jo, ich dachte, dass er nur die Position wissen wollte und nicht die zurückgelegte strecke.Wie berechne ich je nach der vergangegen Zeit den aktuellen standpunkt?
um die Strecke zu berechnen kann, wie du schon sagtest, die winkelfktn benutzen.
-
ach, und wieso hat sie das nicht?
Weil ich die Einheit schon rausgekürzt habe.
Aber erklär mir mal wieso auf der einen Seite der Gleichung eine andere Einheiten als auf der anderen stehen soll, ich seh das nicht.
Die zurückgelegte Strecke war aber nicht die frage, er hat nach der Lage gefragt.
-
scrub schrieb:
ach, und wieso hat sie das nicht? warum lassen wir dann nicht einfach alle einheiten genrell weg?
Tun wir doch in der Mathematik grundsätzlich. Abaddons weg ist korrekt.
Er interpoliert einfach die Bewegung linear. Eine andere Schreibweise für diese Idee wäre:Pos(t) = (1-t)*A+t*B
Es wird sozusagen der gewichtete Durchschnitt bestimmt.
MfG Jester
P.S.: Weder dafür noch für die Berechnungder zurückgelegten Strecke benötigt man eine Winkelfunktion. Das soll nicht heißen, daß man's damit nicht machen kann... machen kann man nämlich vieles.
-
Hallo,
wenn Du es proggen willst, machs ca. so:
#include <time.h> LONGLONG Frequency, CurrentTime, LastTime; long double TimeElapsed, TimeScale; bool CounterAvailable;
Jetzt brauchst Du sowas wie ne Init Methode, da schreibst du dann
if (QueryPerformanceFrequency( (LARGE_INTEGER*) &Frequency)) { CounterAvailable = true; TimeScale = 1.0/Frequency; QueryPerformanceCounter( (LARGE_INTEGER*) &LastTime); } else { CounterAvailable = true; }
So, in Deiner z.B Grafikausgabemethode schreibst Du:
[code] if (CounterAvailable==true) { QueryPerformanceCounter((LARGE_INTEGER*) &CurrentTime); TimeElapsed = (CurrentTime - LastTime)*TimeScale; LastTime = CurrentTime; }
So, dann bastelst du dir ne Klasse X mit
struct vector2d { double x,y; }; vector2d ziel, start;
und ner Methode
public: void bewege(double z) { bewegungsweite=bewegungsweite+z; positionx=start.x+bewegungsweite*(ziel.x-start.x); positiony=start.y+bewegungsweite*(ziel.y-start.y); }
Das ganze rufst Du so auf:
x.bewege(TimeElapsed);
So das ganze habe ich jetzt nur so hingeschmiert und nicht getestet.
Aber so ungefähr gehts!