[Mathe!] Eigene point_direction Funktion

  • C/C++

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

  • [Mathe!] Eigene point_direction Funktion

    Vorerst: Hier geht es nicht um C++ an sich, sondern um die Realisierung in C++. Sorry, ich wusste einfach nicht, wo genau ich das unterbringen sollte.

    Ich möchte meine eigene point_direction Funktion schreiben, die ich dann in mein Spiel (C++) implementieren möchte. Das Problem dabei ist, dass ich das nicht so ganz hinbekomme. Irgendwie (glaube ich) komme ich mit dem Winkel- oder Bogenmaß durcheinander. Ich hatte das Thema an sich noch nicht allzu lange in der Schule, deswegen kann da irgendwo ein Fehler sein. Ich habe es am Taschenrechner an 3 Proben erfolgreich berechnet, nur am PC klappt das irgendwie nicht so wie in der Theorie. Hier ist mein Ansatz:

    Die Skizze (im Anhang).

    1.) Es werden die Katheten ermittelt: dx = a, dy = b
    2.) Es wird die Hypotenuse ausgerechnet: c
    3.) Es wird mithilfe des Sinussatzes der Winkel Beta ausgerechnet: Beta


    Quellcode

    1. #define PI 3.14159265
    2. inline double DegToRad(double DegX) { return DegX*PI/180; }
    3. inline double RadToDeg(double ArcX) { return 180*ArcX/PI; }
    4. //Die Katheten & Hypotenuse berechnen
    5. double a = Game.MouseX-m_X;
    6. double b = Game.MouseY-m_Y;
    7. double c = sqrt(a*a+b*b);
    8. if(c==0) c=1; //Division durch 0 verhindern
    9. //Beta berechnen
    10. double Beta = RadToDeg(asin(b/c));
    Alles anzeigen

    Ergebnis:
    Die Ergebnisse sind total verdreht; von -90° zu 0 und dann weiter von 90° zu 180° - Werte, mit denen ich nicht arbeiten kann.

    Folglich bin ich zu folgender Lösung gekommen, die ich in einem Buch gefunden habe:


    Falls x > 0 : a = arctan(y/x)
    Falls x < 0 : a = pi+arctan(y/x)
    Falls x = 0 und y > 0 : a = pi/2;
    Falls x = 0 und y < 0 : a = -pi/2;


    Also habe ich dies angewandt, musste jedoch immer noch durch die + bzw. - 90 nachhelfen.

    Quellcode

    1. double Beta;
    2. if(a > 0 && b < 0)
    3. Beta = RadToDeg(atan(a/b))+90;
    4. else if(a<0 && b < 0)
    5. Beta = RadToDeg(PI+atan(a/b))-90;
    6. else if(a<0 && b > 0)
    7. Beta = RadToDeg(PI+atan(a/b))+90;
    8. else if(a>0 && b > 0)
    9. Beta = RadToDeg(PI+atan(a/b))+90;

    Nun frage ich mich: Wieso muss ich hier mit Arcustangens und nicht mit Arcussinus arbeiten? Und warum muss ich extra noch 90 drauf addieren oder subtrahieren?
    Bilder
    • dreieck.png

      8,28 kB, 320×240, 305 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Critical ()

  • Ich löse dieses Problem in Delphi auf folgende Weise:

    Quellcode

    1. //Modulo//
    2. function fmod(x,y:double):double;
    3. var q:integer;
    4. begin
    5. q:=trunc(x/y);
    6. result:=x-(q*y);
    7. end;
    8. //FixDir//
    9. function FixDir(x:double):double; cdecl;
    10. begin
    11. result:=fmod(x+360,360);
    12. end;
    13. //Point Direction//
    14. function PointDirection(x1,y1,x2,y2:double):double;
    15. begin
    16. result:=(360-FixDir(Arctan2(y2-y1,x2-x1)*(180/Pi)));
    17. end;
    Alles anzeigen


    Die Ergebnisse entsprechen der gm-version. Wenn man in c++ auch Kommazahlen bei Modulo anwenden kann, kannst du die "fmod"-Funktion ignorieren.

    © 2008 by Teamgrill Productions
  • Benutzer online 1

    1 Besucher