Steigung in Grad umrechnen



  • Hallo, ich arbeite zur zeit an einem 2D projekt mit sfml (www.sfml-dev.org)
    nun bin ich dabei die KI der gegner zu programmieren, und stoße auf folgendes problem:
    meine Bots laufen ziellos durch die gegend, völlig zufällig, so soll es sein, wenn man ihnen zu nahe kommt sollen sie das "bemerken", funktioniert auch
    und nach dem sie einen dann sozusagen "gesehen" haben, sollen sie in meine richtung blicken und loslaufen, das laufen ist kein problem, aber das, das sie in meine richtung blicken..
    Ich hab folgende Variablen:
    PPosX = Position X vom Spieler
    PPosY = Position Y vom Spieler
    PosX = Position X vom Bot
    PosY = Position Y vom Bot

    ich habs mit folgender rechnung versucht, aber es funktioniert nicht, ich finde aber auch keinen fehler.

    Angle = atan((PPosY - PosY) / (PPosX - PosX)) / M_PI * 180;
    

    erst rechne ich die steigung aus, das dann mit atan() und daraus dann die Gradzahl, mein Bot schaut aber nicht in die Richtung vom Spieler,
    kann mir einer helfen?
    Danke schonmal 🙂



  • Liegt daran, weil der ArcusTangens nur einen Wertebereich von -Pi/2 bis +Pi/2 hat. Musst daher eine Fallunterscheidung einbauen.
    Ist der Nenner negativ, musst Du Pi zum Ergebnis dazu rechnen.
    Oder noch einfacher, benutz atan2(double Zaehler,double Nenner), dann bekommst Du gleich das richtige Ergebnis.



  • Danke für die schnelle antwort, aber wie genau meinst du das mit atan2?
    so?

    Angle = atan2(PPosY - PosY, PPosX - PosX) / M_PI * 180;
    

    ich kenn atan2 net, und hab ka wie das arbeitet 😣



  • Ja, so ist richtig.
    Folgende Seite wird Dir weiterhelfen:

    http://www.cplusplus.com/reference/clibrary/cmath/atan2.html



  • ok, danke, auf der seite war ich auch schon
    nun is es so, es "funktioniert"
    allerdings nicht richtig..
    es ist nun "richtiger" sozusagen
    aber es stimmt noch nicht ganz..
    muss ich evtl noch eine fall unterscheidung machen?



  • sry wegen doppelpost,
    ich hab nun folgenden fehler,
    mein code sieht so aus

    Angle = (atan2((PPosY - PosY), (PPosX - PosX)) / M_PI * 180);
    

    und im spiel sieht es dann aber so aus,
    wenn ich über dem gegner stehe, schaut er nach links (90°)
    stehe ich rechts neben ihm, schaut er nach unten (0°)
    stehe ich unter ihm, schaut er nach rechts (270°)
    stehe ich links von ihm, schaut er nach oben (180°)

    wundert euch nicht wenn 0° unten is, es ist schon oben, nur is meiner textur sozusagen auf dem kopf..

    mfg max



  • sry für dreifach post -.-"
    habs nun zum laufen gebracht


Log in to reply