Standardskalarprodukt: Unterschied zwischen den Versionen
K (hat „Standard Skalarprodukt“ nach „Standardskalarprodukt“ verschoben: Das ist ein Wort, nicht zwei.) |
|||
(7 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | == | + | == Standardskalarprodukt == |
=== Übersicht === | === Übersicht === | ||
− | Das euklidische Standardskalarprodukt oder Punktprodukt dient in der 3D Grafik meist zur | + | Das euklidische Standardskalarprodukt oder Punktprodukt dient in der 3D-Grafik meist zur Berechnung von Winkeln, kann jedoch sehr häufig auch eine Reihe anderer Zwecke erfüllen. Die Einsatzorte sind vielfältig, kann man doch damit Reflexionen, Bumpmapping, Collision Detection u.v.m. realisieren. |
+ | |||
=== Definition === | === Definition === | ||
− | Zwei Vektoren a,b wird eine eindeutige Zahl ‹a,b› das Skalarprodukt zugeordnet: | + | Zwei Vektoren a, b wird durch eine eindeutige Zahl ‹a,b› das Skalarprodukt zugeordnet: |
− | ‹a,b› := ||a||*||b||*cos( | + | ‹a,b› := ||a||*||b||*cos(φ) 0≤φ≤π |
[[Bild:Std_Skalarprodukt.jpg|right|Skalarprodukt]] | [[Bild:Std_Skalarprodukt.jpg|right|Skalarprodukt]] | ||
− | Haben a,b also die Länge 1, so berechnet das Skalarprodukt ‹a,b› den | + | Haben a, b also die Länge 1, so berechnet das Skalarprodukt ‹a,b› den Kosinus des Zwischenwinkels. Stehen beliebige Vektoren a, b senkrecht aufeinander, so ist der Winkel Pi/2, der Cosinus also 0 und damit das Skalarprodukt 0, wenn die beiden Vektoren senkrecht aufeinander stehen. (Beachte: Der Nullvektor ist senkrecht zu allen anderen Vektoren definiert, sogar zu sich selbst!) |
− | Es lässt sich zeigen, | + | Es lässt sich zeigen, dass man das Standardskalarprodukt sehr leicht berechnen kann. Seien a=(a1;a2;a3), b=(b1;b2;b3), dann gilt: |
‹a,b› = a1*b1 + a2*b2 + a3*b3 | ‹a,b› = a1*b1 + a2*b2 + a3*b3 | ||
=== Rechenregeln === | === Rechenregeln === | ||
− | * ‹a,a› entspricht der Länge von a im Quadrat, denn ‹a,a› = ||a||*||a||*Cos(0) = ||a|| | + | * ‹a,a› entspricht der Länge von a im Quadrat, denn ‹a,a› = ||a||*||a||*Cos(0) = ||a||<sup>2</sup> |
* <div>Linearität in beiden Argumenten: | * <div>Linearität in beiden Argumenten: | ||
‹a + b, c› = ‹a,c› + ‹b,c› | ‹a + b, c› = ‹a,c› + ‹b,c› | ||
‹a, b + c› = ‹a,b› + ‹a,c› | ‹a, b + c› = ‹a,b› + ‹a,c› | ||
− | ‹lambda * a, b› = lambda * ‹a,b› ( | + | ‹λ* a, b› = λ* ‹a,b› (λ reel) |
− | ‹a, lambda * b› = lambda * ‹a,b› | + | ‹a, λ* b› = λ* ‹a,b› |
− | Es ist daher naheliegend das Produkt mit einem Punkt zu | + | Es ist daher naheliegend, das Produkt mit einem Punkt zu schreiben und die gewohnten Rechenregeln anzuwenden. Deshalb schreibt man häufig auch: a•b := ‹a,b›. Die Regeln werden dann zu: |
− | (a + b) | + | (a + b)•c = a•c + b•c |
− | a | + | a•(b + c) = a•b + a•c |
</div> | </div> | ||
* Kommutativität: ‹a,b›=‹b,a› | * Kommutativität: ‹a,b›=‹b,a› | ||
Zeile 27: | Zeile 28: | ||
=== Beispiel === | === Beispiel === | ||
==== Kugel - Ray - Intersection ==== | ==== Kugel - Ray - Intersection ==== | ||
− | Gegeben sei eine Kugel um den Mittelpunkt p mit | + | Gegeben sei eine Kugel um den Mittelpunkt p mit Radius r. Die Bedingung für Punkte x auf der Oberfläche der Kugel ist dann gegeben durch: |
||x-p||= r, | ||x-p||= r, | ||
d.h. der Abstand von x zu p entspricht dem Radius. | d.h. der Abstand von x zu p entspricht dem Radius. | ||
− | Andererseits sei ein Strahl mit Anfang o und | + | Andererseits sei ein Strahl mit Anfang o und Richtung d gegeben. Für Punkte x auf dem Strahl gilt also: |
x = o + t*d (t reel, größer gleich 0) | x = o + t*d (t reel, größer gleich 0) | ||
Um die Schnittpunkte von Kugel und Strahl zu berechnen, wollen wir den Strahl in die Kugel einsetzen: | Um die Schnittpunkte von Kugel und Strahl zu berechnen, wollen wir den Strahl in die Kugel einsetzen: | ||
||x - p|| = r | ||x - p|| = r | ||
− | ‹=› ||x - p|| | + | ‹=› ||x - p||<sup>2</sup> = r<sup>2</sup> (Quadrieren) |
− | ‹=› ||o + t*d - p|| | + | ‹=› ||o + t*d - p||<sup>2</sup> - r<sup>2</sup> = 0 |
− | ‹=› ||(o-p) + t*d|| | + | ‹=› ||(o-p) + t*d||<sup>2</sup> - r<sup>2</sup> = 0 (Definiere zur kurzen Schreibweise: e := o-p ) |
− | ‹=› ‹e + t*d, e + t*d› - r | + | ‹=› ‹e + t*d, e + t*d› - r<sup>2</sup> = 0 (||.||<sup>2</sup> als Skalarprodukt) |
− | ‹=› ‹e,e› + 2*‹e,t*d› + ‹t*d, t*d› - r | + | ‹=› ‹e,e› + 2*‹e,t*d› + ‹t*d, t*d› - r<sup>2</sup> = 0 |
− | ‹=› ||e|| | + | ‹=› ||e||<sup>2</sup> + 2*t*‹e,d› + ||t*d||<sup>2</sup> - r<sup>2</sup> = 0 |
− | ‹=› |t| | + | ‹=› |t|<sup>2</sup>*||d||<sup>2</sup> + 2*t*‹e,d› + ||e||<sup>2</sup> - r<sup>2</sup> = 0 |
− | Man kann ||d|| | + | Man kann ||d||<sup>2</sup>=‹d,d›, ‹e,d› und ||e||<sup>2</sup> - r<sup>2</sup> leicht berechnen und erhät so eine quadratische Gleichung für t, die man mit der Mitternachtsformel schnell löst (Anhand der "Determinante" kann man prüfen, ob überhaupt ein Schnitt vorliegt). Die höchstens 2 Lösungen von t kann man dann in den Strahl einsetzen und bekommt die Schnittpunkte. |
+ | |||
+ | === Siehe auch === | ||
+ | [[Vektorprodukt]] |
Aktuelle Version vom 22. Januar 2011, 18:58 Uhr
Inhaltsverzeichnis
Standardskalarprodukt
Übersicht
Das euklidische Standardskalarprodukt oder Punktprodukt dient in der 3D-Grafik meist zur Berechnung von Winkeln, kann jedoch sehr häufig auch eine Reihe anderer Zwecke erfüllen. Die Einsatzorte sind vielfältig, kann man doch damit Reflexionen, Bumpmapping, Collision Detection u.v.m. realisieren.
Definition
Zwei Vektoren a, b wird durch eine eindeutige Zahl ‹a,b› das Skalarprodukt zugeordnet:
‹a,b› := ||a||*||b||*cos(φ) 0≤φ≤π
Haben a, b also die Länge 1, so berechnet das Skalarprodukt ‹a,b› den Kosinus des Zwischenwinkels. Stehen beliebige Vektoren a, b senkrecht aufeinander, so ist der Winkel Pi/2, der Cosinus also 0 und damit das Skalarprodukt 0, wenn die beiden Vektoren senkrecht aufeinander stehen. (Beachte: Der Nullvektor ist senkrecht zu allen anderen Vektoren definiert, sogar zu sich selbst!)
Es lässt sich zeigen, dass man das Standardskalarprodukt sehr leicht berechnen kann. Seien a=(a1;a2;a3), b=(b1;b2;b3), dann gilt:
‹a,b› = a1*b1 + a2*b2 + a3*b3
Rechenregeln
- ‹a,a› entspricht der Länge von a im Quadrat, denn ‹a,a› = ||a||*||a||*Cos(0) = ||a||2
- Linearität in beiden Argumenten:
‹a + b, c› = ‹a,c› + ‹b,c› ‹a, b + c› = ‹a,b› + ‹a,c› ‹λ* a, b› = λ* ‹a,b› (λ reel) ‹a, λ* b› = λ* ‹a,b›
Es ist daher naheliegend, das Produkt mit einem Punkt zu schreiben und die gewohnten Rechenregeln anzuwenden. Deshalb schreibt man häufig auch: a•b := ‹a,b›. Die Regeln werden dann zu:
(a + b)•c = a•c + b•c a•(b + c) = a•b + a•c
- Kommutativität: ‹a,b›=‹b,a›
Beispiel
Kugel - Ray - Intersection
Gegeben sei eine Kugel um den Mittelpunkt p mit Radius r. Die Bedingung für Punkte x auf der Oberfläche der Kugel ist dann gegeben durch:
||x-p||= r,
d.h. der Abstand von x zu p entspricht dem Radius. Andererseits sei ein Strahl mit Anfang o und Richtung d gegeben. Für Punkte x auf dem Strahl gilt also:
x = o + t*d (t reel, größer gleich 0)
Um die Schnittpunkte von Kugel und Strahl zu berechnen, wollen wir den Strahl in die Kugel einsetzen:
||x - p|| = r ‹=› ||x - p||2 = r2 (Quadrieren) ‹=› ||o + t*d - p||2 - r2 = 0 ‹=› ||(o-p) + t*d||2 - r2 = 0 (Definiere zur kurzen Schreibweise: e := o-p ) ‹=› ‹e + t*d, e + t*d› - r2 = 0 (||.||2 als Skalarprodukt) ‹=› ‹e,e› + 2*‹e,t*d› + ‹t*d, t*d› - r2 = 0 ‹=› ||e||2 + 2*t*‹e,d› + ||t*d||2 - r2 = 0 ‹=› |t|2*||d||2 + 2*t*‹e,d› + ||e||2 - r2 = 0
Man kann ||d||2=‹d,d›, ‹e,d› und ||e||2 - r2 leicht berechnen und erhät so eine quadratische Gleichung für t, die man mit der Mitternachtsformel schnell löst (Anhand der "Determinante" kann man prüfen, ob überhaupt ein Schnitt vorliegt). Die höchstens 2 Lösungen von t kann man dann in den Strahl einsetzen und bekommt die Schnittpunkte.
Siehe auch