Probleme mit Sin, Atan und Cos..

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Probleme mit Sin, Atan und Cos..

    So, das ist jetzt weniger eine Programmiersprachenspezifische Frage, vielmehr eine mathematische.

    Ich schreibe zur Zeit ein kleines Spiel in C# und XNA.
    Die Game-Objekte definieren für Bewegung speed und direction(wie beim Gamemaker), nicht etwa mit einem Bewegungs-Vektor (x,y).
    Nun habe ich eine Methode genannt AddMotion(float speed, float direction), die die angegebene Bewegung zur Aktuellen addieren soll.

    Spoiler anzeigen
    Würde ich das nun einfach so machen:

    this.Speed += speed;
    this.Direction += direction;

    Das funktioniert leider nicht, da einfach direction addieren is nich, das ist ja Schwachsinn..


    Nun habe ich mir deshalb überlegt, ich konvertiere die argumente speed und direction als auch die objekt-variablen erstmal in einen 2d Vector (x,y), addiere sie miteinander und konvertiere sie zurück, um sie auf die echten variablen anzuwenden.
    Also etwa so: (C#)


    public void AddMotion(float speed, float direction)
    {
    //allokiere temporären Vector, der die aktuelle bewegung und die argumente in vectoren konvertiert und addiert
    Vector2 tmp = GetMotion() //gibt aktuelle speed und direction in form eines vectors zurück
    + new Vector2(
    speed * (float) Math.Cos( (double) MathHelper.ToRadians(direction)), //hspeed = speed * Cos(direction)
    speed * (float) Math.Sin( (double) MathHelper.ToRadians(direction)) //vspeed = speed * Sin(direction)
    );

    this.Direction = (float)Math.Atan2(tmp.X, -tmp.Y); //angle = Atan2(hspeed,vspeed)
    this.Speed = tmp.Length();
    }

    Etwas formaler ohne das C# spezifische:

    Quellcode

    1. Methode AddMotion(speed, direction) neuer Vektor tmp =
    2. Vektor ( x= self.speed * Cos(self.direction) , y= self.speed * Sin(self.direction) + Vektor ( x= speed * Cos(direction) , y= speed * Sin(direction) )
    3. self.direction = Atan2(tmp.x , -tmp.y)
    4. self.speed = tmp.Länge
    5. End



    Meine Frage ist nun; Stimmt das? Funktioniert das? Denn sie scheint nicht einwandfrei zu funktionieren, deswegen wollte mithilfe von euch sichergehen können, dass hier nichts oder etwas faul ist.
    Könnte man das auch ohne Konvertierung lösen und die direction irgendwie mit dem argument "interpolieren"?

    Denn das Problem ist, dass die direction am Ende falsch ist beim Aufruf dieser Methode.

    Würd mich freuen, wenn sich jemand die Mühe machen würde und das durchcheckt, dann hätte sich die Mühe mit diesem Post nämlich gelohnt =)

    danke
    "das war meine letzte flamewar PM an dich ."

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von blubberblub ()

  • Ja Grossschreibung spielt eine Rolle, ausserdem verwende ich ja this.Speed, also verweise explizit auf die eigenen Variablen
    "das war meine letzte flamewar PM an dich ."
  • Hey natürlich danke! Das war der Fehler... Kommt davon, wenn man Funktionen wie Atan einfach nur copy & paste macht, ohne zu verstehen, was sie eig machen.. Vielen Dank =)
    "das war meine letzte flamewar PM an dich ."