Bewegung auf Koordinaten in 10° bzw. 20° ...



  • Hi,

    in meinem spiel, was ich bisher schon ein paar mal vorgestellt habe, möchte ich die Move() Funktion erweitern.

    Zur zeit sieht sie so aus:

    void ship::Move(int i)
    {
      int x = itsKoord.GetX();
      int y = itsKoord.GetY();
      switch(itsRichtung)
      {
        case NORDEN:
        {
          y += i;
          itsKoord.SetY(y);
          break;
        }
    
        case SUEDEN:
        {
          y -= i;
          itsKoord.SetY(y);
          break;
        }
    
        case WESTEN:
        {
          x -= i;
          itsKoord.SetX(x);
          break;
        }
    
        case OSTEN:
        {
          x += i;
          itsKoord.SetX(x);
          break;
        }
      }
    }
    

    ich möchte den Benutzer den Kurs in ° angeben lassen(auf 10° gerundet), also 10°,20°, usw., wobei Norden 0° ist.

    Das Problem ist ich weiß nicht wie ich den Zielpunkt im Koordinatensystem Berechnen kann... 😞

    also das ich in der Move() aus dem Kurs in ° und der entfernung des zielpunktes errechnen kann wieviel ich zu X und zu Y addieren muss, wie in Move().

    das prob ist zwar eher mathematisch, aber ich hoffe ihr könnt mir trozdem helfen.

    Mfg Yazoo



  • http://de.wikipedia.org/wiki/Sinus

    sollte reichen, um den Rest zu berechnen 😉



  • zwutz schrieb:

    http://de.wikipedia.org/wiki/Sinus

    sollte reichen, um den Rest zu berechnen 😉

    vielen dank, das hat mein prob größtenteils gelöst.

    Das einzige übrig gebliebene prob ist: Wie heißt die Funktion für cos bzw. sin?



  • cos bzw. sin in <cmath>



  • thx



  • Wobei die mit radians und nicht degrees arbeiten.



  • ist das ein problem?



  • Du musst deine Grad erst in Bogenmaß umwandeln 😉

    const double pi = 3.1415926535897932384626433832795;
    inline double deg_to_rad(double d)
    {
        return (d/360)*2*pi;
    }
    

    Bevor du Deine Winkel an die std::sin oder die anderen trigonometrischen Funktionen in C++ übergibst, musst du sie damit einfach umwandeln.

    //Beispiel für 45°
    double x = std::cos(deg_to_rad(45));
    

    Allerdings wäre es sehr ratsam, etwas mit dem ganzen zu warten.
    Nachdem man das alles in der Schule durchgenommen hat, fällt es einem viel leichter 😉

    Ansonsten ist auch ein Tafelwerk wie dieses sehr sehr hilfreich:
    http://www.amazon.de/Das-große-Tafelwerk-interaktiv-Bundesländer/dp/3464571440/ref=pd_bbs_sr_1?ie=UTF8&s=gateway&qid=1201271723&sr=8-1

    (Link bitte kopieren und in den Browser einfügen, Forum hat Probleme mit Umlauten)



  • Warum nicht return (d/180.0)*pi; ?



  • The-Kenny schrieb:

    const double pi = 3.1415926535897932384626433832795;
    

    besser ist:

    const double pi = std::acos(-1.0);  // erfordert #include <cmath>
    

    das ist erstens immer richtig und zweitens hat es genau die maximale Genauigkeit, die vom System zur Verfügung gestellt wird.

    Fellhuhn schrieb:

    Warum nicht return (d/180.0)*pi; ?

    warum nicht

    return d * (pi/180);
    

    zum einen sollte der Compiler oder spätestens das RunTime-System aus (pi/180) gleich eine Konstante machen, so dass dies nicht jedesmal neu berechnet werden muss und zum anderen verbleibt eine Multiplikation (d*..)statt einer Division (d/180..) die immer schneller ist.

    Yazoo schrieb:

    ich möchte den Benutzer den Kurs in ° angeben lassen(auf 10° gerundet), also 10°,20°, usw., wobei Norden 0° ist.

    Verräts Du uns noch, wo dieser Winkel herkommt - ist er das Resultat einer Berechnung oder eine Eingabe?

    Ach - und welche Typen haben die X- und Y-Werte Deiner Koordinate? In Deinem ersten Posting scheinen das ints zu sein, jetzt wären aber doubles angebracht.

    Gruß
    Werner



  • also, ich habe einiges geändert, das prob ist gelöst, aber ich beantworte die fragen trotzdem gerne:

    X un Y sind nun double, der Winkel wird vom User eingegeben



  • meine Move Funktion sieht nun so aus:

    void ship::Move(int i)    // i ist die entfernung
    {
      double x = itsKoord.GetX();
      double y = itsKoord.GetY();
    
      x += std::sin(deg_to_rad(itsRichtung)) * i;        // itsRichtung speichert die Richtung in degrees
      y += std::cos(deg_to_rad(itsRichtung)) * i;
    
      itsKoord.SetAll(x, y);
    }
    

    schon getestet, funktioniert einwandfrei.


Anmelden zum Antworten