Frage

Ich brauchte ein wenig Mathe-Hilfe, auf die ich anscheinend keine Antwort finde. Über Links zur Dokumentation wäre ich sehr dankbar.

Hier ist meine Situation: Ich habe keine Ahnung, wo ich mich in diesem Labyrinth befinde, aber ich muss mich bewegen und den Weg zurück zum Anfang finden.Ich habe darüber nachgedacht, eine Wegpunktliste mit Orten zu erstellen, die ich von meinem Startpunkt bei 0,0 versetzt habe.Dies ist eine kartesische 2D-Ebene.

Ich habe 2 Eigenschaften erhalten, meine Translationsgeschwindigkeit von 0-1 und meine Rotationsgeschwindigkeit von -1 bis 1.-1 ist ganz links und +1 ist ganz rechts.Es geht um Geschwindigkeit und nicht um Winkel, also liegt dort mein Problem.Wenn ich als Übersetzungsgeschwindigkeit 0 und 0,2 angegeben habe, drehe ich mich kontinuierlich mit langsamer Geschwindigkeit nach rechts.

Wie finde ich die Offsets dieser beiden Variablen heraus?Ich kann es jedes Mal speichern, wenn ich einen „Schritt“ mache.

Ich muss nur die Versätze in x- und y-Betrachtung anhand der Übersetzungen und Rotationsgeschwindigkeiten ermitteln.Und die Rotation, um zu diesen Punkten zu gelangen.

Jede Hilfe wird geschätzt.

War es hilfreich?

Lösung

Ihre Frage ist in einigen Punkten unklar, daher muss ich einige Annahmen treffen:

  1. Während jedes Zeitintervalls sind die Translationsgeschwindigkeit und die Rotationsgeschwindigkeit konstant.
  2. Sie kennen die Werte dieser Variablen in jedem Zeitintervall (und Sie kennen die Rotationsgeschwindigkeit in verwendbaren Einheiten wie Bogenmaß pro Sekunde, nicht nur „ganz links“).
  3. Sie kennen die ursprüngliche Überschrift.
  4. Sie können eine ausreichende Genauigkeit beibehalten, sodass Rundungsfehler kein Problem darstellen.

Angesichts dessen, es gibt eine genaue Lösung.Zuerst der einfache Teil:

delta_angle = omega * delta_t

Wobei Omega die Winkelgeschwindigkeit ist.Die zurückgelegte Strecke (vielleicht entlang einer Kurve) beträgt

dist = speed * delta_t

und der Radius der Kurve ist

radius = dist / delta_angle

(Das wird enorm, wenn die Winkelgeschwindigkeit nahe Null liegt – wir werden uns gleich damit befassen.) Wenn der Winkel (am Anfang des Intervalls) Null ist, definiert als in +x-Richtung zeigend, ist die Übersetzung im Intervall einfach, und wir nennen es deta_x_0 und delta_y_0:

delta_x_0 = radius * sin(delta_angle)
delta_y_0 = radius * (1 - cos(delta_angle))

Da wir in der Lage sein wollen, mit einem sehr kleinen Delta-Winkel und einem sehr großen Radius umzugehen, erweitern wir sin und cos und verwenden dies nur, wenn die Winkelgeschwindigkeit nahe Null liegt:

dx0 = r * sin(da)     = (dist/da) * [ da - da^3/3! + da^5/5! - ...]
                     =  dist     * [  1 - da^2/3! + da^4/5! - ...]

dy0 = r * (1-cos(da)) = (dist/da) * [ da^2/2! - da^4/4! + da^6/6! - ...]
                     =  dist     * [   da/2! - da^3/4! + da^5/6! - ...]

Aber der Winkel ist im Allgemeinen nicht gleich Null, also müssen wir diese Verschiebungen drehen:

dx = cos(angle) * dx0 - sin(angle) * dy0
dy = sin(angle) * dx0 - cos(angle) * dy0

Andere Tipps

Sie könnten es in zwei Stufen tun. Erste Arbeit der Richtung aus der Änderung eine neue Richtungsvektor zu bekommen und dann zweitens die neue Position diese neue Richtung mit trainieren. So etwas wie

angle = angle + omega * delta_t;

const double d_x = cos( angle );
const double d_y = sin( angle );

x = x + d_x * delta_t * v;
y = y + d_y * delta_t * v;

, wo Sie Ihre aktuellen angle speichern bei jedem Schritt aus. (d_x, d_y) ist die aktuelle Richtungsvektor und omega ist die Rotationsgeschwindigkeit, dass Sie haben. delta_t ist offensichtlich Ihren Zeitschritt und v ist Ihre Geschwindigkeit.

Dies kann zu naiv sei es in zwei Phasen aufzuteilen. Ich bin nicht sicher, habe ich nicht wirklich dachte, dass es zu viel durch und haben getestet es nicht, aber wenn es funktioniert, lassen Sie es mich wissen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top