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

StackOverflow https://stackoverflow.com//questions/10698962

Вопрос

Я хочу сделать 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top