Зачем двумерным преобразованиям нужны матрицы 3х3?

Я хочу сделать 2D-рисунок и, следовательно, хочу реализовать некоторые преобразования матрицы. Имея небольшой опыт работы с математикой, я пытаюсь понять, как это сделать в C# (очевидно, что любой другой язык oop сделал бы это).

Все, что я прочитал, объясняет, что нам нужно работать с матрицами 3х3, чтобы справиться с переводами. Потому что вы не можете сделать перевод с умножением. Но это с умножением матриц, которые мы создаем наши преобразования. Итак, мы работаем с чем-то вроде:

{ x1, x2, tx }
{ y1, y2, ty }
{ 0,  0,  1  }

Я понимаю среднее значение третьего столбца, но зачем нам третий ряд? В единичной матрице, а также в повороте, масштабе или повороте последний ряд одинаков. Есть ли операции, которых я еще не достиг, которые будут нужны? Это потому, что некоторые языки (Java) работают лучше с массивами "квадратов измерений"? Если это так, я могу использовать 3 столбца и 2 строки в C# (поскольку зубчатые массивы работают так же или лучше).

Например, для вращения + перевода у меня есть такая матрица

{ cos(rot)*x1, (-sin(rot))*x2, tx }
{ sin(rot)*y1, cos(rot)*y2,    ty }
{ 0,           0,              1  }

Нет необходимости в последнем ряду.

2 ответа

Решение

это с умножением матриц, которые мы создаем наши преобразования

Вот почему мы хотим квадратные матрицы.

Предположим, мы сделали то, что вы предлагаете, и использовали матрицы 2x3 для наших преобразований.

Тогда вращение будет

( x1, x2, 0 )
( y1, y2, 0 )

и перевод будет

( 1, 0, tx )
( 0, 1, ty )

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

    ( x )
M   ( y )
    ( 0 )

чтобы получить правильные ответы.

Однако - как бы мы пошли о составлении преобразований? Действительно, для вашего примера "для вращения + перевода у меня есть матрица, подобная этой", как вы попали к этой матрице? Конечно, в этом случае вы можете просто выписать это, но в целом? Ну, вы знаете ответ:

это с умножением матриц, которые мы создаем наши преобразования

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

( . . . ) ( . . . )
( . . . ) ( . . . ) = ???

не является допустимым умножением матрицы. Нам нужны матрицы, которые можно умножить, чтобы наши преобразования были составными. Итак, у нас есть этот дополнительный ряд.


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

Ответ - однородные координаты. Чтобы объединить вращение и перемещение в одной операции, требуется одно дополнительное измерение, чем требует модель. Для плоских вещей это 3 компонента, а для пространственных вещей это 4 компонента. Операторы берут 3 компонента и возвращают 3 компонента, требующие матрицы 3х3.

Другие вопросы по тегам