Obrót wektora o kąt

Autor podstrony: Krzysztof Zajączkowski

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

Dla danego dwuwymiarowego wektora a można zapisać następującą zależność wypadkowych x, y od długości L i kąta α:

gdzie:

Graficzna interpretacja zależności kąta alfa, długości wektora L z wypadkowymi x, y
Rys. 1
Graficzna interpretacja zależności kąta α oraz wartości wektora L z wypadkowymi x, y.

Załóżmy teraz, że obracając wektor a względem środka układu współrzędnych o zadany kąt β uzyskiwany jest wektor a'. Obrót wektora a można więc zapisać następująco:

gdzie:

Przejście z drugiego członu równania [2] do członu trzeciego umożliwiło zastosowanie wzorów [26], [27] znajdujących się w dziale Matematyka → Funkcje → Funkcje trygonometryczne. Dzięki owym wzorom można obracać dany wektor względem początku układu współrzędnych nie martwiąc się przy tym o początkową wartość kąta położenia wektora obracanego. Stanowi to wielkie udogodnienie dla programów posługujących się grafiką wektorową (i nie tylko), wiele gier i programów graficznych wykorzystuje tą metodę chociażby do obracania bitmap, czy też dwuwymiarowych grafik wektorowych.

Graficzna interpretacja obrotu wektora a o kąt beta
Rys. 2
Graficzna interpretacja obrotu wektora a o zadaną wartość kąta β.

Istnieje również możliwość zapisu obrotu wektora 2W o zadany kąt β za pomocą mnożenia obracanego wektora a przez macierz obrotu w następujący sposób:

Przykładowy rysunek-animacja dla obrotu obiektu płaskiego względem początku układu współrzędnych znajduje się poniżej.

Animacja obrotu przykładowego obiektu o zadany kąt.
Rys. 3
Animacja obrotu przykładowego obiektu o zadany kąt.

Poszczególne klatki animacji wygenerowane zostały w programie wxMaxima za pomocą następującego kodu:

x1:2; y1:1; xo: 2; yo: 0; da: 5 * %pi / 180; v: matrix([x1],[y1]); ik: matrix([xo], [yo]) * 1 / sqrt(xo^2+yo^2); jk: matrix([-ik[2][1]],[ik[1][1]]); obj:matrix([0.5,1.5,1.5,1,1,0.5,0.5],[0.5,0.5,1,1,2,2,0.5]); Mk: matrix([ik[1][1], jk[1][1]],[ik[2][1], jk[2][1]]); obj2: float(Mk . obj); l: float(sqrt(v2[1][1]^2+v2[2][1]^2)-sqrt(v[1][1]^2+v[2][1]^2)); Mrot: float(matrix([cos(da), -sin(da)],[sin(da),cos(da)])); i:0; for i: 0 thru 71 do( Mk: matrix([ik[1][1], jk[1][1]],[ik[2][1], jk[2][1]]), obj2: float(Mk . obj), ik: Mrot . ik, jk: Mrot . jk, 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:\\obr2 ~f.png",i)],[legend,printf(false,"obrocenie o kat ~f",da*i/%pi * 180),"obracany"]) )$

Animacja poskładana w programie Gimp.

Obrót punktu a względem dowolnego punktu b można potraktować jako obrót punktu a-b względem środka układu współrzędnych z dodaniem do obróconego wektora wektora b w następujący sposób:

Dla lepszego zrozumienia warto zerknąć na rysunek 4, gdzie jak widać obrót wykonywany jest na punkcie a-b otrzymując obrócony punkt (a-b)'. W celu wyznaczenia poszukiwanego punktu a' konieczne staje się dodanie do punktu (a-b)' punktu b. W punkcie obrotu b można umieścić przesunięty układ współrzędnych x'y', który umożliwia zastosowanie wzoru [3] do obrócenia wektora (a-b) o kąt β.

Graficzna interpretacja obrotu punktu a o kąt beta względem punku b
Rys. 4
Graficzna interpretacja obrotu punktu a o zadaną wartość kąta β względem punktu b.

Skoro obczailiśmy już obroty wektora 2W najwyższy czas już nastał aby obczaić obroty wektora 3W. Podejrzewam, że nie będzie dla nikogo wielkim zaskoczeniem gdy napiszę, że obrót wektora 2W jest pewnym uproszczeniem obrotów wektorów 3W a ściślej rzecz ujmując, jest to przypadek obrotu wektora leżącego równolegle do płaszczyzny xy względem osi z. Żeby nie przynudzać zbytnio przejdę do konkretów, czyli do wzoru na obrót wektora 3W względem osi z:

Poniżej zamieszczam animację obrotu przykładowego obiektu wokół osi z.

Animacja obrotu przykładowego obiektu względem osi z.
Rys. 5
Animacja obrotu przykładowego obiektu względem osi z.

Poszczególne klatki animacji wygenerowane w programie wxMaxima

Animacja poskładana w programie Gimp

Analogiczny wzór można napisać dla obrotu punktu względem osi y:

oraz wzór na obrót względem osi x:

Możliwy jest obrót punktu a wokół osi równoległej do osi z układu współrzędnych, przechodzącej przez zadany punkt b w następujący sposób:

Jak widać we wzorze [8] pominięta została składowa bz ponieważ dla obrotu względem osi równoległej do osi z składowa bz nie wpływa na wynik obliczeń. W analogiczny sposób można zapisać wzór na obrót punktu względem osi równoległej do osi y i przechodzącej przez punkt b:

Oczywiście dla obrotu punktu a względem osi równoległej do osi x i przechodzącej przez punkt b również można zapisać następujący wzór:

Obrót punktu o kąty: 90°, 180°, 270° można zrealizować w znacznie prostszy sposób w oparciu o rysunek 4. Z owego rysunku wynika, że odpowiednie przestawienie współrzędnych wektora a z uwzględnieniem zmiany znaków umożliwia dużo łatwiejsze uzyskanie obróconego punktu. Metodę tą stosuje się w programowaniu, gdy obrót punktu w danym przypadku zawsze jest równy jednej z wymienionych wcześniej wartości kątów.

Graficzna interpretacja obrotu punktu a o kąt 90, 180 i 270 stopni
Rys. 6
Graficzna interpretacja obrotu punktu a o kąt 90°, 180° i 270°.

Tą samą metodą można obracać dany wektor a względem osi układu współrzędnych 3W, przykład obrotu takiego wektora względem osi z o kąty 90°, 180° oraz 270° można zobaczyć na rysunku 7.

Graficzna interpretacja obrotu punktu a o kąt 90, 180 i 270 stopni względem osi z
Rys. 7
Graficzna interpretacja obrotu punktu a o kąt 90°, 180° i 270° względem osi z.