Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Graphics.doc
Скачиваний:
20
Добавлен:
16.11.2019
Размер:
3.1 Mб
Скачать

Значение порядка преобразований

В одном объекте Matrix может храниться одно преобразование или некоторая последовательность преобразований. Такая последовательность преобразований называется составным преобразованием. Матрица составного преобразования получается с помощью перемножения матриц отдельных преобразований.

Примеры составных преобразований

Порядок следования отдельных преобразований имеет важное значение для составного преобразования. Например, если применяется поворот, затем масштабирование, а затем сдвиг, получается совершенно другой результат, чем если бы сначала был применен сдвиг, затем поворот, а затем масштабирование. В GDI+ построение составных преобразований осуществляется слева направо. Если S, R и T являются матрицами масштабирования, поворота и сдвига, соответственно, тогда произведение SRT (именно в таком порядке) является матрицей составного преобразования, которое сначала масштабирует, затем поворачивает, а затем осуществляет сдвиг. Матрица, равная произведению SRT, отличается от матрицы, являющейся произведением TRS.

Одной из причин важности порядка выполнения преобразований является то, что такие преобразования, как поворот и масштабирование, осуществляются относительно начала координат. Масштабирование объекта, центрированного по началу координат, дает другой результат, чем масштабирование объекта, который куда-либо сдвинут относительно этой точки. Аналогично, поворот объекта, центрированного по началу координат, дает другой результат, чем поворот объекта, который куда-либо сдвинут относительно этой точки.

В следующем примере комбинация масштабирования, поворота и сдвига (именно в таком порядке) используется для конструирования составного преобразования. Аргумент Append, передаваемый методу RotateTransform, указывает на то, что поворот будет выполняться после масштабирования. Аналогично, параметр Append, передаваемый методу TranslateTransform, указывает, что сдвиг должен следовать за поворотом. Значения Append и Prepend являются членами перечисления MatrixOrder.

--------------

The following example makes the same method calls as the preceding example, but the order of the calls is reversed. The resulting order of operations is first translate, then rotate, then scale, which produces a very different result than first scale, then rotate, then translate.

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

One way to reverse the order of individual transformations in a composite transformation is to reverse the order of a sequence of method calls. A second way to control the order of operations is to change the matrix order argument. The following example is the same as the preceding example, except that Append has been changed to Prepend. The matrix multiplication is done in the order SRT, where S, R, and T are the matrices for scale, rotate, and translate, respectively. The order of the composite transformation is first scale, then rotate, then translate.

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

The result of the immediately preceding example is the same as the result of the first example in this topic. This is because we reversed both the order of the method calls and the order of the matrix multiplication.

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

-----------

Первым способом изменения порядка выполнения отдельных преобразований, формирующих составное преобразование, на обратный является изменение на обратный порядка вызовов методов. Второй способ управления порядком операций заключается в изменении значения параметра порядка следования матриц. Следующий пример полностью аналогичен предыдущему, но в нем параметр Append заменен на Prepend. Перемножение матриц осуществляется в порядке SRT, где S, R и T являются матрицами масштабирования, поворота и сдвига соответственно. При применении составного преобразования сначала осуществляется масштабирование, затем поворот, а затем сдвиг.

-----

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

Using Graphics Containers

A Graphics object provides methods such as DrawLine, DrawImage, and DrawString for displaying vector images, raster images, and text. A Graphics object also has several properties that influence the quality and orientation of the items that are drawn. For example, the smoothing mode property determines whether antialiasing is applied to lines and curves, and the world transformation property influences the position and rotation of the items that are drawn.

A Graphics object is associated with a particular display device. When you use a Graphics object to draw in a window, the Graphics object is also associated with that particular window.

A Graphics object can be thought of as a container because it holds a set of properties that influence drawing and it is linked to device-specific information. You can create a secondary container within an existing Graphics object by calling the BeginContainer method of that Graphics object.

Managing the State of a Graphics Object

The Graphics class is at the heart of GDI+. To draw anything, you obtain a Graphics object, set its properties, and call its methods DrawLine, DrawImage, DrawString, and the like).

The following example calls the DrawRectangle method of a Graphics object. The first argument passed to the DrawRectangle method is a Pen object.

Graphics graphics = e.Graphics;

Pen pen = new Pen(Color.Blue); // Opaque blue

graphics.DrawRectangle(pen, 10, 10, 200, 100);

Graphics State

A Graphics object does more than provide drawing methods, such as DrawLine and DrawRectangle. A Graphics object also maintains graphics state, which can be divided into the following categories:

  • Quality settings

  • Transformations

  • Clipping region