Опубликован: 20.10.2007 | Доступ: свободный | Студентов: 4580 / 1391 | Оценка: 4.38 / 3.99 | Длительность: 12:07:00
ISBN: 978-5-94774-654-9
Специальности: Программист
Лекция 4:

Представление геометрической информации

< Лекция 3 || Лекция 4: 123 || Лекция 5 >

Однородные координаты. Задание геометрических преобразований в однородных координатах с помощью матриц

В предыдущей главе описывались геометрические преобразования на плоскости и в пространстве, а также было показано, как можно использовать аппарат матриц для таких задач. Для преобразований на плоскости применялись двумерные векторы и матрицы размерностью 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}. Будем строить матрицу преобразования, переводящую первый отрезок во второй. Это преобразование разложим на следующие элементарные действия.

  1. Сдвиг, перемещающий точку A=(A_x,A_y,A_z) в точку C=(C_x,C_y,C_z).
  2. Сдвиг начала координат в эту же точку.
  3. Если отрезки неколлинеарны:
    • строится вектор нормали к плоскости, в которой лежат отрезки (для этого можно использовать векторное произведение исходных векторов);
    • поворот относительно вектора нормали, совмещающий два отрезка по направлению (угол поворота можно определить с помощью скалярного произведения исходных векторов).
  4. Масштабирование с целью выравнивания длины отрезков.
  5. Возвращение начала координат в исходную точку.

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

Использование матриц очень удобно для выполнения преобразований в пространстве, хотя в некоторых случаях это приводит к избыточному числу выполняемых операций. Например, поворот одной точки в пространстве относительно координатной оси OZ с помощью матриц в однородных координатах требует 16 операций умножения и 12 операций сложения. В то же время он легко может быть выполнен с помощью формул преобразования

\begin{gathered}
x'=x\cos\alpha-y\sin\alpha \\
y'=x\sin\alpha+y\cos\alpha
\end{gathered},
т.е. с помощью всего лишь четырех умножений и одного сложения и одного вычитания. Операции сдвига также гораздо более экономично выполнять без использования матриц. Но когда речь идет о суперпозиции многих преобразований (как, например, в случае поворота относительно произвольной оси), то целесообразно применять соответствующую матрицу поворота. Эффективность матричного подхода очень сильно возрастает, если матричные операции реализованы аппаратно. Вопрос о том, в каких случаях использовать матрицы, а в каких нет, во многом зависит от возможностей вычислительной техники, уровня сложности задачи и требований к временным характеристикам процесса визуализации.

Вопросы и упражнения

  1. Какие геометрические объекты считаются примитивами?
  2. Какие требования предъявляются к набору геометрических примитивов?
  3. В какой программе впервые в качестве геометрического примитива использовался прямоугольник?
  4. Что такое объектная система координат?
  5. Что такое система координат наблюдателя?
  6. Соответствуют ли размеры объектов в системе координат наблюдателя их реальным размерам?
  7. Что такое картинная плоскость?
  8. Как называется операция перехода от трехмерной системы координат к двумерной?
  9. Что происходит при перенесении изображения с картинной плоскости на экран?
  10. Чем отличаются однородные координаты точки от обычных декартовых координат?
  11. С какой целью вводятся однородные координаты?
  12. Сколько элементарных действий требуется для совмещения двух отрезков в пространстве?
  13. Всегда ли использование матриц для выполнения преобразований в пространстве эффективней, чем другие способы их реализации?
< Лекция 3 || Лекция 4: 123 || Лекция 5 >
Сабина Бахриддинова
Сабина Бахриддинова
Дмитрий Трефилов
Дмитрий Трефилов