ich habe mir für Schülerpraktikanten ein paar einfache
Programmieraufgaben ausgedacht. Eine Aufgabe besteht darin, einen Kreis
über eine Bildschirmfläche zu bewegen und an den Wänden abprallen zu lassen.
Das funktioniert momentan ganz gut. Wenn der Kreis an eine Wand prallt,
wird die entsprechende Bewegungskomponente invertiert, also
Einfallswinkel = Ausfallswinkel.
z.B. Der Kreis bewegt sich mit ->V = (+2,-2) und trifft auf die untere
Kante, dort wird die y-Komponente von v invertiert. Nach dem Anprallen
ist V = (+2,+2)
Jetzt kommt zusätzlich ein Schläger ins Spiel, d.h. ein waagerechter
Strich bzw. ein flaches Rechteck.
In dem Bereich, wo der Kreis so auf den Schläger trifft, dass der
Mittelpunkt des Balles über dem Schläger liegt, ist das jetzt kein
Problem, da funktioniert das im Prinzip genauso, wie an den Wänden.
Aber wie berechne ich das Abprallen, wenn der Ball die Kante seitlich
trifft, also wenn der Abstand des Mittelpunktes von einer Ecke des
Schlägers kleiner wird als der Radius des Kreises?
Ich denke, das Problem könnte man als Abprallen eines Kreises von einem
Punkt beschreiben:
Der Punkt hat die festen Koordinaten P = (xp,yp)
Der Mittelpunkt des Kreises hat die Koordinaten M = (xm,ym)
Daraus ergibt sich das Quadrat des Abstandes zu
AQ = (xp-xm)*(xp-xm) + (yp-ym)*(yp-ym)
wenn AQ kleiner wird, als das Quadrat des Radius, habe ich die
Kollision, soweit klar.
Ich habe jetzt zwei Vektore:
1. Den Bewegungsvektor ->V = (xv,yv)
2. Den Kollisionsvektor ->K =(xp-xm,yp-ym)
mit ->M(t+1) = ->M(t)+ ->V
Wie bestimme ich jetzt den neuen Bewegungsvektor ->V' nach der Kollision
mit dem Punkt?
Ich stelle mir jetzt vor, dass ich an der Stelle, wo P den Kreis berührt
eine Tangente anlege und jetzt die Reflexion genauso berechne, als wenn
die Tangente eine Fläche wäre, also Einfallswinkel = Ausfallswinkel. Die
Tangente steht senkrecht auf dem Kollisionsvektor.
Und ab da klemmt es jetzt.
Es muss doch jetzt relativ einfach sein, aus ->V und ->K das neue ->V'
zu berechnen.
Gruß
Stefan
Wird der Kreis dabei nicht verformt?
Wohl schon lange nicht mehr in der Wirklichkeit gewesen.
> Die
> Tangente steht senkrecht auf dem Kollisionsvektor.
>
Wenn wir K =(xp-xm,yp-ym) als K =(xk,yk) schreiben,
ist eine Senkrechte darauf Ks=(yk,-xk),
Probe: Skalarprodukt ausrechnen.
Normieren wir nun K und Ks zu
Kn := K/|K| und Ks zu Ksn := Ks/|Ks|
So können wir die Komponenten von V in Richtung von
K und in Richtung Ks darstellen als (<u,v> = Skalarprodukt von u und v)
<Kn,V> * Kn (Komponente in Richtung K)
und
<ksn,V> * Ksn (Komponente senkrecht zu K)
Nur die erste Komponente soll nun ihr Vorzeichen
ändern, also würde ich als neue Geschwindigkeit
K'= - <Kn,V> * Kn + <ksn,V> * Ksn
nehmen. "Dröseln" wir das ganze wieder auf:
K'= - <K/|K|,V> * K/|K| + <Ks/|Ks|,V> * Ks/|Ks|
= - <K,V> * K/(|K|^2| + <Ks,V> * Ks/(|Ks|^2) (*)
Bedenken wir, daß nach unserer Wahl der Senkrechten
|K|^2=|Ks|^2 gilt, spart man einige Rechnerei und vor allem
Wurzeln ziehen.
> Es muss doch jetzt relativ einfach sein, aus ->V und ->K das neue ->V'
> zu berechnen.
>
So sollte es (modulo Rechenfehler) klappen.
Vielleicht nimmst Du im Original besser Kabs oder dergleichen
statt Kn, weil das "n" oft für "Normal" (senkrecht) statt für
"Normiert" steht.
Im Rechner wird die Normierung natürlich nie ausgeführt,
da ja K' in (*) ohne Wurzeln berechnet werden kann.
Gruß,
Detlef
--
Dr. Detlef Müller,
http://www.mathe-doktor.de oder http://mathe-doktor.de
Wenn der Kreis zentralsymmetrisch auf den Punkt auftrifft kannst Du mit
der Tangente rechnen. Also so wie mit dem Stoß an den Wänden. Tut er das
nicht, so würde ich den Geschwindigkeitsvektor in zwei Teilvektoren
zerlegen. Ein Vektor mit der Richtung vom Kreismittelpunkt zum Stoßpunkt
vp und den anderen als Differenz zum ursprünglichen
Geschwindigkeitsvektor vn = v - vp. Für den Vektor vp berechnest Du den
neuen Vektor vp' wie beim zentralsymmetrischen Stoß und setzt den neuen
Vektor v' wie folgt zusammen.
v' = vp' + vn
Je weiter der Stoßpunkt von der zentralsymmetrischen Achse entfernt ist,
desto kleiner die Komponente vp und desto kleiner die Ablenkung des
Kreises. Im Grenzfall a>=R fliegt der Kreis unbeeinflusst weiter.
alpha: Winkel zwischen Richtung von v und Gerade von Kreismittelpunkt
zum Auftreffpunkt.
vp=v*cos(alpha)
vn=v*sin(alpha)
beta ist der Einfallswinkel für vp. (x',y') ist das lokale
Koordinatensystem des Auftreffpunktes. x' hat die Richtung der Tangente.
vp'=|vp|*cos(beta)*ex' - |vp|*sin(beta)*ey'
Das weitere Rechnung und Transformieren überlasse ich Dir. Würde man
physikalische korrekter Modellieren müsste man noch
Rotationsbetrachtungen einführen. Es würden dann Impuls und
Energiebetrachtungen für Translations und Rotationsbewegungen einfließen.
MFG Stefan
das sieht gut aus,
werds mal ausprobieren.
Gruᅵ
Stefan
> ich habe mir für Schülerpraktikanten ein paar einfache
> Programmieraufgaben ausgedacht. Eine Aufgabe besteht darin, einen Kreis
> über eine Bildschirmfläche zu bewegen und an den Wänden abprallen zu lassen.
>
> z.B. Der Kreis bewegt sich mit ->V = (+2,-2) und trifft auf die untere
> Kante, dort wird die y-Komponente von v invertiert. Nach dem Anprallen
> ist V = (+2,+2)
>
> Jetzt kommt zusätzlich ein Schläger ins Spiel, d.h. ein waagerechter
> Strich bzw. ein flaches Rechteck.
>
> In dem Bereich, wo der Kreis so auf den Schläger trifft, dass der
> Mittelpunkt des Balles über dem Schläger liegt, ist das jetzt kein
> Problem, da funktioniert das im Prinzip genauso, wie an den Wänden.
Etwas spritziger (wenn auch nicht hochphysikalisch) wird das Ganze,
wenn Du auch hier schon die Auftreffposition mit in den neuen
Geschwindigkeitsvektor reinrechnest: je weiter links oder rechts der
Ball auftrifft, desto weniger oder mehr ändert sich die x-Komponente.
Aus (2;-2) wird also nur (2;2), wenn der Ball genau in die Mitte (50%
Schlägerlänge) trifft. Trifft er bei 75%, könnte es z.B. (2,5;2)
werden, und bei 25% dagegen nur (1,5;2). Hab ich zu meiner Zeit als
Handyprogrammierer so ähnlich mal als Fingerübung geschrieben und
immer wieder gern gespielt. Heute heißt das, glaube ich, Äpp.
So wird auch Dein Gedanke berücksichtigt, was passiert, wenn der Ball
auf die Kante schlägt, nur eben einerseits etwas weniger kompliziert,
was den Schülerpraktikanten vielleicht entgegenkommt. Andererseits
wird das Spiel etwas spannender, weil sich die Ballgeschwindigkeit
immer wieder ändert, nicht nur beim seltenen Fall des Kantenschlags.
Viele Grüße
Steffen
> Hallo,
>
>
> ich habe mir für Schülerpraktikanten ein paar einfache
> Programmieraufgaben ausgedacht. Eine Aufgabe besteht darin, einen
> Kreis über eine Bildschirmfläche zu bewegen und an den Wänden
> abprallen zu lassen.
>
> Das funktioniert momentan ganz gut. Wenn der Kreis an eine Wand
> prallt, wird die entsprechende Bewegungskomponente invertiert, also
> Einfallswinkel = Ausfallswinkel.
>
> z.B. Der Kreis bewegt sich mit ->V = (+2,-2) und trifft auf die untere
> Kante, dort wird die y-Komponente von v invertiert. Nach dem Anprallen
> ist V = (+2,+2)
>
> Jetzt kommt zusätzlich ein Schläger ins Spiel, d.h. ein waagerechter
> Strich bzw. ein flaches Rechteck.
>
> In dem Bereich, wo der Kreis so auf den Schläger trifft, dass der
> Mittelpunkt des Balles über dem Schläger liegt, ist das jetzt kein
> Problem, da funktioniert das im Prinzip genauso, wie an den Wänden.
>
> Aber wie berechne ich das Abprallen, wenn der Ball die Kante seitlich
> trifft, also wenn der Abstand des Mittelpunktes von einer Ecke des
> Schlägers kleiner wird als der Radius des Kreises?
>
Ganz einfach. Jede Reaktionskraft wirkt immer normal zur Fläche eines
Körpers. Diese geht beim Kreis immer durch die Mitte. Insofern ist es
egal wo der Kreis auftrifft. Die Richtung der Reaktionskraft hängt nur
vom Kontaktpunkt am Kreis relativ zur Bewegungt ab.
>
Man kann also programtechnisch nur einen Fall berücksichtigen.
>
Die Abprallrichtung ist also immer spiegelsymmetrisch zum Radius im
Kontaktpunkt.
>
--
Selber denken macht klug.
>
> Man kann also programtechnisch nur einen Fall berücksichtigen.
>>
> Die Abprallrichtung ist also immer spiegelsymmetrisch zum Radius im
> Kontaktpunkt.
>
Programmtechnisch kann man das so lösen.
Man plaziert ein 3D orthogonales Koordinatensystem im Kreismittelpunkt
mit zwei Achsen in einer Ebene die den Geschw.Vektor enthält. Man dreht
dann dieses Koordinatensystem um den Kreismittelpunkt so dass eine Achse
durch den Kontaktpunkt geht. Alle anderen Koordinaten spiegelt man danach
an einer Ebene welche durch diese Achse geht und senkrecht zur vorherigen
Ebene(Kreismittelpunkt+ v-Vektor) steht. Man hat so einen Abprall im 3D-
simuliert egal an was.