Winkel und dgl.

Von: , Frage gestellt am Sa, 5. Feb 2005

Hallo.

Mich hat es wieder mal hierher verschlagen, denn ich programmiere gerade ein Billiard. In 2D. Mit BlitzBasic.

Ich habe da ein Problem, welches mir Kopfzerbrechen bereitet:

Es heißt ja: Einfalls-Winkel = Ausfalls-Winkel.

Dem ist aber nicht so...

Wenn sich jemand das so vorstellt:

Die Kugel steht 3 Pixel vor der Bande.
Ich führe nun den Stoß aus, mit einer Geschwindigkeit von, sagen wir mal, -4 x-Pixel und -4 y-Pixel.
Die Geschwindigkeit beträgt nun ca. 11.
Ich habe nun eine Routine, welche auf Kollision prüft.
Falls eine Kollision auftritt, möchte ich nun, daß die Kugel GENAU an der Bande steht.
Die Berechnung von neuem Winkel usw... ist ja kein Problem. Auch die neue Geschwindigkeit nicht.

Es geht also um eine Formel, welche mir die Entfernung zur Bande, bei Kollision, richtig errechnet.

Danke im Vorraus, Toni ( HOT-BIT )

8 Antworten zu dieser Frage

  1. Antwort von nach 19 Minuten 0 hilfreich
    Re: Winkel und dgl.

    Hallo Toni,

    leider bereiten mir einige Deiner Fragen Kopfzerbrechen: Ich habe da ein Problem, welches mir Kopfzerbrechen bereitet:

    Es heißt ja: Einfalls-Winkel = Ausfalls-Winkel.
    Richtig, solang wir ohne Drall der Kugel arbeiten. Die Kugel steht 3 Pixel vor der Bande.
    Ich führe nun den Stoß aus, mit einer Geschwindigkeit von,
    sagen wir mal, -4 x-Pixel und -4 y-Pixel.
    Die Geschwindigkeit beträgt nun ca. 11.
    Geschwindigkeit = 4 pixel / Zeiteinheit in X und auch in Y würde bei mir etwa 11/2 ergeben, meinst du also 5.5? Ich habe nun eine Routine, welche auf Kollision prüft.
    Falls eine Kollision auftritt, möchte ich nun, daß die Kugel
    GENAU an der Bande steht.
    Bei der Aufgabe doch ziemlich genau nach 3/4 einer Zeiteinheit, oder? 3 Pixel weg, 4 pixel in Bandenrichtung, egal ob das jetzt x oder y sein soll. Es geht also um eine Formel, welche mir die Entfernung zur
    Bande, bei Kollision, richtig errechnet.
    warum? warum nicht x und y getrennt berechnenn, dann ist doch alles soviel einfacher.

    Viel Glück

    achim

    • Antwort von nach einer Stunde 0 hilfreich
      Re^2: Winkel und dgl.

      Hi.
      Hmm, bin nicht mehr der jüngste :)
      Bin doch schon 48 Jahre jung.

      Also:

      Ich habe von einer Kugel die x- und y-Koordinate.
      zu diesen Koordinaten lasse ich immer xvel und yvel dazu zählen.

      angela#=(ATan2(cue\dy,cue\dx)+360) Mod 360 ;Winkel bei Aufprall
      speed# = Sqr(cue\dx*cue\dx + cue\dy*cue\dy)

      Hast Recht. Hatte ja gerade mit -8 Pixel experimentiert :)
      So ist der Speed 5.6568

      Ich habe keinen Drall im Game.

      Ich bräuchte nun den Speed-Anteil, welcher ausreicht, um an der Bande zu landen. Der andere Teil davon müßte dann ja in die andere Richtung mit einfließen.

      Hoffe, daß ich mich richtig ausgedrückt habe.
      Toni

      • Antwort von nach 11 Stunden 0 hilfreich
        Re^3: Winkel und dgl.

        Hi.
        Hmm, bin nicht mehr der jüngste :)
        Bin doch schon 48 Jahre jung.

        Also:

        Ich habe von einer Kugel die x- und y-Koordinate.
        zu diesen Koordinaten lasse ich immer xvel und yvel dazu
        zählen.

        Hallo,
        ich verstehe auch nicht so ganz, wo eigentlich das Problem liegen soll. Die Koordinaten x und y wählt man sinnvollerweise parallel zu den Banden - alle Billards, die ich bisher gesehen habe, waren rechteckig.

        Damit ergeben sich die Geschwindigkeitsanteile dx (parallel zur Bande) und dy (senkrecht dazu), und der Rückprall an der Bande ist einfach durch folgendes gekennzeichnet:

        1. y der Kugel ist y der Bande plus der Radius der Kugel.
        2. aus dy wird -dy, dx bleibt gleich.

        Man braucht also nicht einmal Winkelfunktionen.

        Gruss Reinhard

        • Antwort von nach 13 Stunden 0 hilfreich
          Re^4: Winkel und dgl.

          Hallo.

          Ich werde, glaube ich, nicht ganz verstanden ....

          Die Geschwindigkeit der Kugel nimmt insofern ab, da ich bei jedem Durchlauf, die xvel- und yvel-Werte mit 0.99x multipliziere. Bei Banden-berührung kommt nochmal eine Berechnung dazu.

          Wenn ich jetzt zum Beispiel, mit der Kugel 1 Pixel vor der Bande stehe, und einen Speed von ca. 11 habe, dann ist die Kugel, nach der Berechnung, ca. 3 Pixel IN der Bande.
          Und das möchte ich umgehen.
          Die Kugel soll GENAU an der Bande positioniert werden, rechnerisch, der neue Winkel ausgerechnet, der Speed-anteil, der übrig blieb errechnet, und für die neue x- und y-Posi der Kugel bereit gestellt werden. Und danach kann die Kugel wieder sichtbar gemacht werden.

          Alles andere verfälscht nämlich die (halbwegs) korrekte Position der Kugel ....

          Recht schönen Dank für die Antworten bisher.
          Hat mir schon ein Stück weiter geholfen.

          Ich mache es nun so, (obwohl es noch nicht ganz richtig ist):

          Wenn eine Überlappung oder direkt-Kontakt mit der Bande:

          ich ermittle den Winkel und Speed.
          es wird ein neuer Winkel für den Abprall errechnet.
          danach die Überlappung der Kugel mit der Bande.
          diese Überlappung wird mit entgegengesetztem Winkel des Aufprall-Winkels zurück gerechnet. (und das ist noch nicht ganz richtig)
          die Kugel wird nun da positioniert, aber noch nicht angezeigt.
          neue Position der Kugel mit dem schon ermitteltem neuen Winkel und dem Rest des Speedes errechnet
          und nun wird die Kugel angezeigt

          Und dann kommt ein neuer Durchlauf.

          Da ist aber nun noch nicht der Speed-Verlust integriert, aber das ist dann kein Problem...

          So, hoffe, daß es nun verständlicher ist.

          Toni

          • Antwort von nach 15 Stunden 0 hilfreich
            Re^5: Winkel und dgl.

            Hallo Toni,

            für den Speedverlust an der Bande gibt es m.E. keine Grundlage.
            Du kannst daher einfach errechnen, wieviel hinter der Bande die Kugel liegt, und sie um diesen Betrag wieder ins Spielfeld reinholen.

            Es steht Dir aber natürlicha auch frei, mit Winkel und resultierender Geschwindigkeit zu rechnen, was zwar nicht besser oder genauer ist, aber natürlich mathematisch die schönere Herausforderung ist. Du kannst Die ergebnisse dann übrigens recht einfach mit der einfachen Variante überprüfen.

            Und falls Du irgendwann wirklich schräge Wände sumulieren möchtest, ist die Winkelvariante natürlich die universellere.

            Gruß
            achim

            • Antwort von nach 18 Stunden 0 hilfreich
              Re^6: Winkel und dgl.

              Hallo.

              @Reinhard:
              Deine Variante haut so nicht hin :)

              Habe das Problem nun insoferne gelöst:

              check auf Kollision
              wenn Kolli dann Aufprallwinkel berechnen
              die Kugel steckt ja nun IN der Bande
              die Überlappung von Bande und Kugel nun zurück rechnen
              und zwar: new_speed#= sqr(diff*diff+diff*diff)
              dann wird mit Cos(winkel) und Sin(winkel) * dem new_speed# errechnet, wo die Kugel hingesetzt wird, also genau zur Bande
              und danach wird mit dem Abprallwinkel, Cos(winkel) und Sin(winkel) * dem new_speed#, die neue Koordinate für die Kugel errechnet.

              fertig

              Haut nun endlich so hin, wie ich es mir dachte.

              PS:

              Habe vorhin, aus Unachtsamkeit, leider irgendwo vorne im Thread gepostet.
              Daher nun nochmal der Link zu meinem letzten Game:

              http://hot-bit.art-fx.org/art/v080.zip

              Wie gesagt, ich mußte wegen Zeitmangel, gewisse Sachen retuschieren :)


              An alle: Recht schönen Dank für die Hilfe !

              Toni

      • Antwort von nach 11 Stunden 0 hilfreich
        Re^3: Winkel und dgl.

        Hallo Toni, Ich habe von einer Kugel die x- und y-Koordinate.
        zu diesen Koordinaten lasse ich immer xvel und yvel dazu
        zählen.
        perfekt. angela#=(ATan2(cue\dy,cue\dx)+360) Mod 360 ;Winkel bei
        Aufprall
        speed# = Sqr(cue\dx*cue\dx + cue\dy*cue\dy)
        Die Formeln könnten richtig sein, doch gibt es keinen Grund resultierende Geschwindigkeit und Winkel der Kugel zu berechnen. Es ist genau andersrum, du brauchst aus der Quebewegung dann nur die resultirende vx und vy zu ermitteln. Bei einer gegeben Position X1/Y1 ist die neue Position nach zeit t immer:

        X2 = X1 + vx*t
        Y2 = Y1 + vy*t

        wenn dann X = Begrenzung: vx = -vx
        wenn Y = Begrenzung: vy = -vy

        Die Zeit bis zum Aufprall an (der richtigen) X-Bande ist: (XBande - X)/vx

        Was hier noch nicht eingeht ist, dass die Geschwindigkeit ja abnehmen muß, was durch 2 Strategien möglich ist:
        1) Lass die Kugel einfach nur eine gewisse Zeit (abhängig von Anfangsgeschwindigkeit) laufen, und strecke dann die Zeit zum Ende hin:

        Beispiel: 10 Zeiteinheiten:
        Darstellung von Zustand tx nach Zeit in ms:
        t1 nach 100ms
        t2 nach 210ms
        t3 nach 330ms
        ....
        t9 nach 2s
        t10 nach 2,4s

        z.B. die Zeitdifferenz immer 10% größer werden lassen.

        2) verlangsame die Geschwindigkeit in X und Y nach jeder neuen Position um 10%, höhre auf, wenn beide Geschwindigkeiten unter .... pixel pro Zeiteinheit liegen.

        Gruß
        achim

  2. Antwort von nach 16 Stunden 0 hilfreich
    Re: Winkel und dgl.

    Hallo.

    Recht schönen Dank für die Hilfe hier.
    Hat mir sehr geholfen !

    Denke, daß ich dies nun so halbwegs im Griff habe.

    Falls das Game mal fertig wird, werde ich es hier irgendwie bekannt geben.

    Als Danke, habe ich hier einen Link zu meinem letzten Game, welches ich machte. Das war ein Contest für BlitzBasic. Hatte aber sehr wenig Zeit, deswegen ist nicht alles so korrekt wie es sein sollte :)

    Es ist eine Mini-Golf-Variante:
    http://hot-bit.art-fx.org/art/v080.zip

    Ca. 1.5 MB

    Ich benötige ca. 45 Schläge :)

    hf !

    Toni

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!