Почему 2D преобразования нуждаются в матрицах 3x3?
-
12-12-2019 - |
Вопрос
Я хочу сделать 2D-рисунок и, таким образом, хочу реализовать некоторые матричные преобразования. С моим световым фоном математики я пытаюсь понять, как сделать это в C # (любой другой язык OOP сделает это, очевидно, это будет).
Все, что я читал, объясняет, что нам нужно работать с матрицами 3x3, чтобы иметь возможность справиться с переводами. Потому что вы не можете сделать перевод с умножениями. Но это с мультипликациями матриц, которые мы создаем наши преобразования. Итак, мы работаем с чем-то вроде:
{ 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 }
.
Нет необходимости последнего ряда.
Решение
Это с мультипликациями матриц, которые мы создаем наши преобразования
Это, поэтому мы хотим квадратные матрицы.
Предположим, что мы сделали то, что вы предлагаете, и использовали 2x3 матрицы для наших преобразований.
Тогда вращение будет
( x1, x2, 0 )
( y1, y2, 0 )
.
и перевод будет
( 1, 0, tx )
( 0, 1, ty )
.
, и мы могли бы выполнить либо вращения, либо переводы, умногая нашу матрицу на вектором столбца, представляющим точку:
( x )
M ( y )
( 0 )
.
Чтобы получить правильные ответы.
Однако - Как бы мы пошли на сочинение преобразований? Действительно, для вашего «для вращения + перевод у меня есть матрица, как этот» пример, как вы добрались до , что matrix? Конечно, в этом случае вы можете просто написать это, но в целом? Ну, вы знаете ответ:
Это с мультипликациями матриц, которые мы создаем наши преобразования
Так что должно быть возможно умножать два матрица преобразования, чтобы дать еще одну матрицу преобразования . И правила умножения Matrix показывают, что это:
( . . . ) ( . . . )
( . . . ) ( . . . ) = ???
.
не является действительной мультипликацией матрицы. Нам нужны матрицы, которые могут быть умножены для наших преобразований для композима. Таким образом, у нас есть этот дополнительный ряд.
Теперь, как я выразил это здесь, на самом деле совершенно назад от стандартной математической презентации, в которой знакомые преобразования вращения и перевода являются лишь особыми случаями полной мощности однородных преобразований координат на проективном самолете - Но я думаю, что это сделает, чтобы показать вам, почему нам нужен эта дополнительная строка - сделать квадрат Matrix и, таким образом, может быть умноженными с такими матрицами.
Другие советы
Ответ - однородные координаты.Чтобы объединить вращение и перевод в одну операцию, требуется одно дополнительное измерение, чем модель.Для плоских вещей это 3 компонента и для пространственных вещей это 4 компонента.Операторы принимают 3 компонента и возврат 3 компонента, требующие матриц 3x3.