Какая логика стоит за сигнатурой метода преобразования canvas? - PullRequest
0 голосов
/ 13 октября 2010

Согласно http://www.html5samples.com/2010/03/html-5-canvas-the-2d-context-part-1/

Это подпись для метода context.transform. context.transform (m11, m12, m21, m22, dx, dy) должен умножить текущую матрицу преобразования на матрицу, описанную как

m11 m21 dx

m12 m22 dy

 0   0  1

Я пытаюсь выяснить, в чем логика этой подписи? Почему вы не можете установить все элементы матрицы и почему аргументы перечислены в порядке столбцов, а не строк?

Ответы [ 2 ]

1 голос
/ 30 января 2011

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

Матрица 2x2, действующая на двумерный вектор в декартовых координатах, может выполнять только линейные преобразования (масштабирование, наклоны и повороты относительно начала координат, но не трансляции).

Чтобы получить аффинные 2D преобразования (включая переводы), вам нужно использовать однородные координаты. В практических целях это означает, что вы увеличиваете до трех измерений, добавляете фиктивную координату «z» ко ​​всем вашим векторам, и всякий раз, когда вам требуется 2D-перевод, вы действительно выполняете трехмерный перекос перпендикулярно оси z. Это третий столбец.

По соглашению (и для простоты) фиктивное значение z всегда равно 1. Для практических целей оно действует как "скорость перевода" - удвоение его удвоит эффект любых переводов, которые вы пытаетесь выполнить. Итак, мы не хотим, чтобы что-либо изменило это значение z с 1.

Третья строка матрицы, как вы написали, соответствует значению z. Пока эта строка остается «0 0 1», x и y не могут влиять на z, и она остается на 1. Если вы можете установить эту строку, вы можете случайно позволить x и y «просочиться» в z или умножить значение Z, делая все ваши преобразования с тех пор действовать очень странно. Блокировка этой строки предотвращает это без каких-либо полезных преобразований.

Конечно, это теория. На практике маловероятно, что программное обеспечение даже содержит модель третьего ряда. Они просто используют особый случай формулы, которая предполагает «0 0 1» - так что это другая часть ответа. Вы не можете установить это, потому что это фактически не существует в способе работы программного обеспечения. ;)

0 голосов
/ 14 октября 2010

Обозначения записываются на ваших позиционных векторах, выражаемых в виде столбцов или строк. Ничего плохого в этом нет.

Подробное и простое руководство (но с перевернутой нотацией) вы можете посмотреть здесь .

НТН!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...