Значение порядка преобразований
Один Matrix объект может хранить одно преобразование, либо последовательность преобразований. Второй называется составным преобразованием. Матрица составного преобразования получается путем перемножения матриц отдельных преобразований.
Примеры составных преобразований
Составное преобразование важен порядок отдельных преобразований. Например если сначала повернуть, а затем масштабирование, а затем преобразовать, возвращается другой результат не Если вы сначала выполнить преобразование, поворот, а затем масштабирование. В GDI+, построение составных преобразований в направлении слева направо. Если S, R и T являются матрицы масштабирования, вращения и перемещения, соответственно, затем продукта SRT (в таком порядке) приводится матрица составного преобразования, которое сначала масштабирует, затем поворачивает, а затем преобразует. Матрицы продукта SRT отличается от матрицы TRS продукта.
Одна из причин важен порядок — что преобразования как поворот и масштабирование выполняются относительно начала координат. Масштабирование объекта, который выравнивается по центру в начале координат дает другой результат, чем масштабирование объекта, который был перемещен из начала координат. Аналогично поворот объекта, который выравнивается по центру в начале координат выдает различный результат от поворота объекта, который был перемещен из начала координат.
В следующем примере объединяются масштабирования, вращения и перемещения (в таком порядке) для формирования составного преобразования. Аргумент Append передается RotateTransform метод указывает, что поворот будет выполняться масштабирование. Аналогично аргумент Append передается TranslateTransform метод указывает, что перевод последует поворот. Append и Prepend являются членами MatrixOrder перечисления.
Rectangle rect = new Rectangle(0, 0, 50, 50);
Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2);
e.Graphics.ResetTransform();
e.Graphics.ScaleTransform(1.75f, 0.5f);
e.Graphics.RotateTransform(28, MatrixOrder.Append);
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append);
e.Graphics.DrawRectangle(pen, rect);
В следующем примере создается те же вызовы методов, что и в предыдущем примере, но изменять порядок вызовов. Полученный порядок операций сначала перевести, затем поворот, шкала, которая дает очень другой результат, масштабирование, повернуть, а затем перевести.
Rectangle rect = new Rectangle(0, 0, 50, 50);
Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2);
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append);
e.Graphics.RotateTransform(28, MatrixOrder.Append);
e.Graphics.ScaleTransform(1.75f, 0.5f);
e.Graphics.DrawRectangle(pen, rect);
Чтобы изменить порядок последовательности вызовов методов является одним из способов изменения направления отдельных преобразований, составное преобразование. Второй способ управления порядком операций является изменение порядка следования матриц. Следующий пример является таким же, как в предыдущем примере, за исключением случаев, Append было изменено на Prepend. Умножение матриц осуществляется в порядке SRT, где S, R и T являются матрицами масштабирования, поворота и сдвига соответственно. Порядок составного преобразования сначала осуществляется масштабирование, затем поворот, затем сдвиг.
Rectangle rect = new Rectangle(0, 0, 50, 50);
Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2);
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Prepend);
e.Graphics.RotateTransform(28, MatrixOrder.Prepend);
e.Graphics.ScaleTransform(1.75f, 0.5f);
e.Graphics.DrawRectangle(pen, rect);
Результат предыдущего примера одинаков в результате в первом примере в этом разделе. Это обусловлено тем, были изменены на обратный порядок вызовов методов и порядок перемножения матрицы.