В предыдущей главе описывались геометрические преобразования на плоскости и в пространстве, а также было показано, как можно использовать аппарат матриц для таких задач. Для преобразований на плоскости применялись двумерные векторы и матрицы размерностью \[ 2\times 2 \] . В пространстве, соответственно, с этой же целью использовались трехмерные векторы и матрицы \[ 3\times 3 \] . Но такой подход не позволяет задавать с помощью матриц преобразования переноса и проекции. В связи с этим в проективной геометрии был разработан аппарат, позволяющий унифицировать все геометрические преобразования путем введения так называемых однородных координат.
Для пояснения такого подхода сначала рассмотрим случай двумерного пространства. Каждая точка плоскости с координатами \[ (x,y) \] может одновременно рассматриваться как точка трехмерного пространства с координатами \[ (x,y,1) \] , т.е. как точка, лежащая на плоскости \[ z=1 \] . С другой стороны, каждой точке трехмерного пространства \[ (x,y,z) \] при условии \[ z\ne 0 \] соответствует единственная точка этой же плоскости \[ \left( \frac{x}{z},\frac{y}{z},1 \right) \] . При этом получается, что каждой точке плоскости \[ (x,y,1) \] соответствует прямая, проходящая через начало координат, т. е. устанавливается взаимно однозначное соответствие между точками плоскости и множествами \[ (tx,ty,t), \; -\infty<t<\infty, \;t\ne 0 \] .
Если теперь рассматривать точку плоскости как принадлежащую трехмерному пространству, то ее двумерные преобразования можно будет описывать с помощью матриц \[ 3\times 3 \] , причем можно будет задавать таким способом не только повороты и масштабирование, но и сдвиги и проекции (как ортографические, так и центральные).
Поворот на угол \[ \alpha \] относительно начала координат можно осуществить с помощью новой матрицы поворота: \[ \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} = \begin{pmatrix} \cos\alpha & -\sin\alpha & 0 \\ \sin\alpha & \cos\alpha & 0 \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix}. \] Операция масштабирования может быть записана в виде \[ \begin{pmatrix} ax \\ by \\ 1 \end{pmatrix} = \begin{pmatrix} a & 0 & 0 \\ 0 & b & 0 \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix}. \] Перенос на вектор \[ (x_0,y_0) \] также можно задать с помощью матрицы: \[ \begin{pmatrix} x+x_0 \\ y+y_0 \\ 1 \end{pmatrix} = \begin{pmatrix} 1 & 0 & x_0 \\ 0 & 1 & y_0 \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix}. \] Проекции точки на оси координат определяются с помощью матриц проекции: \[ P_x= \begin{pmatrix} 1 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 1 \end{pmatrix}, \quad P_y= \begin{pmatrix} 0 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}. \]
Перейдем теперь к трехмерному пространству. Каждой точке \[ (x,y,z) \] будем ставить в соответствие точку четырехмерного пространства \[ (x,y,z,1) \] , а для выполнения основных преобразований будем использовать матрицы размерностью \[ 4\times 4 \] . Строятся они совершенно аналогично тому, как это делалось в двумерном случае. Матрица сдвига на вектор \[ (x_0,y_0,z_0) \] имеет вид \[ P= \begin{pmatrix} 1 & 0 & 0 & x_0 \\ 0 & 1 & 0 & y_0 \\ 0 & 0 & 1 & z_0 \\ 0 & 0 & 0 & 1 \end{pmatrix}, \] матрица масштабирования тоже очевидным образом строится из трехмерной матрицы: \[ S= \begin{pmatrix} a & 0 & 0 & 0 \\ 0 & b & 0 & 0 \\ 0 & 0 & c & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}. \] Проекции точек на координатные плоскости осуществляются с помощью матриц (более подробно проекции и их виды будут рассмотрены позднее): \[ P_{xy}= \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}, \quad P_{yz}= \begin{pmatrix} 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}, \quad P_{zx}= \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}. \] Умножение этих матриц на вектор приводит к тому, что обнуляется одна из координат, и в результате получаем проекцию точки на соответствующую плоскость.
Матрица поворота относительно оси \[ OX \] на угол \[ \alpha \] выглядит следующим образом: \[ R_x= \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos\alpha & -\sin\alpha & 0 \\ 0 & \sin\alpha & \cos\alpha & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}. \] Отсюда легко понять, как строятся матрицы поворота относительно других координатных осей, а также матрица поворота относительно произвольной оси. Просто берем матрицы, построенные в третьей главе, и расширяем их путем добавления уже известных единичных вектора-строки и вектора- столбца: \[ \begin{pmatrix} * & * & * & 0 \\ * & * & * & 0 \\ * & * & * & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}. \]
Путем объединения приведенных элементарных преобразований можно построить и более сложные. В третьей главе мы использовали произведение простых матриц вращения для построения матрицы поворота относительно произвольной оси. Приведем один пример.
Пусть в пространстве заданы два отрезка - \[ \overline{AB} \] и \[ \overline{CD} \] . Будем строить матрицу преобразования, переводящую первый отрезок во второй. Это преобразование разложим на следующие элементарные действия.
Каждое из этих преобразований реализуется с помощью матрицы, а полное преобразование можно выполнить, используя произведение матриц.
Использование матриц очень удобно для выполнения преобразований в пространстве, хотя в некоторых случаях это приводит к избыточному числу выполняемых операций. Например, поворот одной точки в пространстве относительно координатной оси \[ OZ \] с помощью матриц в однородных координатах требует 16 операций умножения и 12 операций сложения. В то же время он легко может быть выполнен с помощью формул преобразования \[ \begin{gathered} x'=x\cos\alpha-y\sin\alpha \\ y'=x\sin\alpha+y\cos\alpha \end{gathered}, \] т.е. с помощью всего лишь четырех умножений и одного сложения и одного вычитания. Операции сдвига также гораздо более экономично выполнять без использования матриц. Но когда речь идет о суперпозиции многих преобразований (как, например, в случае поворота относительно произвольной оси), то целесообразно применять соответствующую матрицу поворота. Эффективность матричного подхода очень сильно возрастает, если матричные операции реализованы аппаратно. Вопрос о том, в каких случаях использовать матрицы, а в каких нет, во многом зависит от возможностей вычислительной техники, уровня сложности задачи и требований к временным характеристикам процесса визуализации.