Winkelberechnung



  • P2,x=P1,x+rcosαP2,y=P1,y+rsinα\begin{array}{cc} P_{2,x} &= P_{1,x} + r \cos \alpha \\ P_{2,y} &= P_{1,y} + r \sin \alpha \end{array}

    kann man eigentlich ganz simpel nach alpha umstellen:

    P2,xP1,x=rcosαP2,yP1,y=rsinαsinαcosα=P2,yP1,yP2,xP1,xtanα=P2,yP1,yP2,xP1,xα=arctanP2,yP1,yP2,xP1,x\begin{array}{cl} P_{2,x} - P_{1,x} &= r \cos \alpha \\ P_{2,y} - P_{1,y} &= r \sin \alpha \\ \\ \frac{\sin\alpha}{\cos\alpha} &= \frac{P_{2,y} - P_{1,y}}{P_{2,x} - P_{1,x}}\\ \tan\alpha &= \frac{P_{2,y} - P_{1,y}}{P_{2,x} - P_{1,x}} \\ \alpha &= \arctan{\frac{P_{2,y} - P_{1,y}}{P_{2,x} - P_{1,x}}} \end{array}



  • Hallo. Danke für die Hilfe, jedoch muss ich das Thema wieder aufholen:

    double PosX,PosY; // 2 Gleitkommazahlen als Variablen deklarieren
    void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
        // Eine Gleitkommazahl zur Darstellung des Winkels
        double Winkel;
    
        // Um Divisionen durch 0 zu meiden:
        if (PosX-X==0)
            X++;
        if (PosY-Y==0)
            Y++;
    
        // Zuweisung des Winkels:
        // M_PI = Pi
        // atan() = arctan
        // -> Winkel wird hier im Bogenmaß zurückgegeben, weshalb ich es umwandeln muss.
        Winkel=atan((PosY-(double)Y)/(PosX-(double)X))/M_PI*180;
    
        // Titel der Form bekommt den Wert zugeteilt (Als String)
        Caption=AnsiString(Winkel);
    }
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
        // Werte zu Bildschirmmitte setzen
        PosX=ClientWidth/2;
        PosY=ClientHeight/2;
    }
    

    Das ist der Quelltext, den ich Testweise dafür genommen habe. Er teilt den Bildschirm jetzt in Quartale ein, kann man an den Werten erkennen, die dort herauskommen. Kann man dafür nicht auch die Sinussätze verwenden?



  • Weiß da wirklich niemand bescheid? Wie machen es die Spieleprogrammierer von 2D-Weltraumshootern, wo sich das Raumschiff in die Richtung des Mauszeigers dreht?



  • Arg, das gleiche Problem hab ich auch. Kann nicht jemand Arcus Tangens bisschen erklären *liebguckt* 🙂



  • Der arcus-Tangens ist nichts anderes als die Umkehrfunktion des tan. Wenn Du also nen tan-Wert hast, dann sagt Dir der arctan den Winkel dazu.

    Um jetzt dieses 2-Punkte Problem zu lösen mußt Du nur wissen, wie Du diesen tan kriegst. man weiß ja: tan(alpha) = Gegenkathete/Ankathete. Jetzt den arctan drauf und Du kennst das alpha. Das ganze steht aber eigentlich ausführlich und in schönem Latex schon in Bashar's posting.

    MfG Jester



  • Danke!
    DAS ist mal ne vernünftige Erklärung. Jetzt verstehe ich schon etwas mehr. Tut mir leid, bin in Mathe nicht soo fit, daher hab ich die ganzen Formeln von Bashar nicht so wirklich verstanden. Brauch immer noch etwas begleitenden Text dazu ( zumindest ists dann leichter ).

    Also muss ich mir jetzt nur n vernünftiges Dreieck denken um Gegenkathete und Ankathete heraus zu bekommen?

    Thx a lot!



  • Ja, genau. Wobei vernünftig auch rechtwinklig beinhalten sollte. Sonst gilt das ganze natürlich nicht.



  • Kann ich in die Formel nicht direkt:

    alpha = arctan( mausY - playerY / mausX - playerX )

    "einspeisen" ?

    Da kommen nämlich dann die wildesten Ergebnisse 😉



  • Ja. Punkt vor Strich: atan((mausY - playery) / (mausX - playerX))



  • Ich danke euch vielmals! Problem behoben.

    alpha = atan2( ( mausX - playerX ), ( mausY - playerY ) )/M_PI*180;

    Mein Fehler war, das ich pi*180 nicht beachtete. Wusste nicht das das im falschen Maß kommt 🙂

    Vielen Dank!

    pm_Snake


Anmelden zum Antworten