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.
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?
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.![]()
--Electrodynamics:
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(y-Achse wird nach oben positiv gezählt, deshalb minus 1) und
(es ist wichtig, dass die Vektoren als Spaltenvektoren geschrieben werden, dazu später mehr):
1. Den Einfallswinkel berechnen:
Beispiel:, woraus folgt
.
2. Da der Vektor um den doppelten Winkel gedreht werden muss, wird dieser verdoppelt:
Beispiel:
3. Die Rotationsmatrix aufstellen:
Beispiel:
4. Der gesuchte Vektor berechnet sich dann einfach durch Linksmultiplikation mit der Rotationsmatrix:
Beispiel:
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:
Die Methode wird zwar nur dann funktionieren, wennvon
aus gesehen rechts näher ist als links, das müsste man vorher also noch abklären. Falls
von
aus gesehen links näher ist, kann man einfach das Vorzeichen von
umkehren, d.h. ein minus davor hängen, dann sollte es wieder stimmen.
So, ich hoffe, geholfen zu haben.![]()
--Electrodynamics:
Geändert von TheBiber (13.05.2008 um 20:29 Uhr)
Nicht in dieser Gleichung.
Deine beiden anderen Gleichungen besagen:
Da Q die Richtung von p hat, stimmt sicher die Richtung, also liegts wohl am Betrag.
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.
Alsofunktioniert 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.![]()
--Electrodynamics:
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.
![]()
Geändert von nudelsalat (13.05.2008 um 22:25 Uhr)
@TheBiber: Ah, sehr gut! Danke!
Hab's grad mit einem Idealfall (Ball fällt senkrecht auf 45° Fläche) nachgerechnet und es funktioniert!
So, jetzt muss ich das nur noch in Code umwandeln...
Edit: Hab noch ein schönes Problemchen
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!![]()
--
Geändert von Teflo (27.05.2008 um 12:25 Uhr)
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.
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:und
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:
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:und
müssen komponentenweise die gleichen Vorzeichen haben, während gleichzeitig
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.
--Electrodynamics: