Berechnung Dreieck für Flugbahn

Für allgemeine Fragen zur Programmierung mit PureBasic.
handyhomer
Beiträge: 4
Registriert: 21.08.2011 22:43

Berechnung Dreieck für Flugbahn

Beitrag von handyhomer »

Halli Hallo liebe Boardmitglieder,
ich bin jetzt seit ca. 2 Wochen am PureBasic programmieren und habe mich inzwischen schon gut eingewöhnt und schon ein paar Sachen mit Erfolg hingekriegt.
Meine Frage hat jedoch weniger mit Purebasic selbst zu tun sondern eine Berechnungsfrage.

Und zwar ich hab meine Spielfigur, welche ich über die Pfeiltasten steuern kann(2D) und einen Mauscursor. Wenn ich nun mit meinem Cursor auf einen Punkt klicke soll eine Kugel von der Spielfigur zum angeklicktem Punkt fliegen.
Wie also berechne ich die Flugbahn? Hab schon ein paar Ansätze konnte es aber noch nicht umsetzen, da mein Schulmathe schon etwas eingerostet ist.

Mein Ansatz liegt darin das ich aus den gegebenen Punkten sx,sy(Spieler Position) und mx,my(Mausklick Position) ein rechtwinkliges Dreieck bilde. Und dann die Winkel berechne. Wie ich die einzelnen Seiten des Dreiecks ausrechne weiß ich, jedoch hab ich Probleme mit der Ausrechnung des Winkels beta. Wenn ich den Winkel beta hätte könnte ich doch die einzelnen Punkte ausrechnen, welche die Kugel zurücklegen muss um ans Ziel zu kommen. Seh ich das so richtig oder denk ich hier schon zu kompliziert? Also wie bekomm ich beta raus? Hatte schon die passende Formel gefunden(denke ich zumindest) doch dazu hätte ich arccos einsetzten müssen. Die Funktion gibt aber nur das Bogenmaß zurück... und da hab ich nun irgendwie den Faden verloren. :mrgreen:

............sx,sy
..beta-->|\
............|..\
....mx-sx|....\
............|......\
............|........\
............|______\mx,my
...............my-sy

Ich hoffe ihr könnt mir helfen :)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Berechnung Dreieck für Flugbahn

Beitrag von STARGÅTE »

Dafür gibs die Funktion:

Code: Alles auswählen

ATan2(X, Y)
Für X und Y die Differenzen von Start-Ziel angeben und du bekommst "diesen" Winkel zurück (in Bogenmaß).
Du musst dann noch Degree() anwenden wnmn du den Winkel für Sprite3D brauchst.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
handyhomer
Beiträge: 4
Registriert: 21.08.2011 22:43

Re: Berechnung Dreieck für Flugbahn

Beitrag von handyhomer »

Also hab ein bisschen mit Atan rumgespielt und bin gar nicht klar gekommen ^^

Habs daher jetzt mit einer anderen Varianten versucht, aber irgendwie fliegt meine Kugel nur ungefähr in die richtige Richtung, aber keinesfalls präziese ^^

Code: Alles auswählen

    a.f = KlickedMousex - position_x                       // Position x,y steht für die Position des Spielers
    b.f = KlickedMousey - position_y                      //Klicked Mouse speichert die Koordinaten in dem Moment als geklickt wurde
    distanz.f=Sqr((a*a)+(b*b))                            //Berechnet die Distanz zwischen beiden Punkten
    
    sprungx.f = KlickedMousex / distanz  * 10         //Berechnet wie weit sich die Kugel in Richtung x nach jedem Frame bewegen soll
    sprungy.f = KlickedMousey / distanz * 10
    
    Vorzeichencheck = Sign(a)                            //Prüft die Vorzeichen damit, am Ende alles in die richtige Richtung fliegt
    If Vorzeichencheck = -1
      pos_fettx = pos_fettx - sprungx                     //Pos_fett ist die Position der "Fettkugel" :D     
    Else
      pos_fettx = pos_fettx + sprungx
    EndIf  
    
        Vorzeichencheck = Sign(b) 
    If Vorzeichencheck = -1
      pos_fetty = pos_fetty - sprungy
    Else
      pos_fetty = pos_fetty + sprungy
    EndIf 

    DisplayTransparentSprite(12,pos_fettx,pos_fetty)
Was mach ich falsch? =)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Berechnung Dreieck für Flugbahn

Beitrag von STARGÅTE »

Code: Alles auswählen

sprungx.f = a / distanz  * 10
sprungy.f = b / distanz * 10
müsste es lauten.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
handyhomer
Beiträge: 4
Registriert: 21.08.2011 22:43

Re: Berechnung Dreieck für Flugbahn

Beitrag von handyhomer »

Wow danke ^^ So simpel und plausibel und ich wäre glaube trotzdem die nächsten Stunden nicht drauf gekommen xD
Nur funktioniert mein Vorzeichencheck nicht mehr jetzt ... naja das krieg ich schon raus.

Nur aus Interesse, gibt es einen elgeanteren Weg das zu berechnen oder ist mein Weg das "non-plus-ultra"? :D
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Berechnung Dreieck für Flugbahn

Beitrag von STARGÅTE »

Nur funktioniert mein Vorzeichencheck nicht mehr jetzt
Den brauchst du auch garnicht, denn wenn du mal guckst:

Code: Alles auswählen

sprungx.f = a / distanz  * 10
wird dirch durch das a bereits ein Vorzeichen gegeben, weil du ja oben die Different bildest.

Die IFs kannst du also alle löschen.

Was du da machst ist durch aus ein guter weg.

Mathematisch gesehen:
Du normierst und skalierst den Differenz-Vektor zwischen den beiden Punkten und nutzt ihn dann als "Schrittweite".
Mit Vektoren zu arbeiten ist eh schneller als Sin/Cos ... nur wenn du halt doch mal n Winkel brauchst, musst du es umrechnen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
handyhomer
Beiträge: 4
Registriert: 21.08.2011 22:43

Re: Berechnung Dreieck für Flugbahn

Beitrag von handyhomer »

Den brauchst du auch garnicht, denn wenn du mal guckst:
Hihi ja ich glaube in einer Minute wäre ich auch drauf gekommen. Aber vielen Dank auf jeden Fall. Hast mir heute viel Mühe und Nerven erspart.
Was du da machst ist durch aus ein guter weg.
Das freut mich, dass ich einen guten Weg gefunden hab, trotz das ich totaler Anfänger bin ... Tafelwerk sei dank xD

EDIT: Alle Fragen gelöst, Thema kann geclosed werden
Antworten