Obrót wektora za pomocą wektora kierunkowego

Autor podstrony: Krzysztof Zajączkowski

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

Obrotu punktu 2W można dokonać za pomocą wektora kierunkowego, którego wartość nie może być równa zero. Kąt α zawarty pomiędzy wektorem kierunkowym a wersorem osi x stanowi kąt obrotu zadanego punktu. Konieczne jest uzyskanie dwóch wektorów jednostkowych: pierwszego równoległego do wektora kierunkowego, oraz drugiego prostopadłego do wektora kierunkowego. Jeżeli przez Vk oznaczyć wektor kierunkowy, to wartości wyżej wymienionych jednostkowych wektorów kierunkowych dane są następującymi zależnościami:

Równanie [1] [1]

Zapis wyrażenia w formacie TeX-a:

\vec{i}\,'=\vec{V}_k\cdot \frac{1}{\left|\vec{V}_k\right|}
Równanie [2] [2]

Zapis wyrażenia w formacie TeX-a:

\vec{j}\,'=\begin{bmatrix}-i_y\,'\\ i_x\,'\end{bmatrix}

Wektory jednostkowe i', j' są wersorami nowego układu współrzędnych obróconego o kąt α zawarty między wektorem kierunkowym a wersorem osi x. W celu lepszego zrozumienia warto zerknąć na rysunek 1.

Graficzna interpretacja wektora kierunkowego i wersorów i', j'
Rys. 1
Graficzna interpretacja wektora kierunkowego i wersorów i', j'.

Obrót danego wektora 2W realizuje się poprzez jego przemnożenie przez macierz kosinusów w następujący sposób:

Równanie [3] [3]

Zapis wyrażenia w formacie TeX-a:

\vec{P}\,'=M_c\cdot \vec{P}=\begin{bmatrix}\vec{i}\circ \vec{i}\,' & \vec{i}\circ \vec{j}\,'\\ \vec{j}\circ \vec{i}\,' & \vec{j}\circ \vec{j}\,'\end{bmatrix}\cdot \begin{bmatrix}P_x\\ P_y \end{bmatrix}=\begin{bmatrix}P_x\cdot \vec{i}\circ \vec{i}\,'+P_y\cdot \vec{i}\circ \vec{j}\,'\\P_x\cdot \vec{j}\circ \vec{i}\,'+P_y\cdot \vec{j}\circ \vec{j}\,'\end{bmatrix}

Odwrotna transformacja również jest możliwa poprzez przemnożenie wektora P' przez transponowaną macierz kosinusów z równania [3]:

Równanie [4] [4]

Zapis wyrażenia w formacie TeX-a:

\vec{P}=M_c^T\cdot \vec{P}=\begin{bmatrix}\vec{i}\circ \vec{i}\,' & \vec{j}\circ \vec{i}\,'\\ \vec{i}\circ \vec{j}\,' & \vec{j}\circ \vec{j}\,' \end{bmatrix}\cdot \begin{bmatrix}P_x\,'\\ P_y\,'\end{bmatrix}=\begin{bmatrix}P_x\cdot \vec{i}\circ \vec{i}\,'+P_y\cdot \vec{j}\circ \vec{i}\,'\\P_x\cdot \vec{i}\circ \vec{j}\,'+P_y\cdot \vec{j}\circ \vec{j}\,'\end{bmatrix}

Wzór [3] umożliwia transformację współrzędnych punktu P z układu współrzędnych xy do układu x'y', natomiast wzór [4] umożliwia odwrotną transformację. Obrócony punkt P w układzie współrzędnych xy przyjmuje współrzędne punktu P' otrzymanego przy użyciu wzoru [3].

Animacja obrotu przykładowego obiektu za pomocą wektora kierunkowego.
Rys. 2
Animacja obrotu przykładowego obiektu za pomocą wektora kierunkowego.

Poszczególne klatki animacji wygenerowane 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), 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:\\obr\\obr ~f.png",i)],[legend,"obrocenie","wektor kierunkowy","obracany"]), ik: Mrot . ik, jk: Mrot . jk)$

Animacja poskładana w programie Gimp

Zapewne nie będzie dla nikogo wielkim zaskoczeniem jeśli powiem, że w podobny sposób można obrócić punktu 3W. Jedyną różnicą jest sposób że tak to ujmę pozyskiwania wersorów i', j', k'. Wektor kierunkowy Vk również w tym przypadku jest równoległy do wersora i', a więc wypadkowe owego wersora można obliczyć korzystając z wzoru [1]. Jeżeli wersor i' nie jest równy tożsamościowo wersorowi i, wtedy wersory j', k' można obliczyć w następujący sposób:

Równanie [5] [5]

Zapis wyrażenia w formacie TeX-a:

\vec{j}\,'=\frac{vec{i}\times \vec{i}\,'}{\left|\vec{i}\times \vec{i},'\right|}
Równanie [6] [6]

Zapis wyrażenia w formacie TeX-a:

\vec{k}\,'=\frac{\vec{j}\,'\times \vec{i}\,'}{\left|\vec{j}\,'\times \vec{i}\,'\right|}

Gdy i jest równe tożsamościowo i' wtedy j'=j, k'=k.

Znając wartości poszczególnych wersorów w układzie primowanym można obliczyć współrzędne punktu P w następujący sposób:

Równanie [7] [7]

Zapis wyrażenia w formacie TeX-a:

\vec{P}\,'=M_c\cdot \vec{P}=\begin{bmatrix}\vec{i}\circ \vec{i}\,' & \vec{i}\circ \vec{j}\,' & \vec{i}\circ \vec{k}\,'\\ \vec{j}\circ \vec{i}\,' & \vec{j}\circ \vec{j}\,' & \vec{j}\circ \vec{k}\,'\\ \vec{k}\circ \vec{i}\,' & \vec{k}\circ \vec{j}\,' & \vec{k}\circ \vec{k}\,'\end{bmatrix}\cdot \begin{bmatrix} P_x\\P_y\\P_z\end{bmatrix}=\begin{bmatrix}P_x\cdot \vec{i}\circ \vec{i}\,' + P_y\cdot \vec{i}\circ \vec{j}\,'+P_z\cdot \vec{i}\circ \vec{k}\,'\\ P_x\cdot \vec{j}\circ \vec{i}\,' + P_y\cdot \vec{j}\circ \vec{j}\,'+P_z\cdot \vec{j}\circ \vec{k}\,'\\P_x\cdot \vec{k}\circ \vec{i}\,' + P_y\cdot \vec{k}\circ \vec{j}\,'+P_z\cdot \vec{k}\circ \vec{k}\,'\end{bmatrix}

Oczywiście odwrotny obrót lub transformacja współrzędnych jest również możliwa:

Równanie [8] [8]

Zapis wyrażenia w formacie TeX-a:

\vec{P}\,=M_c^T\cdot \vec{P}\,'=\begin{bmatrix}\vec{i}\circ \vec{i}\,' & \vec{j}\circ \vec{i}\,' & \vec{k}\circ \vec{i}\,'\\ \vec{i}\circ \vec{j}\,' & \vec{j}\circ \vec{j}\,' & \vec{k}\circ \vec{j}\,'\\ \vec{i}\circ \vec{k}\,' & \vec{j}\circ \vec{k}\,' & \vec{k}\circ \vec{k}\,'\end{bmatrix}\cdot \begin{bmatrix} P_x\,'\\ P_y\,'\\ P_z\,'\end{bmatrix}=/begin{bmatrix}P_x\,'\cdot \vec{i}\circ \vec{i}\,' + P_y\,'\cdot \vec{j}\circ \vec{i}\,'+P_z\,'\cdot \vec{k}\circ \vec{i}\,'\\ P_x\,'\cdot \vec{i}\circ \vec{j}\,' + P_y\,'\cdot \vec{j}\circ \vec{j}\,'+P_z\,'\cdot \vec{k}\circ \vec{j}\,'\\ P_x\,'\cdot \vec{i}\circ \vec{k}\,' + P_y\,'\cdot \vec{k}\circ \vec{j}\,'+P_z\,'\cdot \vec{k}\circ \vec{k}\,'\end{bmatrix}

Co komu jednak z takiego obrotu? Odpowiedź jest prosta: dzięki takiej transformacji można obracać obiekt o zadany kąt względem dowolnie skierowanej osi, a to dlatego, że obierając za oś obrotu wektor kierunkowy i transformując go do współrzędnych układu primowanego ten wektor "ustawia się" w osi x a względem osi x to już wiadomo jak obracać. Wzór na obrót względem dowolnej osi danej wektorem V jest więc następujący:

Równanie [9] [9]

Zapis wyrażenia w formacie TeX-a:

\vec{V}'=M_c\,^T\cdot M_o\cdot M_c\cdot \vec{V}

Na poniższej animacji-rysunku można zobaczyć efekt obrotu obiektu względem osi danej wektorem vec{V}=delim{[}{matrix{3}{1}{{1} {-1} {1}}}{]} o kąt α.

Animacja obrotu przykładowego obiektu w 3W względem przykładowo obranej osi.
Rys. 3
Animacja obrotu przykładowego obiektu w 3W względem przykładowo obranej osi.

Poszczególne klatki animacji wygenerowane w programie wxMaxima

Animacja poskładana w programie Gimp

Zadanie 1

Obrócić wektor V1 wektorem kierunkowym V2.

vec{V_1}=begin{bmatrix}{-1 \ 2}end{bmatrix};,vec{V_2}=begin{bmatrix}{1 \ 1}end{bmatrix}

Zacząć należy od wyznaczenia wersorów i2 oraz j2 wykorzystując w tym celu wzory [1] i [2].

vec{i_2}=frac{vec{V_2}}{left|vec{V_2} right|}=begin{bmatrix}{frac{1}{sqrt{2}} \ frac{1}{sqrt{2}}}end{bmatrix} = begin{bmatrix}{frac{sqrt{2}}{2} \ frac{sqrt{2}}{2}}end{bmatrix}

vec{j_2}=begin{bmatrix}{-i_{2y}  i_{2x}}end{bmatrix}=begin{bmatrix}{-frac{sqrt{2}}{2} \ frac{sqrt{2}}{2}}end{bmatrix}

Teraz, gdy wersory zostały wyznaczone, obliczyć należy macierz kosinusów Mc zgodnie z wzorem macierzy zawartej w równaniu [3].

M_c=begin{bmatrix}{vec{i}circvec{i_2} & vec{i}circvec{j_2} \ vec{j}circvec{i_2} & vec{j}circvec{j_2}}end{bmatrix}=begin{bmatrix}{1cdotfrac{sqrt{2}}{2}+0cdotfrac{sqrt{2}}{2} & 1cdotleft(-frac{sqrt{2}}{2}right)+0cdotfrac{sqrt{2}}{2} \ 0cdotfrac{sqrt{2}}{2}+1cdotfrac{sqrt{2}}{2} & 0cdotleft(-frac{sqrt{2}}{2}right)+1cdotfrac{sqrt{2}}{2}}end{bmatrix}=begin{bmatrix}{frac{sqrt{2}}{2} & -frac{sqrt{2}}{2} \ frac{sqrt{2}}{2} & frac{sqrt{2}}{2}}end{bmatrix}

Pozostało pomnożyć macierz kosinusów Mc z wektorem V1 zgodnie z wzorem [3]:

vec{V_1}'=M_ccdotvec{V_1}=begin{bmatrix}{frac{sqrt{2}}{2} & -frac{sqrt{2}}{2} \ frac{sqrt{2}}{2} & frac{sqrt{2}}{2}}end{bmatrix}cdotbegin{bmatrix}{-1  2}end{bmatrix}=begin{bmatrix}{frac{sqrt{2}}{2}cdot(-1) - frac{sqrt{2}}{2}cdot 2 \ frac{sqrt{2}}{2}cdot(-1) + frac{sqrt{2}}{2}cdot 2}end{bmatrix}=begin{bmatrix}{-frac{3cdot sqrt{2}}{2} \ frac{ sqrt{2}}{2}}end{bmatrix}

Zadanie 2

Obrócić wektor V3 o kąt zawarty pomiędzy wektorami V1 i V2.

vec{V_1}=egin{bmatrix}{1  2}end{bmatrix};,vec{V_2}=egin{bmatrix}{2  1}end{bmatrix};,vec{V_3}=egin{bmatrix}{-2  -1}end{bmatrix}

Obliczanie wersorów dla wektora V1:

vec{i_1}=frac{vec{V_1}}{left|vec{V_1} 
ight|}=egin{bmatrix}{frac{1}{sqrt{5}}  frac{2}{sqrt{5}}}end{bmatrix} = egin{bmatrix}{frac{sqrt{5}}{5}  frac{2cdotsqrt{5}}{5}}end{bmatrix}

Obliczanie wersorów dla wektora V2:

vec{i_2}=frac{vec{V_2}}{left|vec{V_2} 
ight|}=egin{bmatrix}{frac{2}{sqrt{5}}  frac{1}{sqrt{5}}}end{bmatrix} = egin{bmatrix}{frac{2cdotsqrt{5}}{5}  frac{sqrt{5}}{5}}end{bmatrix}

vec{j_2}=egin{bmatrix}{-i_{2y}  i_{2x}}end{bmatrix}=egin{bmatrix}{-frac{sqrt{5}}{5}  frac{2cdotsqrt{5}}{5}}end{bmatrix}

Wyliczam macierz kosinusów Mc:

M_c=egin{bmatrix}{vec{i_1}circvec{i_2} & vec{j_1}circvec{i_2}  vec{i_1}circvec{j_2} & vec{j_1}circvec{j_2}}end{bmatrix}=egin{bmatrix}{ frac{sqrt{5}}{5}cdotfrac{2cdotsqrt{5}}{5}+frac{2cdotsqrt{5}}{5}cdot frac{sqrt{5}}{5} & frac{2cdotsqrt{5}}{5}cdotleft( frac{2cdotsqrt{5}}{5} 
ight)}+frac{sqrt{5}}{5}cdotfrac{sqrt{5}}{5}  frac{sqrt{5}}{5}cdotleft(-frac{sqrt{5}}{5}
ight)+frac{2cdotsqrt{5}}{5}cdot frac{2cdotsqrt{5}}{5} & -frac{2cdotsqrt{5}}{2}cdotleft(-frac{sqrt{5}}{5}
ight)+frac{sqrt{5}}{5}cdotfrac{2cdotsqrt{5}}{5}end{bmatrix}=egin{bmatrix}{frac{4}{5} & -frac{3}{5}  frac{3}{5} & frac{4}{5}}end{bmatrix}

Obracanie wektora V3:

vec{V_3'}=M_{c}cdotvec{V_3}=egin{bmatrix}{frac{4}{5} & -frac{3}{5}  frac{3}{5} & frac{4}{5}}end{bmatrix}cdotegin{bmatrix}-2  -1end{bmatrix}=egin{bmatrix}frac{4}{5}cdot(-2)-frac{3}{5}cdot(-1)  frac{3}{5}cdot(-2)+frac{4}{5}cdot(-1)end{bmatrix}=egin{bmatrix}-1  -2end{bmatrix}