RU: Linear Transformation

Геометрические примитивы

Линейное преобразование

В настоящем разделе мы рассмотрим линейные преобразования точек пространства. Обратим внимание на то, что преобразование более сложных объектов (вектор, кривая, поверхность) сводится к преобразованию принадлежащих им точек.

В OpenCascade ортогональное линейное преобразование описывается объектом класса gp_Trsf, а для описания общего линейного преобразования предназначен класс gp_GTrsf.

Математическое введение

В декартовой системе координат положение точки $A(\mathbf{r}_{A})$ задается тремя координатами:

(1)
\begin{align} \mathbf{r}_{A}= x_{A}\mathbf{i} + y_{A}\mathbf{j}+ z_{A}\mathbf{k} \end{align}

При линейном преобразовании пространства точка $A$ с радиус-вектором $\mathbf{r}_A$ переходит в новую точку $B$ с радиус-вектором $\mathbf{r}_B$ (в той же системе координат) по закону

(2)
\begin{align} \mathbf{r}_{B}= \mathcal{A} \mathbf{r}_{A} +\mathbf{t} \end{align}

где $\mathcal{A}$ — линейный оператор, а $\mathbf{t}$ — вектор переноса. В развернутой записи эта формула имеет вид:

(3)
\begin{align} x_{B} &= a_{xx}x_{A} + a_{xy}y_{A} + a_{xz}z_{A} +t_x \nonumber\\ y_{B} &= a_{yx}x_{A} + a_{yy}y_{A} + a_{yz}z_{A} +t_y \\ z_{B} &= a_{zx}x_{A} + a_{zy}y_{A} + a_{zz}z_{A} +t_z\nonumber \end{align}

или в матричной записи:

(4)
\begin{align} \begin{pmatrix} x_B\\y_B\\z_B\\1 \end{pmatrix} = \begin{pmatrix} a_{xx} & a_{xy} & a_{xz} & t_x \\ a_{yx} & a_{yy} & a_{yz} & t_y \\ a_{zx} & a_{zy} & a_{zz} & t_z \\ 0 & 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x_A\\ y_A\\ z_A\\ 1 \end{pmatrix} \end{align}

Отметим, что четвертая компонента вектора и окаймляющие четвертый столбец и четвертая строка матрицы вводятся для того, чтобы единообразно записать формулы преобразования переноса. В случае отсутствия переноса достаточно рассматривать матрицу линейного оператора $\mathcal{A}$ размера $3\times 3$.

Если преобразование переводит точку $O$ в точку $O'$, а тройку ортонормированных векторов $(\mathbf{e}_x,\mathbf{e}_y,\mathbf{e}_z)$ в тройку $(\mathbf{e}'_x,\mathbf{e}'_y,\mathbf{e}'_z)$, то элементы матрицы преобразования равны:

(5)
\begin{align} \mathbf{t} &= \mathbf{r}_{O'}- \mathbf{r}_{O}, & a_{xx} &= (\mathbf{e}'_x,\mathbf{e}_x), & a_{xy} &= (\mathbf{e}'_x,\mathbf{e}_y), & a_{xz} &= (\mathbf{e}'_x,\mathbf{e}_z) & \text{и так далее} \end{align}

При выполнении двух последовательных преобразований их матрицы перемножаются в том порядке, в котором выполняются преобразования, т.е. матрица первого преобразования стоит справа.

Преобразование называется ортогональным, если оно переводит тройку взаимно-перпендикулярных векторов также во взаимно-перпендикулярные векторы. Ортогональными преобразованиями являются перенос, поворот, отражение, масштабирование, а также их комбинация.

Преобразование переноса применимо к точке (в частности, началу системы координат). Оно задается вектором сдвига $\mathbf{t}=(t_x, t_y, t_z)$: точка $A$ с радиус-вектором $\mathbf{r}_A=(x_A, y_A, z_A)$ в результате преобразования переходит в точку $B$ с радиус-вектором $\mathbf{r}_B=\mathbf{r}_A+\mathbf{t}$:

(6)
\begin{align} x_{B} &= x_{A} +t_x, & y_{B} &= y_{A} + t_y, & z_{B} &= z_{A} + t_z, \end{align}

или в матричной записи

(7)
\begin{align} \begin{pmatrix} x_B\\ y_B\\ z_B\\ 1\\ \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} \begin{pmatrix} x_A\\ y_A\\ z_A\\ 1\\ \end{pmatrix} \end{align}

Преобразование поворота характеризуется тем, что точки пространства перемещаются как твердое тело: расстояния между точками не изменяются, а также не изменяются углы между отрезками, соединяющими точки. При этом по крайней мере одна точка остается неподвижной. Если неподвижная точка не совпадает с началом координат, то операцию поворота можно выполнить в виде последовательности преобразований:

  • Перенести начало координат в неподвижную точку.
  • Выполнить поворот с неподвижной точкой в начале координат на нужный угол.
  • Вернуться к старой системе отсчета.

Преобразование поворота с неподвижной точкой в начале координат записывается как

(8)
\begin{align} \begin{pmatrix} b_x\\ b_y \\ b_z \end{pmatrix} = \begin{pmatrix} r_{xx}& r_{xy} & r_{xz} \\ r_{yx}& r_{yy} & r_{yz} \\ r_{zx}& r_{zy} & r_{zz} \end{pmatrix} \begin{pmatrix} a_x\\ a_y \\ a_z \end{pmatrix} \end{align}

где $r_{ij}$ — компоненты матрицы преобразования. Столбцы матрицы преобразования являются компонентами векторов $\mathbf{r}_x$, $\mathbf{r}_y$, $\mathbf{r}_z$, в которые переходят при повороте векторы базиса. Поэтому столбцы матрицы, рассматриваемые как векторы, перпендикулярны друг другу, а длины их равны единицы. Таким же свойством обладают и строки матрицы. Матрицы, обладающие указанным свойством, называются ортогональными. Для ортогональной матрицы обратная матрица равна транспонированной.

У преобразования поворота всегда существует ось, вектор направления которой не претерпевает изменения в процессе поворота — ось поворота. Действие оператора поворота можно интерпретировать как поворот пространства вокруг этой оси на некоторый угол. В частности, повороты вокруг осей координат выполняются в координатных плоскостях, и их матрицы равны

(9)
\begin{align} \mathcal{R}_x = \begin{pmatrix} 1 & 0 & 0 \\ 0 & \cos{\varphi} & -\sin{\varphi} \\ 0 & \sin {\varphi} & \cos{ \varphi } \\ \end{pmatrix}, \quad \mathcal{R}_y = \begin{pmatrix} \cos{\varphi} & 0 & \sin{\varphi} \\ 0 & 1 & 0 \\ -\sin {\varphi} & 0 & \cos{ \varphi } \\ \end{pmatrix}, \quad \mathcal{R}_z = \begin{pmatrix} \cos{\varphi} & -\sin{\varphi} & 0 \\ \sin {\varphi} & \cos{ \varphi }& 0 \\ 0 & 0 & 1 \end{pmatrix} \end{align}

Выпишем выражения для элементов матрицы поворота на угол $\varphi$ относительно оси, задаваемой единичным вектором $\mathbf{e}$. При таком повороте произвольный вектор $\textbf{a}=(a_x, a_y, a_z)$ переходит в $\mathcal{R}\textbf{a}$, равный

(10)
\begin{align} \mathcal{R}\textbf{a} = \cos{\varphi}\textbf{a}+(1-\cos{\varphi})(\textbf{e},\textbf{a})\textbf{e}+\sin{\varphi}[\textbf{e},\textbf{a}] \end{align}

В частности, векторы базиса переходят в

(11)
\begin{align} \textbf{r}_x &= \cos{\varphi}\textbf{i}+(1-\cos{\varphi})(\textbf{e},\textbf{i})\textbf{e}+\sin{\varphi}[\textbf{e},\textbf{i}]\\ \textbf{r}_y &= \cos{\varphi}\textbf{j}+(1-\cos{\varphi})(\textbf{e},\textbf{j})\textbf{e}+\sin{\varphi}[\textbf{e},\textbf{j}]\\ \textbf{r}_z &= \cos{\varphi}\textbf{k}+(1-\cos{\varphi})(\textbf{e},\textbf{k})\textbf{e}+\sin{\varphi}[\textbf{e},\textbf{k}] \end{align}

и матрица преобразования имеет вид:

(12)
\begin{align} R = \begin{pmatrix} \cos{\varphi} + (1-\cos{\varphi}) e_x^2 & (1-\cos{\varphi}) e_x e_y -\sin{\varphi}e_z & (1-\cos{\varphi}) e_x e_z+\sin{\varphi}e_y \\ (1-\cos{\varphi}) e_x e_y +\sin{\varphi}e_z & \cos{\varphi} + (1-\cos{\varphi}) e_y^2 & (1-\cos{\varphi}) e_y e_z-\sin{\varphi}e_x \\ (1-\cos{\varphi}) e_x e_z -\sin{\varphi}e_y &(1-\cos{\varphi}) e_y e_z+\sin{\varphi}e_x & \cos{\varphi} + (1-\cos{\varphi}) e_z^2 \end{pmatrix} \end{align}

Отражение относительно начала координат есть преобразование $\mathbf{r} \Rightarrow \mathbf{r}'=-\mathbf{r}$. Если отражение производится относительно точки $\mathbf{r}_C$, не являющейся началом координат, то нужно дополнительно перенести начало координат в эту точку, так что $\mathbf{r}'-\mathbf{r}_C=-(\mathbf{r}-\mathbf{r}_C)$, или $\mathbf{r}'=-\mathbf{r}+2\mathbf{r}_C$. Матричная запись преобразования имеет вид

(13)
\begin{align} \begin{pmatrix} x'\\ y' \\ z' \\ 1 \end{pmatrix} = \begin{pmatrix} -1 & 0 & 0 & 2x_C\\ 0 & -1 & 0 & 2y_C\\ 0 & 0 & -1 & 2z_C\\ 0 & 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x\\ y \\ z \\ 1 \end{pmatrix} \end{align}

Преобразование отражения относительно оси, исходящей из начала координат, состоит в обращении знака у перпендикуляра, опущенного из точки на ось. Если $\mathbf{e}$ — единичный вектор оси, то $\mathbf{r}' = -\mathbf{r}+2(\mathbf{r},\mathbf{e})\mathbf{e}$. Если начало оси находится в точке $\mathbf{r}_C$, то, выполняя перенос начала координат, получим $\mathbf{r}'=-\mathbf{r}+2\mathbf{r}_C+2(\mathbf{r}-\mathbf{r}_C,\mathbf{e})\mathbf{e}$. Матричная запись преобразования отражения относительно оси имеет вид

(14)
\begin{align} \begin{pmatrix} x'\\ y' \\ z' \\ 1 \end{pmatrix} = \begin{pmatrix} -1 +2e_x & 2e_y & 2e_z & 2x_C-2(\mathbf{r}_C,\mathbf{e})e_x\\ 2e_x & -1 +2e_y & 2e_z & 2y_C-2(\mathbf{r}_C,\mathbf{e})e_y\\ 2e_x & 2e_y & -1 + 2e_z & 2z_C-2(\mathbf{r}_C,\mathbf{e})e_z\\ 0 & 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x\\ y \\ z \\ 1 \end{pmatrix} \end{align}

Отражение относительно плоскости $x=0$ есть преобразование $(x, y,z) \Rightarrow (-x, y,z)$. Аналогично выполняются отражения относительно других координатных плоскостей, так что матрицы преобразования выглядят так:

(15)
\begin{align} \begin{pmatrix} -1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \\ \end{pmatrix}, \qquad \begin{pmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & 1 \\ \end{pmatrix}, \qquad \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \\ \end{pmatrix} \end{align}

В общем случае отражение точки относительно плоскости означает переход к точке, расположенной симметрично данной по отношению к этой плоскости. Пусть уравнение плоскости имеет вид

(16)
\begin{align} x N_x + y N_y + z N_z = d, \qquad N_x^2 + N_y^2 + N_z^2 = 1 \end{align}

где $N_x$, $N_y$, $N_z$ и $d$ — параметры, определяющие плоскость. Напомним их геометрический смысл: тройка чисел $N_x=\cos{\alpha}$, $N_y=\cos{\beta}$, $N_z=\cos{\gamma}$ служит компонентами единичного вектора $\mathbf{N}$ нормали к плоскости, а $d$ есть расстояние плоскости от начала координат. Указанная выше симметричная точка имеет радиус-вектор $\mathbf{r}'=\mathbf{r}-2(\mathbf{r},\mathbf{N})\mathbf{N} + 2d\mathbf{N}$. Матричная запись преобразования относительно плоскости имеет вид

(17)
\begin{align} \begin{pmatrix} x' \\ y' \\ z' \\ 1 \end{pmatrix} = \begin{pmatrix} 1-2N_x^2 & -2N_x N_y & -2N_x N_z & 2d N_x \\ -2N_x N_y & 1-2N_y^2 & -2N_y N_z & 2d N_y \\ -2N_x N_z & -2N_y N_z & 1-2N_z^2 & 2d N_z \\ 0 & 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} \end{align}

Преобразование масштабирования с множителем $S$ относительно точки $\mathbf{r}_C$ имеет вид $\mathbf{r}' = S \mathbf{r} + (1-S)\mathbf{r}_C$.