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);

Он дает следующую матрицу преобразования:

А вот соответствующие формулы преобразования:

Заметьте, что значения координат по оси x увеличиваются в зависимости от значения y. Если y равен 0 (верхний край клиентской области), преобразования не будет. По мере возрастания значения у по направлению к нижнему краю клиентской области х также возрастает. В результате возникает эффект, называемый сдвигом (shear).


Рис. 7.9.

В частности, показанный здесь эффект называется горизонтальный сдвиг или х-сдвиг. К сожалению, слово shear (сдвиг) начинается с той же буквы, что и scale (масштабирование), поэтому коэффициенты сдвига в формулах преобразования я решил обозначить последней буквой слова shear.

Также можно задавать коэффициент вертикального сдвига или y-сдвига:

  grfx.Transform = new Matrix(1, 0.5f, 0, 1, 0, 0);

В результате получится такая матрица:

Формулы преобразования в этом случае примут следующий вид:

Заметьте: все строки текста по-прежнему начинаются у левого края клиентской области:


Рис. 7.10.

Вообще-то вращение — это комбинация горизонтального и вертикального сдвигов. Однако такие комбинации, как эта, работать не будут:

  grfx.Transform = new Matrix(1, 1, 1, 1, 0, 0);

Эта комбинация определяет преобразование:

Такое преобразование вызвало бы сжатие изображения в линию, но прежде оно генерирует исключение. Но такой вызов работает:

  grfx.Transform = new Matrix(1, 1, -1, 1, 0, 0);

и производит такой эффект:


Рис. 7.11.

Если присвоить первым четырем аргументам значение корня квадратного из 1/2:

  grfx.Transform = new Matrix(0.707f, 0.707f, -0.707f, 0.707f, 0, 0);

эффект будет тот же, что и у вызова, с которого мы начали исследование преобразований:

  grfx.RotateTransform(45);

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz