logo
CSharp_Graphics

Преобразования и системы координат

Предположим, что нужно использовать систему координат, начало которой расположено внутри клиентской области, а не в ее верхнем левом углу. Зададим, например, в качестве начала координат точку, удаленную на 100 точек от левого края и на 50 точек от верхнего края клиентской области. Такая система координат показана на приведенном ниже рисунке.

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

When you make the call myGraphics.DrawLine(myPen, 0, 0, 160, 80), you get the line shown in the following illustration.

The coordinates of the endpoints of your line in the three coordinate spaces are as follows:

World

(0, 0) to (160, 80)

Page

(100, 50) to (260, 130)

Device

(100, 50) to (260, 130)

Note that the page coordinate space has its origin at the upper-left corner of the client area; this will always be the case. Also note that because the unit of measure is the pixel, the device coordinates are the same as the page coordinates. If you set the unit of measure to something other than pixels (for example, inches), then the device coordinates will be different from the page coordinates.

The world transformation, which maps world coordinates to page coordinates, is held in the Transform property of the Graphics class. In the preceding example, the world transformation is a translation 100 units in the x direction and 50 units in the y direction. The following example sets the world transformation of a Graphics object and then uses that Graphics object to draw the line shown in the preceding figure:

myGraphics.TranslateTransform(100, 50);

myGraphics.DrawLine(myPen, 0, 0, 160, 80);

При вызове метода myGraphics.DrawLine(myPen, 0, 0, 160, 80) на экран выводится линия, изображенная на приведенном ниже рисунке.

---------

Ниже приведены координаты конечных точек линии в трех системах координат.

Объемные координаты

от (0, 0) до (160, 80)

Страничные координаты

от (100, 50) до (260, 130)

Координаты устройства

от (100, 50) до (260, 130)

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

За объемное преобразование, которое служит для перевода объемных координат в страничные, отвечает свойство Transform класса Graphics. В предыдущем примере объемное преобразование заключалось в смещении на 100 единиц вдоль оси X и на 50 единиц вдоль оси Y. В приведенном ниже примере демонстрируется задание объемного преобразования для объекта Graphics и использование этого объекта Graphics для рисования линии, изображенной на предыдущем рисунке.

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

The page transformation maps page coordinates to device coordinates. The Graphics class provides the PageUnit and PageScale properties for manipulating the page transformation. The Graphics class also provides two read-only properties, DpiX and DpiY, for examining the horizontal and vertical dots per inch of the display device.

You can use the PageUnit property of the Graphics class to specify a unit of measure other than the pixel.

Note:

You cannot set the PageUnit property to World, as this is not a physical unit and will cause an exception.

The following example draws a line from (0, 0) to (2, 1), where the point (2, 1) is 2 inches to the right and 1 inch down from the point (0, 0):

myGraphics.PageUnit = GraphicsUnit.Inch;

myGraphics.DrawLine(myPen, 0, 0, 2, 1);

Note:

If you don't specify a pen width when you construct your pen, the preceding example will draw a line that is one inch wide. You can specify the pen width in the second argument to the Pen constructor:

Pen myPen = new Pen(Color.Black, 1 / myGraphics.DpiX);

If we assume that the display device has 96 dots per inch in the horizontal direction and 96 dots per inch in the vertical direction, the endpoints of the line in the preceding example have the following coordinates in the three coordinate spaces:

World

(0, 0) to (2, 1)

Page

(0, 0) to (2, 1)

Device

(0, 0, to (192, 96)

Note that because the origin of the world coordinate space is at the upper-left corner of the client area, the page coordinates are the same as the world coordinates.

You can combine the world and page transformations to achieve a variety of effects. For example, suppose you want to use inches as the unit of measure and you want the origin of your coordinate system to be 2 inches from the left edge of the client area and 1/2 inch from the top of the client area. The following example sets the world and page transformations of a Graphics object and then draws a line from (0, 0) to (2, 1):

Преобразование, переводящее страничные координаты в координаты устройства, называется страничным преобразованием. За страничное преобразование отвечают свойства PageUnit и PageScale класса Graphics. Класс Graphics также содержит два доступных только для чтения свойства DpiX и DpiY, позволяющих узнать количество точек на дюйм в используемом устройстве отображения.

Свойство PageUnit класса Graphics можно использовать для задания единицы измерения, отличной от точки.

Примечание.

Свойству PageUnit нельзя присвоить значение World, поскольку эта единица измерения не является физической. В этом случае возникнет исключение.

В приведенном ниже примере демонстрируется рисование линии из точки с координатами (0, 0) в точку с координатами (2, 1), где точка с координатами (2, 1) расположена на 2 дюйма правее и на 1 дюйм ниже точки с координатами (0, 0).

--------

Примечание.

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

------

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

Объемные координаты

от (0, 0) до (2, 1)

Страничные координаты

от (0, 0) до (2, 1)

Координаты устройства

от (0, 0) до (192, 96)

Обратите внимание, что, так как начало отсчета объемных координат расположено в верхнем левом углу клиентской области, страничные координаты совпадают с объемными.

Сочетание объемного и страничного преобразования позволяет получать различные эффекты. Например, предположим, что нужно использовать дюймы в качестве единицы измерения, а начало координат должно быть расположено в 2 дюймах от левого края клиентской области и в 1/2 дюйма от верхней границы клиентской области. В приведенном ниже примере демонстрируется задание объемного и страничного преобразования для объекта Graphics и последующее рисование линии из точки с координатами (0, 0) в точку с координатами (2, 1).

myGraphics.TranslateTransform(2, 0.5f);

myGraphics.PageUnit = GraphicsUnit.Inch;

myGraphics.DrawLine(myPen, 0, 0, 2, 1);

The following illustration shows the line and coordinate system.

If we assume that the display device has 96 dots per inch in the horizontal direction and 96 dots per inch in the vertical direction, the endpoints of the line in the preceding example have the following coordinates in the three coordinate spaces:

World

(0, 0) to (2, 1)

Page

(2, 0.5) to (4, 1.5)

Device

(192, 48) to (384, 144)

-----

На приведенном ниже рисунке изображена полученная линия и система координат.

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

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

Объемные координаты

от (0, 0) до (2, 1)

Страничные координаты

от (2; 0,5) до (4; 1,5)

Координаты устройства

от (192, 48) до (384, 144)

Matrix Representation of Transformations

An m×n matrix is a set of numbers arranged in m rows and n columns. The following illustration shows several matrices.

You can add two matrices of the same size by adding individual elements. The following illustration shows two examples of matrix addition.

An m×n matrix can be multiplied by an n×p matrix, and the result is an m×p matrix. The number of columns in the first matrix must be the same as the number of rows in the second matrix. For example, a 4×2 matrix can be multiplied by a 2×3 matrix to produce a 4×3 matrix.