Macierz odbicia lustrzanego

Stronę tą wyświetlono już: 1185 razy

Poznane już zostały macierze obrotu Mo oraz macierze kosinusów kierunkowych Mc w związku z czym czas najwyższy dobrać się do macierzy odbić lustrzanych.

Odbicia lustrzane w układzie 2W względem osi x i y

Zanim przejdę do wyprowadzenia wzoru na macierz odbicia lustrzanego, rozpatrzę tutaj dwa najprostsze z możliwych przypadków odbić lustrzanych, którymi są odbicie względem osi x i odbicie względem osi y. Zerknijmy w tym celu na rysunek 1 i odpowiedzmy sobie na pytania: jak do licha będzie wyglądała macierz odbicia lustrzanego dla osi x.

Ilustracja przykładowego odbicia obiektu 2W względem osi x
Rys. 1
Ilustracja przykładowego odbicia obiektu 2W względem osi x.

Wykres wygenerowany w programie wxMaxima za pomocą następującego kodu:

Listing 1
  1. v: matrix([2],[0]);
  2. obj:matrix([0.5,1.5,1.5,1,1,0.5,0.5],[0.5,0.5,1,1,2,2,0.5]);
  3. Mlx: matrix([1, 0],[0, -1]);
  4. obj2: Mlx . obj;
  5. plot2d([[discrete, obj2[1], obj2[2]], [discrete, [0, v[1][1]], [0, v[2][1]]], [discrete, obj[1], obj[2]]],[x,-3,3],[y,-3,3],[gnuplot_term, "png size 500,500"], [gnuplot_out_file, "D:\OdbicieX.png"],[legend,"odbicie","lusterko","odbijane"]);

Powróćmy do pytania: jaką macierz trzeba utworzyć, aby przemnożona z wektorem V dała w wyniku wektor V' stanowiący odbicie lustrzane wektora V względem osi x. Odpowiedź jest banalnie prosta, ponieważ wystarczy zauważyć, że wypadkowaVx=Vx' a Vy=-Vy'. Z tego też wniosek, że macierz odbicia lustrzanego względem osi x musi wyglądać następująco:

Jeżeli weźmie się jakiś wektor i pomnoży z macierzą odbicia lustrzanego względem osi x z równania [1], otrzyma się punkt lustrzanego odbicia względem tejże osi.

Podobnie sprawa się ma z odbiciem względem osi y, co obrazuje rysunek 2.

Ilustracja przykładowego odbicia obiektu 2W względem osi y wygenerowana w programie wxMaxima
Rys. 2
Ilustracja przykładowego odbicia obiektu 2W względem osi y.

Wykres wygenerowany w programie wxMaxima za pomocą następującego kodu:

Listing 2
  1. v: matrix([0],[2]);
  2. obj:matrix([0.5,1.5,1.5,1,1,0.5,0.5],[0.5,0.5,1,1,2,2,0.5]);
  3. Mlx: matrix([-1, 0],[0, 1]);
  4. obj2: Mlx . obj;
  5. plot2d([[discrete, obj2[1], obj2[2]], [discrete, [0, v[1][1]], [0, v[2][1]]], [discrete, obj[1], obj[2]]],[x,-3,3],[y,-3,3],[gnuplot_term, "png size 500,500"], [gnuplot_out_file, "D:\OdbicieY.png"],[legend,"odbicie","lusterko","odbijane"]);

Macierz odbicia lustrzanego dl osi y będzie wyglądała w sposób następujący:

Odbicie lustrzane względem dowolnej osi w układzie 2W

Wyobraźmy sobie teraz taką sytuację, że jest sobie prosta przechodząca przez początek układu współrzędnych, względem której należy wykonać odbicie lustrzane. Załóżmy też, że dany jest kąta α, jaki tworzy ta prosta z osią x. I teraz zastanówmy się, co trzeba zrobić, aby otrzymać lustrzane odbicie? No, na razie nie wiemy jak odbić względem prostej nachylonej pod kątem α, ale wiemy jak dobijać względem osi x, a więc obróćmy lusterko wraz z odbijanym punktem o kąt , następnie zróbmy odbicie lustrzane tego punktu względem osi x i na koniec obróćmy nasze lusterko wraz z wektorem odbitym o kąt α. W ten sposób wyprowadzić można ogólny wzór na odbicie wektora względem osi ułożonej pod dowolnym kątem α.

Rozpiszmy więc nasze równanie wyznaczające macierz lustrzanego odbicia względem osi nachylonej o kąt α:

Końcowa postać obliczeń [3] wynika z zastosowania [14] oraz [15] z strony Matematyka → Funkcje → Funkcje trygonometryczne. Na poniższym rysunku widać animację z zastosowaniem wzoru [3] w praktyce.

Animacja odbicia lustrzanego względem zmieniającej się osi odbicia.
Rys. 3
Animacja odbicia lustrzanego względem zmieniającej się osi odbicia.

Klatki animacji wygenerowane przez program wxMaxima za pomocą następującego kodu:

Listing 3
  1. for i: 0 thru 72 do(
  2. obj:matrix([0.5,1.5,1.5,1,1,0.5,0.5],[0.5,0.5,1,1,2,2,0.5]),
  3. da: i * 5 * %pi / 180,
  4. Ml: float(matrix([cos(2*da), sin(2*da)], [sin(2*da), -cos(2*da)])),
  5. obj2: Ml . obj,
  6. plot2d([[discrete, obj2[1], obj2[2]], [discrete, obj[1], obj[2]]],[x,-3,3],[y,-3,3],[gnuplot_term, "png size 500,500"], [gnuplot_out_file, printf(false,"C:\\Odbicie ~f.png",i)],[legend,"odbicie","odbijane"])
  7. )$

Animacja poskładana w programie Gimp

Możliwe jest również rozpisanie wersji wzoru [3] z zastosowaniem macierzy kosinusów kierunkowych dla danego wektora kierunkowego Vk:

Gdzie ik oraz jk są wersorami, które wylicza się za pomocą wzorów [1] oraz [2] z strony Matematyka → Wektory → Obrót wektora za pomocą wektora kierunkowego.

Animacja odbicia lustrzanego zrealizowanego za pomocą macierzy kosinusów kierunkowych Mc utworzonej na podstawie wektora kierunkowego Vk.
Rys. 4
Animacja odbicia lustrzanego zrealizowanego za pomocą macierzy kosinusów kierunkowych Mc utworzonej na podstawie wektora kierunkowego Vk.

Klatki animacji wygenerowane przez program wxMaxima za pomocą następującego kodu:

Listing 4
  1. xo: 2;
  2. yo: 0;
  3. da: 5 * %pi / 180;
  4. ik: matrix([xo], [yo]) * 1 / sqrt(xo^2+yo^2);
  5. jk: matrix([-ik[2][1]],[ik[1][1]]);
  6. obj:matrix([0.5,1.5,1.5,1,1,0.5,0.5],[0.5,0.5,1,1,2,2,0.5]);
  7. Mk: matrix([ik[1][1], ik[2][1]],[jk[1][1], jk[2][1]]);
  8. Mkt: transpose(Mk);
  9. Mo: matrix([1,0],[0,-1]);
  10. Moc: float(Mkt . Mo . Mk);
  11. obj2: Moc . obj;
  12. Mrot: float(matrix([cos(da), -sin(da)],[sin(da),cos(da)]));
  13. for i: 0 thru 71 do(
  14. Mk: matrix([ik[1][1], ik[2][1]],[jk[1][1], jk[2][1]]),
  15. Mkt: transpose(Mk),
  16. Moc: float(Mkt . Mo . Mk),
  17. obj2: Moc . obj,
  18. plot2d([[discrete, obj2[1], obj2[2]], [discrete, [0, ik[1][1]*2], [0, ik[2][1]*2]], [discrete, obj[1], obj[2]]],[x,-3,3],[y,-3,3],[gnuplot_term, "png size 500,500"], [gnuplot_out_file, printf(false,"C:\\Odbicie ~f.png",i)],[legend,"odbicie","lusterko","odbijane"]),
  19. ik: Mrot . ik,
  20. jk: Mrot . jk)$

Animacja poskładana w programie Gimp

Odbicie lustrzane z powyższej animacji obiektu w przestrzeni 3W przez płaszczyznę obracającą się względem osi z pokazuje animacja z rysunku 5.

Animacja odbicia lustrzanego płaszczyzną prostopadłą do płaszczyzny <b>xy</b> obracającą się względem osi z.
Rys. 5
Animacja odbicia lustrzanego płaszczyzną prostopadłą do płaszczyzny xy obracającą się względem osi z.

Klatki animacji wygenerowane przez program wxMaxima.

Animacja poskładana w programie Gimp

Odbicia lustrzane w 3W

Jeżeli dany jest wektor W, którego wartość |W|≠0, to wersor tego wektora vec{n}={{vec{W}}/{delim{|}{vec{W}}{|}}} może posłużyć do wyznaczenia macierzy odbicia lustrzanego względem płaszczyzny prostopadłej do wektorów W oraz n poprzez zastosowanie następującego wzoru:

gdzie:

  • I - macierz jednostkowa;
  • n - wersor wektora W;
  • nT - transpozycja wersora wektora W

Jeżeli kogoś interesuje wyprowadzenie tego wzoru, to odsyłam do wykładu na youtube gdzie zostało to omówione bardzo dokładnie. Ja jedynie pokażę tutaj jeszcze dwa przykłady szczególnych rodzajów odbić. Pierwszy z nich dotyczy odbicia względem płaszczyzny prostopadłej do płaszczyzny XZ i obracającej się względem osi y.

Animacja odbicia lustrzanego płaszczyzną prostopadłą do płaszczyzny xz obracającej się względem osi y.
Rys. 6
Animacja odbicia lustrzanego płaszczyzną prostopadłą do płaszczyzny xz obracającej się względem osi y.

Klatki animacji wygenerowane przez program wxMaxima.

Animacja poskładana w programie Gimp

Ostatni przypadek szczególny to odbicia względem płaszczyzn prostopadłych do płaszczyzny YZ, animacja tego przypadku widoczna jest na rysunku 7.

Animacja odbicia lustrzanego płaszczyzną prostopadłą do płaszczyzny yz obracającej się względem osi x.
Rys. 7
Animacja odbicia lustrzanego płaszczyzną prostopadłą do płaszczyzny yz obracającej się względem osi x.

Klatki animacji wygenerowane przez program wxMaxima.

Animacja poskładana w programie Gimp

Dla przykładowego ogólnego przypadku obracanej płaszczyzny względem osi z, której początkowy wektor prostopadły vec{W}=delim{[}{ matrix{3}{1}{ {1} {1} {1} } }{]} poniżej zamieszczam animację.

Animacja odbicia lustrzanego płaszczyzną daną wektorem prostopadłym W obracającą się względem osi z.
Rys. 8
Animacja odbicia lustrzanego płaszczyzną daną wektorem prostopadłym W obracającą się względem osi z.

Klatki animacji wygenerowane przez program wxMaxima.

Animacja poskładana w programie Gimp

Odbicie lustrzane płaszczyzną daną równaniem

Zdarza się czasami, że dane jest następujące ogólne równanie płaszczyzny płaskiej:

I pierwsze spostrzeżenie jest takie, że gdy parametr D≠0, to płaszczyzna nie przechodzi przez początek układu współrzędnych. W takim przypadku trzeba się pozbyć tego parametru D przesuwając płaszczyznę o wektor. Ten wektor jest dowolnym punktem leżącym na danej płaszczyźnie, ja jednak wybiorę sobie punkt, którego wypadkowa z dla x=0 i y=0 przyjmuje następującą wartość:

Szukany wektor przesunięcia płaszczyzny ma więc następującą postać:

Smutna wiadomość jest taka, że dany nam wektor przesunięcia Wp trzeba również dodać do wszystkich odbijanych wektorów.

Dla uproszczenia sprawy załóżmy, że równanie płaszczyzny ma postać z parametrem D=0:

Zadanie sprowadza się do znalezienia i unormowania dowolnego wektora normalnego tejże płaszczyzny. Wektor normalny płaszczyzny to nic innego jak wektor prostopadły do płaszczyzny. Jak więc wyznaczyć ten wektor? Otóż tak się składa, że parametry A, B oraz C tworzą taki wektor normalny w następujący sposób:

Jak już dalej postępować z takim wektorem normalnym Wn była mowa już wcześniej.

Odbicie lustrzane płaszczyzną daną trzema wektorami

Jeżeli dane są trzy wektory V1, V2 i V3 takie, że nie są one współliniowe to jako należy stworzyć dwa wektory zastępcze VA i VB w sposób następujący:

Wektor normalny Vn można wyznaczyć korzystając z iloczynu wektorowego, czyli za pomocą następującego wzoru:

W znacznie prostszym przypadku, gdy dane są dwa wektory V1 i V2, które nie są współliniowe i wyznaczają jedną płaszczyznę w przestrzeni, w takim przypadku wzór [13] przyjmuje postać następującą:

Jak dalej postępować z takim wektorem normalnym Vn była mowa już wcześniej.

Odbicie lustrzane za pomocą macierzy obrotu.

Dla uproszczenia załóżmy, że dany jest wektor normalny Vn ale nie zapisany we współrzędnych kartezjańskich jako wypadkowe x, y i z lecz we współrzędnych sferycznych jako promień R, kąt α, jaki tworzy rzut prostopadły wektora w współrzędnych kartezjańskich na płaszczyznę XY z osią x oraz kąt Θ zawarty pomiędzy wcześniej wspomnianym rzutem na os XY a wektorem zapisanym we współrzędnych kartezjańskich.

Ilustracja pokazująca współrzędne sferyczne we współrzędnych kartezjańskich.
Rys. 9
Ilustracja pokazująca współrzędne sferyczne we współrzędnych kartezjańskich.

Wyraźmy sobie współrzędne sferyczne w współrzędnych kartezjańskich:

Cała sztuczka polega na tym, aby obrócić płaszczyznę, przez którą przechodzi wektor normalny Vn będącą płaszczyzną prostopadłą do płaszczyzny XY o kąt w sposób następujący:

Jak widać wektor Vn obrócony o kąt musi się znaleźć w płaszczyźnie XY. Wektor Vn->XY został pokazany na rysunku 10.

Obrót o kąt -α
Rys. 10
Obrót o kąt

Pozostało już tylko obrócić wektor Vn->XY tak, aby pokrył się on z osią X układu współrzędnych kartezjańskich. Zrobić to można mnożąc wektor Vn->XY przez macierz obrotu względem osi y o kąt :

Po obróceniu wektora Vn->XY otrzymuje się wektor Vn->X, który musi być równoległy do osi x (tak jak to pokazano na rysunku 11).

Obrót o kąt teta
Rys. 11
Obrót o kąt θ.

Składając w całość macierze z wyrażenia [16] oraz [17] tworzy się macierz obrotu dla dowolnego wektora V.

Dzięki macierzy Mo można obrócić dowolny wektor V wraz z wektorem normalnym Vn doprowadzając tym samym do obrócenia płaszczyzny lustrzanego odbicia w płaszczyźnie YZ, a macierz odbicia względem tej płaszczyzny jest następująca:

Ostatecznie więc odbicie lustrzane za pomocą macierzy obrotów Mo będzie wyglądać następująco:

Można oczywiście znaleźć wzór przeliczający współrzędne punktu zapisanego w układzie sferycznym i są to funkcje związane z arsin-usem i arcos-nusem.

Odbicie lustrzane przy użyciu macierzy kosinusów kierunkowych

Ostatnim znanym mi sposobem uzyskiwania obrazu odbitego przez płaszczyznę prostopadłą do pewnego wektora normalnego Vn jest metodą składania obrotów za pomocą macierzy kosinusów kierunkowych. Metoda w zasadzie podobna do poprzedniej, z tą tylko różnicą, że tutaj nie będziemy operować na kątach a na wersorach.

W pierwszej kolejności obrócić należy płaszczyznę prostopadłą do płaszczyzny XY za pomocą wektora kierunkowego. Wektorem kierunkowym jest wektor Vn z pominięciem składowej Vn->z. Na rysunku 12 można zobaczyć wersory wektora kierunkowego ixy oraz jxy, które należy wyznaczyć.

Wektor V i wersory wektora kierunkowego leżącego w płaszczyźnie XY.
Rys. 12
Wektor V i wersory wektora kierunkowego leżącego w płaszczyźnie XY.

Wyznaczmy więc potrzebne wersory w następujący sposób:

W powyższych wzorach oznaczenie ->x oznacza wyciągnięcie danej wypadkowej wektora, w tym przypadku wypadkowej x

Skoro znane są już wersory, to można już śmiało tworzyć macierz kosinusów kierunkowych dla płaszczyzny XY w sposób następujący:

Obracamy nasz wektor normalny Vn tak, aby pokrywał się on z płaszczyzną XZ:

Wektor kierunkowy Vn obrócony względem osi Z do płaszczyzny XZ można zobaczyć teraz na poniższym rysunku.

Wektor Vn i wersory wektora kierunkowego leżącego w płaszczyźnie XZ.
Rys. 13
Wektor Vn i wersory wektora kierunkowego leżącego w płaszczyźnie XZ.

Wyznaczmy sobie wersory iXZ oraz jXZ wektora kierunkowego Vn->XY w sposób następujący:

Macierz kosinusów kierunkowych Mc->XZ:

Poskładajmy w jedną całość macierz obrotu:

Pozostało już napisanie równania odbicia lustrzanego:

Poprzez przemnożenie wektora normalnego Vn przez macierz obrotu Mo wektor ten będzie równoległy do osi x jak na rysunku 14.

Wektor Vn obrócony na oś X.
Rys. 14
Wektor Vn obrócony na oś X.

Na koniec niczym wisienka na torcie, powiem Wam, że można to całe składanie macierzy obrotu Mo, która jest także macierzą kosinusów kierunkowych Mc zrealizować w dużo prostszy sposób poprzez obliczenie wersorów i', j' oraz k' pokazanych na rysunku 15.

[rys] src="rysunki/obr3d.png" alt="Wersory i', j' oraz k' niezbędne do utworzenia macierzy obrotu Mo" nr="15" description="Wersory i', j' oraz k' niezbędne do utworzenia macierzy obrotu Mo."

Wersor i' można (a nawet trzeba) wyznaczyć normując wektor normalny Vn w sposób następujący:

Wersor j' prostopadły do niego i leżący na płaszczyźnie odbicia lustrzanego wyznacza wzór:

Oraz trzeci wersor k' prostopadły do pozostałych dwóch:

Teraz pozostaje nic innego, jak poskładać macierz obrotu Mo w sposób następujący:

Strony powiązane
strony powiązane
  1. Symetrie i Lustrzane Odbicie - Macierz Odbicia 3D - wykład na YouTube Mateusza Kowalskiego

Komentarze