Position und Bewegung von Objekten mit Vektoren und Timer. Grundlegende Algorithmen?



  • Hallo,

    Ich habe ca. 10 Objekte deren Positionen über Vektoren 2D gegeben sind z.B.: P1Obj1=(x1,y1), P2Obj1=(x2,y2), .... PkObj1=(xk ,yk) und P1Obj2=(x1,y1), P2Obj2=(x2,y2), .... PkObj2=(xk ,yk) usw.

    Was ich gerne möchte:
    Ich bewege ein Objekt durch den Raum und will wissen wann kommen mir die anderen Objekte zu nahe. Aber wie fqnge ich an??

    Iteriere ich über das eine Objekt, also von P1,...Pk und prüfe bei jedem Punkt wo bin ich zu welcher Zeit und wo sind dann zu dieser Zeit die anderen Objekte?

    Also ungefähr so: Jemand geht einen Strasse entlang und läüft dort Punkte ab. Er kann von geworfenen Bällen getroffen werden oder nicht! Werden alle Bälle am Tag vorher geworfen juhu kein Problem! Aber die Bälle habe eine Geschwindigkeit und Richtung (die sie ändern können).

    P.S.
    Es geht nicht um Computergrafik(weder OpenGL noch DirectX oder so).

    Wie geht man das an?

    Gruß
    Franky


  • Mod

    Die übliche Vorgehensweise ist es, die Zeit zu diskretisieren. Du wählst einen hinreichend kleinen Zeitschritt. Zu wissen, welche Größe ideal ist, ist die große Kunst daran. Für den Anfang reicht ein bisschen ausprobieren. Dann integrierst du deine Bewegungsgleichungen ausgehend von der Situation in diesem Zeitschritt. Oder einfacher gesagt: Du guckst ob sich deine Geschwindigkeiten ändern müssen, etwa weil deine Objekte kollidiert sind. Danach setzt du deine Objekte anhand dieser Geschwindigkeiten und entsprechend dem Zeitschritt um. Dieses Verfahren wiederholst du beliebig oft.



  • Ok,

    das Programm, das ich umschreiben soll kann schon Bälle (Polygone plazieren), dann meine Route mit den Positionen der Bälle vergleichen.

    Also müßte ich dann

    1. Den Pazierungscode so lassen: Positioniert mal die Bälle auf Startwerte und
      prüf mal ob ich dagegegen laufe auf meiner Route.
    2. Geswchindigkeit und alte Startposition und Richtung ergibt nächste Position:
      Positioniert mal die Bälle auf nächste Position und
      prüf mal ob ich dagegegen laufe auf meiner Route.
    3. Geswchindigkeit und alte Position ....
      Positioniert mal die Bälle auf nächste Position und
      prüf mal ob ich dagegegen laufe auf meiner Route.

    Gruß
    Franky



  • 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 + dt
    v_y

    wobei 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.


  • Mod

    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


  • Mod

    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ß


  • Mod

    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ß


  • Mod

    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ß


Anmelden zum Antworten