Archiv verlassen und diese Seite im Standarddesign anzeigen : Physik: Enfallswinkel gleich Ausfallswinkel
Hallo! o/
Also, ich habe eine Frage. Und zwar geht es darum, dass ich ein Programm schreibe, bei dem eine Kugel simuliert wird, wie sie von Wänden abprallt etc. Das Prog ist in einer Sideview-Sicht, also wie ein Jump'n'Run und 2D. Nun mein eigentliches Problem: Wenn der Ball auf eine Wand trifft, prallt er ja mit dem gleichen Winkel ab, in dem er eingeflogen ist. Hier ein Bild zum besseren Verständnis:
http://www.npshare.de/files/36/2718/Reflexion.png
Joah, auf horizontalen, vertikalen Ebenen oder auf einer 45° Schräge ist das ja leicht zu berechnen (VY*-1; VX*-1; VX und VY tauschen), jedoch auf solchen schrägen ist das schwieriger. Hoffe, jemand kann mir helfen! :)
Die einfachste Lösung ist das natürliche Skalarprodukt:
Seien v, w Vektoren des R², x das natürliche Skalarprodukt auf R² (Summe der komponentenweisen Multiplikation, (a,b)x(c,d) = a*c + b*d) dann gilt:
v x w = |v|*|w|*cos(v,w)
(tatsächlich definiert man in abstrakteren (Prä-Hilbert-)Räumen den Winkel über das Skalarprodukt)
du kennst |v| und |w| (|(a,b)| = sqrt(a² + b²)), dadurch bekommst du den Cosinus raus und somit den Winkel zwischen der Fläche und dem einfallenden Strahl, rechnest darüber aus, wie der Winkel zum Lot ist (90 - Winkel zwischen Fläche und Strahl) und berechnest dadurch den Ausfallswinkel zur Fläche, bestimmst einen Vektor, der diesen hat (das is ein wenig kompliziert, müsstest du aber mit Skalarprodukt und umstellen hinbekommen), normierst ihn und nimmst ihn mit dem Betrag des einfallenden Strahls mal damit er diesselbe "Geschwindigkeit" hat, fertig
O__O Oha...
Naja, nicht ganz oha, denn dead_orc hat mich schon im Chat darauf hingewiesen, jedoch hab ich das nicht hundertprozentig verstanden @_@
Und jetzt leider immer noch nicht. Deswegen wär es echt Supernett, wenn du (oder jemand anderes) es mir an einem Beispiel vorrechnen könntest! =D
€dit:
Hm...k, jetzt konnt ich in Erfahrung bringen, was ungefähr Vektoren sind. Dennoch hab ich nicht ganz verstanden, was v und w sind, von R² ganz zu schweigen o.o°
Aber ich denk mal mit sqrt ist die Quadratwurzel gemeint?
TheBiber
13.05.2008, 16:23
@Dhan: Die mathematische Präzision in Ehren, didaktisch und anwendbar sind die Informationen aber nicht gerade. BTW, der Betrag der Geschwindigkeit wird in der Physik als Schnelligkeit bezeichnet. ;)
Also überlassen wir das mal einem künftigen Ingenieur. :D
Zum Problem: Du hast zuerst eine Geschwindigkeit \vec v_1 = (v_{x1},v_{y1}) gegeben und du hast den Verbindungsvektor von P_1 und P_2 gegeben als \vec p = (p_{x2}-p_{x1},p_{y2}-p_{y1})=(p_x,p_y). Du suchst nun den Geschwindigkeitsektor \vec v_2=(v_{x2},v_{y2}), der die Eigenschaft haben soll, dass der Einfallswinkel dem Ausfallswinkel entspricht.
Der Winkel lässt sich über die Definition des Skalarproduktes einfach berechnen: \cos(\alpha)=\frac{\vec v_1\cdot\vec p}{|\vec v_1|\cdot|\vec p|} = \frac{v_{x1}p_x+v_{y1}p_y}{\sqrt{(v_{x1}^2+v_{y1}^2)(p_x^2+p_y^2)}}
Um das Problem zu lösen, nimmst du eine Senkrechte zu \vec p, definiert als \vec p'=(-p_y,p_x)=(p_x',p_y') und berechnest \vec v_2 über den Winkel zum Lot \beta = 90 - \alpha = \frac{\pi}{2}-\alpha (je nachdem, ob du Grad- oder Bogenmass verwendest). Anschliessend kannst du den neuen Vektor wieder über das Skalarprodukt bestimmen: \cos(\beta)=v_{x2}'p_x'+v_{y2}'p_y'. Du wählst irgendeine Zahl für v_{x2}' und bestimmst über die Formel das v_{y2}', nun sollte die Richtung für \vec v_2' stimmen. Dieser Vektor muss nun noch auf die richtige Schnelligkeit normiert werden, dies geht einfach mit der Formel: \vec v_2=\frac{\vec v_2'}{\sqrt{v_{x2}'^2+v_{y2}'^2}}\cdot \sqrt{v_{x1}^2+v_{y1}^2}
Ein Beispiel mach ich später vielleicht. Ausserdem könnte ich schwören, es gäbe noch eine einfachere Methode, aber mir kommt gerade nichts mehr in den Sinn. ;)
EDIT: Du weisst nicht was Vektoren sind? Weia. :D
Na dann: Ein Vektor ist vereinfacht gesagt eine Anordnung von Zahlen, um Punkte oder Pfeile zu beschreiben, z.B. \vec x=(x_1,x_2)=(5,-3/2) ist ein Vektor. Die x_1=5 und x_2=-3/2 werden als Komponenten des Vektors bezeichnet. Sie wiederspiegeln hier die Koordinaten der Puntke bzw. Pfeilen. Man kann dann die Komponenten des Vektors und den Zwischenwinkel von Vektoren durch das Skalarprodukt verknüpfen, welches definiert ist als: \vec x \cdot \vec y = x_1y_1+x_2y_2. Und ein Mathematiker/Informatiker wie Dhan (:D) könnte dir dann beweisen, dass \vec x \cdot \vec y = |\vec x||\vec y|\cos(\alpha) gilt, wobei alpha der Zwischenwinkel ist und der Betrag eines Vektors über den Satz des Pythagoras definiert ist als |\vec x| = \sqrt{x_1^2+x_2^2}. Soviel zum Thema Vektoren, zusätzlich lassen sie sich auf beliebig viele Dimensionen erweitern, das Konzept nennt man dann Vektorräume, wie \mathbb R^2 (2-dimensionale Ebene) auch einer ist, aber das geht hier wohl zu weit.
EDIT2: Ich wollte eigentlich dein Beispiel ausrechnen, doch irgendetwas stimmt noch nicht. Die letzte Gleichung hat unendlich viele Lösungen, was eigentlich gar nicht sein darf. Irgendwo ist noch der Wurm drin, nur finde ich ihn gerade nicht. ^^
Mhm, interessant! Übrigens danke für die schnellen Antworten. Trotzdem warte ich noch auf die Beispielaufgabe, um sicher zu gehn! :D
V' = 2*Q - V
Q = ( (P2 - P1) / Länge von (P2 - P1) ) * x
x = Länge von V * sin(alpha)
alpha über Skalarprodukt berechnen. So hätte ich es gemacht.
TheBiber
13.05.2008, 17:26
V' = 2*Q - V
Q = ( (P2 - P1) / Länge von (P2 - P1) ) * x
x = Länge von V * sin(alpha)
alpha über Skalarprodukt berechnen. So hätte ich es gemacht.
Also zu deutsch \vec v' = 2\cdot\frac{\vec p}{|\vec p|}\cdot|\vec v|\cdot\sin(\alpha)-\vec v?
Jetzt wäre nur noch eine Begründung oder ein Beweis angebracht. Ich habe herausgefunden, dass man den ersten Vektor lediglich um 2 alpha drehen muss, um das Ergebnis zu erhalten, was deutlich einfacher ist als die erste Methode. Drehungen werden mit Rotationsmatrizen modelliert, möglicherweise resultiert dann genau deine Lösung. Aber ich überprüfe das später, muss Essen. :D
Also zu deutsch \vec v' = 2\cdot\frac{\vec p}{|\vec p|}\cdot|\vec v|\cdot\sin(\alpha)-\vec v?
Jetzt wäre nur noch eine Begründung oder ein Beweis angebracht. Ich habe herausgefunden, dass man den ersten Vektor lediglich um 2 alpha drehen muss, um das Ergebnis zu erhalten, was deutlich einfacher ist als die erste Methode. Drehungen werden mit Rotationsmatrizen modelliert, möglicherweise resultiert dann genau deine Lösung. Aber ich überprüfe das später, muss Essen. :D
Glaube nicht, denn die Rotationsmatrix für 2D ist ja eigentlich:
\begin{bmatrix} \cos(\alpha) & -\sin(\alpha) \\ \sin(\alpha) & \cos(\alpha) \end{bmatrix}
Mein Beweiss ist, dass man da ein gleichschenkliges Dreieck konstruieren kann.
TheBiber
13.05.2008, 20:25
Glaube nicht, denn die Rotationsmatrix für 2D ist ja eigentlich:
\begin{bmatrix} \cos(\alpha) & -\sin(\alpha) \\ \sin(\alpha) & \cos(\alpha) \end{bmatrix}
Mein Beweiss ist, dass man da ein gleichschenkliges Dreieck konstruieren kann.
Deine Formel kann nicht stimmen: Wenn der Einfallswinkel 0° beträgt, dann müsste v = v' gelten, nach deiner Formel ist dann aber v = -v'. Dies hingegen müsste gerade bei 90° gelten, nach dir erhält man hierbei allerdings einen Ausfalsswinkel von 30°, wenn man es aufzeichnet.
Also, ich habs endgültig raus, mit der Rotationsmatrix funktioniert das ganz einfach, ich wende es gleich auf das erste Beispiel an mit \vec v_1=\left(\begin{array}0 \\ -1 \end{array}\right) (y-Achse wird nach oben positiv gezählt, deshalb minus 1) und \vec p = \left(\begin{array}5 \\ -10 \end{array}\right) (es ist wichtig, dass die Vektoren als Spaltenvektoren geschrieben werden, dazu später mehr):
1. Den Einfallswinkel berechnen: \cos(\alpha)=\frac{\vec v_1\cdot\vec p}{|\vec v_1||\vec p|}
Beispiel: \cos(\alpha)=\frac{0\cdot 5+(-1)(-10)}{\sqrt{0^2+(-1)^2}\sqrt{5^2+(-10)^2}}=0.8944, woraus folgt \alpha = 26.56^\circ.
2. Da der Vektor um den doppelten Winkel gedreht werden muss, wird dieser verdoppelt: \beta = 2\alpha
Beispiel: \beta = 53.12^\circ
3. Die Rotationsmatrix aufstellen: \begin{bmatrix} \cos(\beta) & -\sin(\beta) \\ \sin(\beta) & \cos(\beta) \end{bmatrix}
Beispiel: \begin{bmatrix} 0.6 & -0.8 \\ 0.8 & 0.6 \end{bmatrix}
4. Der gesuchte Vektor berechnet sich dann einfach durch Linksmultiplikation mit der Rotationsmatrix: \vec v_2 = \begin{bmatrix} \cos(\beta) & -\sin(\beta) \\ \sin(\beta) & \cos(\beta) \end{bmatrix}\cdot\vec v_1
Beispiel: \vec v_2 = \begin{bmatrix} 0.6 & -0.8 \\ 0.8 & 0.6 \end{bmatrix}\cdot\left[\begin{array}0 \\ -1 \end{array}\right] = \left[\begin{array} 0.6\cdot 0 -0.8\cdot(-1) \\ 0.8\cdot 0 +0.6\cdot(-1)\end{array}\right]=\left[\begin{array}0.8 \\ -0.6\end{array}\right]
Achtung: Die Vektoren müssen zwingend als Spaltenvektoren geschrieben werden, damit die Matrixmultiplikation richtig funktioniert!
Die Multiplikation einer 2x2-Matrix mit einem 2-dimensionalen Spaltenvektor ist wiederum ein Vektor und so definiert: \begin{bmatrix} a&b\\c&d \end{bmatrix} \cdot \left[\begin{array}x\\y\end{array}\right] = \left[\begin{array}a\cdot x+b\cdot y \\ c\cdot x+d\cdot y\end{array}\right]
Die Methode wird zwar nur dann funktionieren, wenn \vec p von \vec v_1 aus gesehen rechts näher ist als links, das müsste man vorher also noch abklären. Falls \vec p von \vec v_1 aus gesehen links näher ist, kann man einfach das Vorzeichen von \beta umkehren, d.h. ein minus davor hängen, dann sollte es wieder stimmen.
So, ich hoffe, geholfen zu haben. ;)
Hmm... So wie ich es gedacht habe gibt \vec V + \vec V' = 2 * \vec Q Dann würde \vec V' = 2 * \vec Q - \vec V sein. Wo liegt mein Fehler?
TheBiber
13.05.2008, 21:33
Hmm... So wie ich es gedacht habe gibt \vec V + \vec V' = 2 * \vec Q Dann würde \vec V' = 2 * \vec Q - \vec V sein. Wo liegt mein Fehler?
Nicht in dieser Gleichung. ;)
Deine beiden anderen Gleichungen besagen:
\vec Q = \frac{\vec p}{|\vec p|}\cdot x
Da Q die Richtung von p hat, stimmt sicher die Richtung, also liegts wohl am Betrag.
x = |\vec v|\cdot\sin(\alpha)
Hier ist der Haken: Wenn du das Dreieck zeichnest, dann hast du für den Winkel die Ankathete und die Hypothenuse gegeben. Durch Verwendung des Cosinus erhält man tatsächlich dasselbe Ergebnis wie ich. :D
Also \vec v' = 2\cdot\frac{\vec p}{|\vec p|}\cdot|\vec v|\cdot\cos(\alpha)-\vec v funktioniert ebenso wie meine Methode, insbesondere auch für die Gegenrichtung. Und einfacher ist sie obendrein auch noch. Für 90° erhält man dann v'=-v, wie es sein sollte und für 0° erhält man v'=2v-v = v, was ebenso stimmt.
Irgendwie gewöhnt man es sich im Alter einfach ab, auf einfache Art die Lösung zu suchen. ;)
nudelsalat
13.05.2008, 22:19
Hab ich irgendwann mal im Internet gefunden und ich verwende die Formel für Reflexionen in einem Ray Tracer, stimmen tut sie also. Zumindest für Strahlen.
c1 = -dot(N, V);
Vr = V + (N*c1*2);
Mit Tex kenn ich mich leider nicht aus, daher diese bescheidene Angabe.
dot(a, b) bedeutet einfach das Punktprodukt von a und b.
N ist der Normalenvektor der Wand/Geraden g, an der der Strahl abprallt.
V ist der Richtungsvektor der Kugel in Richtung Wand.
Sowohl V als auch N sind Richtungsvektoren, müssen also eine Länge von 1 haben.
Vr ist der von der Wand im richtigen Winkel ausgehende Richtungsvektor.
http://img87.imageshack.us/img87/2672/raybi7.jpg
@TheBiber: Ah, sehr gut! Danke! :D
Hab's grad mit einem Idealfall (Ball fällt senkrecht auf 45° Fläche) nachgerechnet und es funktioniert! :A
So, jetzt muss ich das nur noch in Code umwandeln...
Edit: Hab noch ein schönes Problemchen :D
Ich muss kontrollieren, ob ein bestimmter Punkt zwischen zwei anderen Punkten ist! Leider weiß ich keinen Begriff, mit dem man danach googlen könnt :/
Naja, hoffe, jemand kann mir weiterhelfen! :)
TheBiber
28.05.2008, 21:43
Du hast Glück, dass ich per Zufall hier hereinschaue. Der Edit macht sich nämlich nicht bemerkbar. Nächstes mal besser neuen Thread eröffnen. ;)
Edit: Hab noch ein schönes Problemchen :D
Ich muss kontrollieren, ob ein bestimmter Punkt zwischen zwei anderen Punkten ist! Leider weiß ich keinen Begriff, mit dem man danach googlen könnt :/
Naja, hoffe, jemand kann mir weiterhelfen! :)
Was heisst, der bestimmte Punkt soll sich zwischen zwei anderen Punkten befinden? Also dass der bestimmte Punkt auf der Verbindungsstrecke liegt?
Dieses Problem kann man als zwei Einzelprobleme auffassen, nennen wir den bestimmten Punkt mal P und die zwei anderen Punkte A und B:
1. Der Punkt liegt auf der Verbindungsgerade. Hierzu berechnest du z.B. die beiden Vektoren: \vec{AB} = \vec b-\vec a und \vec{AP} = \vec p - \vec a und überprüfst, ob sie linear abhängig sind, d.h. dass der eine Vektor ein skalares Vielfaches des anderen Vektors ist. Programmiertechnisch machst du das am einfachsten, wenn du die Komponenten der beiden Vektoren einzeln teilst und nachprüfst, ob beide dieselbe Zahl ergeben, konkret muss gelten: \frac{AB_x}{AP_x} = \frac{AB_y}{AP_y}
2. Die erste Bedingung sagt noch nichts darüber aus, ob P tatsächlich zwischen A und B liegt, sondern lediglich, dass er in der Verbindungslinie liegt. Um zu überprüfen, ob P zwischen A und B liegt, kann man einfach die Vorzeichen überprüfen: \vec AB und \vec AP müssen komponentenweise die gleichen Vorzeichen haben, während gleichzeitig \vec{BP} =\vec p -\vec b komponentenweise das entgegengesetzte Vorzeichen haben müsste. Programmiertechnisch kann man das Vorzeichen glaub ich mit einer Funktion namens sign(...) oder signum(...) überprüfen, welche einfach 1, 0 oder -1 zurückgeben.
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.