Почему 2D-преобразования нуждаются в матрицах 3x3?

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

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

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

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

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

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

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

Ответы

Ответ 1

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

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

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

Тогда поворот будет

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

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

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

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

    ( x )
M   ( y )
    ( 0 )

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

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

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

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

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

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


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

Ответ 2

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