Position und Bewegung von Objekten mit Vektoren und Timer. Grundlegende Algorithmen?
-
Ahm, wie bewege denn Objekte von den ich nur die Startposition und Geschwindigkeit und Richtung kenne? Wie ermittle ich denn da die nächste Position.
Gruß
Franky
-
x_neu = x_alt + dtv_x
y_neu = y_alt + dtv_ywobei dt der Zeitschritt ist und v_x die Geschwidigkeitskomponente in X-Richtung und v_y diejenige in y-Richtung. Und du fängst mit x_alt=x_start an. Im nächsten Schritt setzt du dann x_alt = x_neu und rechnest ein neues x_neu aus usw.
-
Neben dem simplen Euler Algorithmus von PhillipM gibt es auch deutlich bessere Update-Schemata die nicht wesentlich schwieriger sind:
http://en.wikipedia.org/wiki/Verlet-Stoermer_integration#Velocity_Verlet
Der Artikel führt dich auch allgemein recht gut in das Thema ein (ist wahrscheinlich an einigen Stellen zu abgehoben, aber ignorier die einfach).
(Typischerweise findet man mal wieder nichts dazu in der deutschen Wikipedia. Algortihmen die praktisch von der gesamten Welt für dieses Problem benutzt werden sind wohl nicht relevant genug
.)
-
Hi,
ich hatte mich jetzt darauf fixiert wenn ich p1=(x1,y1) habe und Richtung [0..360]
und Speed z. B.: [0..100] also Richtung und Speed Sklarare sein sollen wie ermittle ich den dann p2=(x2,y2)?Weil ich dachte ich bewege mich. Also über k-Positionen und prüfe an jeder Position ob ich getroffen werde. Wenn nicht dann weiter zur nächsten, sonst langsamer werden.
Gruß
Frank
-
FrankTheFox schrieb:
Hi,
ich hatte mich jetzt darauf fixiert wenn ich p1=(x1,y1) habe und Richtung [0..360]
und Speed z. B.: [0..100] also Richtung und Speed Sklarare sein sollen wie ermittle ich den dann p2=(x2,y2)?Sprich du hast die Geschwindigkeit in Polarkoordinaten angegeben.
Weil ich dachte ich bewege mich. Also über k-Positionen und prüfe an jeder Position ob ich getroffen werde. Wenn nicht dann weiter zur nächsten, sonst langsamer werden.
Und?
-
Hi,
ja soll eine Bibliotrhek für Geopositionen werden. Mit denen man hindernissen ausweichen kann, die virtuell gestreut sind.
Mein Ansatz:
cout <<"Start: ("<< new_centre.latitude << ", " << new_centre.longitude << ")"<< endl; float x = new_centre.latitude + sin(329.94)*grad_to_rad; float y = new_centre.longitude + cos(329.94*grad_to_rad); x = x * 6.48; y = y * 6.48; cout <<"Neu: (" << x << ", " << y << ")" << endl;Aber das ist totaler Blödsinn, weil
Start = (0.896401, 0.22403)
und dann
Neu: (5.80046, 7.06017)kann nicht passen...
Gruß
-
So funktioniert das nicht mit Grad<->Bogenmaß. Guck dir das nochmal an. Oder rechne eben gleich mit Bogenmaß, wozu Grad?
Und deinen Algorithmus kann ich nicht nachvollziehen. Was sollen beispielsweise 6.48 und 329.94 sein? Das sind magische Zahlen die vom Himmel gefallen sind?
-
Hi,
ja du hast recht: 6.48 ist die Geschwindigkeit und 329.94 Richtung.
Gruß
-
FrankTheFox schrieb:
Hi,
ja du hast recht: 6.48 ist die Geschwindigkeit und 329.94 Richtung.
Gruß
Dann guck dir naochmal die ganzen Antworten in diesem Thread an, denn offensichtlich hast du das noch nicht getan. Ich meine: Position = Position * Geschwindigkeit? Position = Position + Skalar? Wo hast du das denn her? Das ist doch sofort ersichtlich, dass das nicht passen kann.
-
Ich gehe das jetzt mal anders an.....
cout <<"Alt: (" << start_pos.latitude << ", " << start_pos.longitude << ")" << endl; unit_vector v1 = Sphaerisch2Kartesisch(start_pos);//->Vector cout <<"v1: (" << v1.x << ", " << v1.y << ", " << v1.z << ")" << endl; double tempX = v1.x; //Da sonst schon mit gedrehtem x.... v1.x = (v1.x *cos(329.94)) + (v1.y * -sin(329.94)); v1.y = (tempX *sin(329.94)) + (v1.y * cos(329.94)); next_pos = Kartesisch2Sphaerisch(v1); // -> Polar cout <<"Neu: (" << next_pos.latitude << ", " << next_pos.longitude << ")" << endl;Ergebnis:
Alt: (0.896401, 0.22403)
v1: (0.779033, -0.139291, 0.611314)
Neu: (-0.90935, -0.133793)Wie weit man kommen kann wenn man sich nur dreht....
Gruß
-
...das scheint besser zu funktionieren...
cout <<"Alt: (" << start_pos.latitude << ", " << start_pos.longitude << ")" << endl; unit_vector v1 = Sphaerisch2Kartesisch(start_pos);//->Vector cout <<"v1: (" << v1.x << ", " << v1.y << ", " << v1.z << ")" << endl; unit_vector v2; v2.x = (v1.x *cos(329.94 / 180 * PI)) + (v1.y * -sin(329.94 / 180 * PI)); v2.y = (v1.x *sin(329.94 / 180 * PI)) + (v1.y * cos(329.94 / 180 * PI)); next_pos = Kartesisch2Sphaerisch(v2); // -> Polar cout <<"Neu: (" << next_pos.latitude << ", " << next_pos.longitude << ")" << endl;Ergebniss:
Alt: (0.896401, 0.22403)
v1: (0.779033, -0.139291, 0.611314)
Neu: (0.87253, 1.5708)Aber ich kann doch nicht auf v2.x und v2.y jetzt die Geschwindigkeit addieren. Das gibt doch total fette Werte.
-
Biite, kann mir keiner 'nen Tipp geben wieso ich diese Werte erhalte.
-
FrankTheFox schrieb:
Biite, kann mir keiner 'nen Tipp geben wieso ich diese Werte erhalte.
Lern erst, dich in Geduld zu üben, dein Problem konkret zu formulieren und die gegebenen Antworten sorgfältig zu lesen und zu beachten.
-
Also was habe ich schon:
Bibliothek, die ein Polygon verschieben kann (altes Zentrum -> neues Zentrum).
Ich kan den "track angle"1) anhand zweier Zentren (Polygon) bestimmen und den Abstand "range"2) zwischen zwei Zentren( Polygon) und dann ein neues Zentrum berechnen also ein Polgon bewegen (in Abhängigkeit zeier Zentren).typedef struct Zentrum double longitude double latitude }Zentrum_2D_type;Von den anderen Funktionen 1) und 2) nur die Header (Definition) ...Deklaration nicht einsehbar.
Mein Problem:
- Drehung eines Polygons um sein Zentrum (Winkel ist double [0..360] Mache ich nur einmal (denke ich weil ich dann )
- dann bewegen (speed ist double z.B. 12,98) also dann dachte eine translation...
Aber irgendwie will der Ansatz nicht in meinen Kopf...Gruß