*Markus: Effiziente Berechnung

Hallo,

ich beschäftige mich ein wenig mit der Multimedia-Bibliothek Allegro und versuche ein paar einfache Spieleeigenheiten nachzubilden. In diesem Fall will ich das automatische Zielen auf ein Objekt programmieren. Siehe dazu folgende Grafik:

Das schwarze Objekt soll dabei automatisch auf das rote Objekt zielen sobald sich das rote Objekt in Reichweite befindet.
Ich habe die Mathematik dahinter so gelöst, dass ich mir ein Dreieck vorstelle und jedem Punkt im Programm Koordinaten zuteile (jedes Objekt hat ja schließlich bereits eine Koordinatenzuteilung, da es ja an einer bestimmten Position (x|y) abgebilet ist).

Über den Satz von Pythagoras komme ich zu c. Über den Sinus von Beta (=der Winkel bei "B") und den Arcussinus daraus komme ich zum Winkel Beta.

Allegro hat, aus welchem Grund auch immer, die Angewohnheit, die Winkel mit dem Urzeigersinn zu setzen, wobei bei der positiven x-Achse begonnen wird zu zählen, d.h z.B. ein Winkel von 45 Grad ist nicht im 1. sondern im 4. Quadranten.
Jetzt muss ich natürlich immer überprüfen in welchem Quadranten sich das rote Objekt befindet und dementsprechend den Winkel mal -1 multiplizieren (1. Quadrant), 180 dazuzählen (2.Quadrant), von 180 subtrahieren (3. Quadrant), oder den Winkel selbst ausgeben (4. Quadrant).

Frage: Kann man die Mathematik und die Programmierung dahinter irgendwie eleganter lösen?

Markus.

  1. Hi,

    Allegro hat, aus welchem Grund auch immer, die Angewohnheit, die Winkel mit dem Urzeigersinn zu setzen, wobei bei der positiven x-Achse begonnen wird zu zählen,

    Das tut man doch beim "normalen" Winkel auch.

    d.h z.B. ein Winkel von 45 Grad ist nicht im 1. sondern im 4. Quadranten.
    Jetzt muss ich natürlich immer überprüfen in welchem Quadranten sich das rote Objekt befindet und dementsprechend den Winkel mal -1 multiplizieren (1. Quadrant), 180 dazuzählen (2.Quadrant), von 180 subtrahieren (3. Quadrant), oder den Winkel selbst ausgeben (4. Quadrant).

    Und, hast du das bereits schön mit switch(quadrant) abgebildet? :-)

    Wenn von der normalen Zählung mit dem Uhrzeigersinn auf gegen den Uhrzeigersinn wechselst, bedeutet das einen einfachen Wechsel des Vorzeichens.
    Und da der Vollkreis 360 Grad hat, brauchst du doch einen "normalen" Winkel nur mit umgedrehtem Vorzeichen auf diese 360 draufaddieren, also ihn von 360 abziehen, um auf den "anderen" Winkel zu kommen.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Hallo,

      »» Allegro hat, aus welchem Grund auch immer, die Angewohnheit, die Winkel mit dem Urzeigersinn zu setzen, wobei bei der positiven x-Achse begonnen wird zu zählen,

      Das tut man doch beim "normalen" Winkel auch.

      Hmmm. Wenn ich auf der positiven x-Achse bin, habe ich immer von da an "nach oben" gezählt, sodass ich Richtung y auch positiv bin.

      »» d.h z.B. ein Winkel von 45 Grad ist nicht im 1. sondern im 4. Quadranten.
      »» Jetzt muss ich natürlich immer überprüfen in welchem Quadranten sich das rote Objekt befindet und dementsprechend den Winkel mal -1 multiplizieren (1. Quadrant), 180 dazuzählen (2.Quadrant), von 180 subtrahieren (3. Quadrant), oder den Winkel selbst ausgeben (4. Quadrant).

      Und, hast du das bereits schön mit switch(quadrant) abgebildet? :-)

      Genau so etwas will ich ja irgendwie vermeiden. Vielleicht kann man sogar die ganze Berechnung anders gestalten.

      Wenn von der normalen Zählung mit dem Uhrzeigersinn auf gegen den Uhrzeigersinn wechselst, bedeutet das einen einfachen Wechsel des Vorzeichens.

      Naja ich versuche es einfach irgendwie hinzubiegen, sei es mit oder gegen den Uhrzeigersinn.

      Markus

      1. Hi,

        Hmmm. Wenn ich auf der positiven x-Achse bin, habe ich immer von da an "nach oben" gezählt, sodass ich Richtung y auch positiv bin.

        Ja, und dein Allegro geht aber in y-Richtung nach unten, d.h. du hast *einen* Wechsel des Vorzeichens.

        Und, hast du das bereits schön mit switch(quadrant) abgebildet? :-)

        Genau so etwas will ich ja irgendwie vermeiden.

        Schrieb ich denn nicht bereits, wie?

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. Hallo,

          Ja, und dein Allegro geht aber in y-Richtung nach unten

          das ist aber generell so in allen mir bekannten sprachen. der Nullpunkt des Koordinatensystems ist die linke obere Ecke.

          Ich arbeite schon länger mit Allegro und hatte da auch Probleme, das umzusetzen, da der Ball beim damaligen Pong-Beispiel nicht so wollte wie ich mit das vorgestellt habe.
          Erst nach Testausgaben( Grafische: Ein Kreis und eine linie, die vom Mittelpunkt des Kreises in x° nach außen verläuft. ) habe ich das Problem verstanden ;)

          MfG. Christoph Ludwig

          --
          Wo die Sprache aufhört, fängt die Musik an...
          Selfcode:  sh:( fo:| ch:} rl:( br:> n4:? ie:{ mo:) va:} js:| de:> zu:) fl:( ss:) ls:&
          Go to this