Winkel und dgl

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 )

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

Hi.
Hmm, bin nicht mehr der jüngste :smile:
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 :smile:
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

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.

  1. 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

Hi.
Hmm, bin nicht mehr der jüngste :smile:
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

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

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

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 :smile:

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 :smile:

hf !

Toni

Hallo.

@Reinhard:
Deine Variante haut so nicht hin :smile:

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 :smile:

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

Toni