netlib.narod.ru | < Назад | Оглавление | Далее > |
Вернемся к программе MobyDick и вставим в нее инструкцию
grfx.Transform = new Matrix(1, 0, 0, 3, 0, 0);
Она действует аналогично такой:
grfx.ScaleTransform(1, 3);
С коэффициентами rx и ry мы пока не экспериментировали отдельно, поэтому рассмотрим такой вызов:
grfx.Transform = new Matrix(1, 0, 0.5f, 1, 0, 0);
Он дает следующую матрицу преобразования:
|
1 0.5 0 |
0 1 0 |
0 0 1 |
|
А вот соответствующие формулы преобразования:
x' = x + 0.5 · y
y' = y
Заметьте, что значения координат по оси x увеличиваются в зависимости от значения y. Если y равен 0 (верхний край клиентской области), преобразования не будет. По мере возрастания значения у по направлению к нижнему краю клиентской области х также возрастает. В результате возникает эффект, называемый сдвигом (shear).
В частности, показанный здесь эффект называется горизонтальный сдвиг или х-сдвиг. К сожалению, слово shear (сдвиг) начинается с той же буквы, что и scale (масштабирование), поэтому коэффициенты сдвига в формулах преобразования я решил обозначить последней буквой слова shear.
Также можно задавать коэффициент вертикального сдвига или y-сдвига:
grfx.Transform = new Matrix(1, 0.5f, 0, 1, 0, 0);
В результате получится такая матрица:
|
1 0 0 |
0.5 1 0 |
0 0 1 |
|
Формулы преобразования в этом случае примут следующий вид:
x' = x
y' = 0.5 · x + y
Заметьте: все строки текста по-прежнему начинаются у левого края клиентской области:
Вообще-то вращение — это комбинация горизонтального и вертикального сдвигов. Однако такие комбинации, как эта, работать не будут:
grfx.Transform = new Matrix(1, 1, 1, 1, 0, 0);
Эта комбинация определяет преобразование:
x' = x + y
y' = x + y
Такое преобразование вызвало бы сжатие изображения в линию, но прежде оно генерирует исключение. Но такой вызов работает:
grfx.Transform = new Matrix(1, 1, -1, 1, 0, 0);
и производит такой эффект:
Если присвоить первым четырем аргументам значение корня квадратного из 1/2:
grfx.Transform = new Matrix(0.707f, 0.707f, -0.707f, 0.707f, 0, 0);
эффект будет тот же, что и у вызова, с которого мы начали исследование преобразований:
grfx.RotateTransform(45);
netlib.narod.ru | < Назад | Оглавление | Далее > |