Поделиться через


Приложение. Преобразования матрицы

В этом разделе представлен математический обзор матричных преобразований для трехмерной графики. Однако для использования преобразований в Direct2D не требуется знать матричную математику. Прочитайте этот раздел, если вас интересует математика; В противном случае вы можете пропустить этот раздел.

Введение в матрицы

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

Матрица 3 x 2.

Нотация. Матрица обозначается прописной буквой. Элементы обозначаются строчными буквами. Индексы указывают номер строки и столбца элемента. Например,ij — это элемент в i'й строке и столбце j'th матрицы A.

На следующей схеме показана матрица i × j с отдельными элементами в каждой ячейке матрицы.

матрица со строками i и столбцами j.

Матричные операции

В этом разделе описываются основные операции, определенные в матрицах.

Сложение. Сумма A+ B двух матриц получается путем сложения соответствующих элементов A и B:

A + B = \[ a*ij* \] + \[ b*ij* \] = \[ a*ij* + b*ij* \]

Скалярное умножение. Эта операция умножает матрицу на реальное число. Если задано реальное число k, скалярное произведение kA получается путем умножения каждого элемента A на k.

kA = k\[ a*ij* \] = \[ k × a*ij* \]

Матричное умножение. Учитывая две матрицы A и B с порядком (m × n) и (n × p), продукт C = A × B представляет собой матрицу с порядком (m × p), определенным следующим образом:

Показывает формулу для матричного умножения.

или эквивалентно:

c*ij* = a*i*1 x b1*j* + a*i*2 x b2*j* + ... + a*in* + b*nj*

То есть, чтобы вычислить каждый элемент cij, выполните следующие действия.

  1. Возьмем i-ю строку A и j'й столбец B.
  2. Умножьте каждую пару элементов в строке и столбце: запись первой строки на запись первого столбца, вторая запись строки на вторую запись столбца и т. д.
  3. Суммируйте результат.

Ниже приведен пример умножения матрицы (2 × 2) на матрицу (2 × 3).

матричное умножение.

Матричное умножение не является коммутативным. То есть A × B ≠ B × A. Кроме того, из определения следует, что не каждая пара матриц может быть умножена. Число столбцов в левой матрице должно равняться количеству строк в правой матрице. В противном случае оператор × не определен.

Определение матрицы. Матрица идентификации, обозначенная как I, представляет собой квадратную матрицу, определенную следующим образом:

I*ij* = 1, если *i* = *j*, или 0 в противном случае.

Другими словами, матрица идентификаторов содержит 1 для каждого элемента, где номер строки равен номеру столбца, и ноль для всех остальных элементов. Например, вот матрица удостоверений 3 × 3.

матрица удостоверений.

Следующие значения равенства хранятся для любой матрицы M.

M x I = M I x M = M

Аффинные преобразования

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

  • Аффинные преобразования сохраняют коллинеарность. Если три или более точек попадают на линию, они по-прежнему образуют линию после преобразования. Прямые линии остаются прямыми.
  • Композиция двух аффинных преобразований является аффинным преобразованием.

Аффинные преобразования для объемного пространства имеют следующую форму.

Показывает аффинное преобразование для объемного пространства.

При применении определения матричного умножения, приведенного ранее, можно показать, что произведением двух аффинных преобразований является еще одно аффинное преобразование. Для преобразования двухd-точек с помощью аффинного преобразования точка представляется в виде матрицы 1 × 3.

P = \| x y 1 \|

Первые два элемента содержат координаты x и y точки. 1 помещается в третий элемент, чтобы математические вычисления работали правильно. Чтобы применить преобразование, умножьте две матрицы следующим образом.

P' = P × M

Это будет расширено до следующего.

аффинного преобразования.

where

x' = ax + cy + e y' = bx + dy + f

Чтобы получить преобразованную точку, возьмем первые два элемента матрицы P'.

p = (x', y') = (ax + cy + e, bx + dy + f)

Примечание

Матрица 1 × n называется вектором строки. Direct2D и Direct3D используют векторы строк для представления точек в двух- или трехмерном пространстве. Эквивалентный результат можно получить с помощью вектора столбца (n × 1) и транспонирования матрицы преобразования. В большинстве графических текстов используется форма вектора столбцов. В этом разделе представлена форма вектора строк для согласованности с Direct2D и Direct3D.

 

Следующие несколько разделов являются производными от базовых преобразований.

Преобразование перевода

Матрица преобразования перевода имеет следующую форму.

преобразование перевода.

Включив точку P в это уравнение, вы дадут следующее:

P' = (*x* + *dx*, *y* + *dy*)

значение , соответствующее точке (x, y), преобразованной с помощью dx на оси X и dy на оси Y.

Схема, показывающая перевод двух точек.

Преобразование "Масштабирование"

Матрица преобразования масштабирования имеет следующую форму.

преобразование масштабирования.

Включив точку P в это уравнение, вы дадут следующее:

P' = (*x* * *dx*, *y* • *dy*)

соответствует точке (x,y), масштабируемой по dx и dy.

Схема, показывающая масштабирование двух точек.

Поворот вокруг источника

Матрица для поворота точки вокруг источника имеет следующую форму.

Показывает формулу для преобразования поворота.

Преобразованная точка:

P' = (*x*cosΘ – ysinΘ, *x*sinΘ + *y*cosΘ)

Доказательство. Чтобы показать, что P' представляет собой поворот, рассмотрим следующую схему.

Схема, показывающая поворот вокруг источника.

Исходные данные:

P = (x,y)

Исходная точка для преобразования.

Φ

Угол, сформированный линией (0,0) до P.

Θ

Угол поворота (x,y) относительно источника.

P' = (x',y')

Преобразованная точка.

R

Длина линии (от 0,0) до P. Также радиус круга вращения.

Примечание

На этой схеме используется стандартная система координат, используемая в геометрии, где положительная ось Y указывает вверх. Direct2D использует систему координат Windows, где положительная ось Y указывает вниз.

 

Угол между осью X и линией (0,0) до P' равен ТЬ + Ø. Удержание следующих удостоверений:

x = R cosΘ y = R sinВ x' = R cos(Ø + Ø) y' = R sin(ПЕРЕПИСЬ+ РТ)

Теперь решение для x' и y' с точки зрения Y. По формулам тригонометрического сложения:

x' = R(cosCOsΘ – sin CTRL) = RcosСcosΘ – RsinСinΘ y' = R(sinВcosΘ + cos Ctrl) = RsinСcosΘ + RcosСinΘ

Подставив, мы получаем:

x' = xcosΘ – ysinΘ y' = xsinΘ + ycosΘ

который соответствует преобразованной точке P', показанной ранее.

Поворот вокруг произвольной точки

Для поворота вокруг точки (x,y), отличной от исходной, используется следующая матрица.

преобразование поворота.

Эту матрицу можно получить, взяв точку (x,y) в исходное значение.

Схема, показывющая поворот вокруг точки.

Пусть (x1, y1) — точка, которая является результатом поворота точки (x0, y0) вокруг точки (x,y). Мы можем наследовать x1 следующим образом.

x1 = (x0 – x)cosΘ– (y0 – y)sinΘ + x x x1 = x0cosΘ – y0sinΘ + \[ (1 – cosΘ) + ysinΘ \]

Теперь вставьте это уравнение обратно в матрицу преобразования, используя формулу x1 = ax0 + cy0 + e из предыдущей версии. Используйте ту же процедуру для получения y1.

Преобразование неравномерного распределения

Преобразование неравномерного распределения определяется четырьмя параметрами:

  • Θ: величина наклона вдоль оси X, измеряемая как угол от оси Y.
  • Ø: величина наклона вдоль оси Y, измеряемая в виде угла от оси X.
  • (px, py): координаты x и y точки, относительно которой выполняется отклонение.

Преобразование неравномерного распределения использует следующую матрицу.

Преобразование неравномерного распределения.

Преобразованная точка:

P' = (*x* + *y*tanΘ – *py*tanΘ, *y* + *x*tanВ) – *py*tan

или эквивалентно:

P' = (*x* + (*y* – *py*)tanΘ, *y* + (*x* – *px*)tan

Чтобы увидеть, как работает это преобразование, рассмотрите каждый компонент по отдельности. Параметр Θ перемещает каждую точку в направлении x на величину, равную tanΘ. На следующей схеме показана связь между Θ и отклонением оси X.

Схема, показывающая неравномерное распределение по оси X.

Ниже приведено такое же отклонение, примененное к прямоугольнику:

Схема, показывающая неравномерное распределение по оси X при применении к прямоугольнику.

Параметр Ø имеет тот же эффект, но вдоль оси Y:

Схема, показывающая неравномерное распределение по оси Y.

На следующей схеме показано отклонение по оси Y, примененное к прямоугольнику.

Схема, показывающая отклонение по оси Y при применении к прямоугольнику.

Наконец, параметры px и py смещают центральную точку наклона вдоль осей X и Y.

Представление преобразований в Direct2D

Все преобразования Direct2D являются аффинными преобразованиями. Direct2D не поддерживает неаффинные преобразования. Преобразования представлены структурой D2D1_MATRIX_3X2_F . Эта структура определяет матрицу 3 × 2. Поскольку третий столбец аффинного преобразования всегда совпадает ([0, 0, 1]), а Direct2D не поддерживает неаффинные преобразования, нет необходимости указывать всю матрицу 3 × 3. На внутреннем сервере Direct2D использует 3 × 3 матрицы для вычисления преобразований.

Члены D2D1_MATRIX_3X2_F именуются в соответствии с положением индекса: элемент _11 является элементом (1,1), элемент _12 является элементом (1,2) и т. д. Хотя элементы структуры можно инициализировать напрямую, рекомендуется использовать класс D2D1::Matrix3x2F . Этот класс наследует D2D1_MATRIX_3X2_F и предоставляет вспомогательные методы для создания любого из базовых аффинных преобразований. Класс также определяет operator*() для создания двух или более преобразований, как описано в разделе Применение преобразований в Direct2D.

Следующая

Модуль 4. Ввод данных пользователем