Поделиться через


Типы систем координат

Windows GDI+ использует три координатных пространства: мир, страница и устройство. При выполнении вызова myGraphics.DrawLine(&myPen, 0, 0, 160, 80)точки, которые передаются методу Graphics::D rawLine (0, 0) и (160, 80), находятся в мировом пространстве координат. Перед тем как интерфейс GDI+ выполнит рисование линии на экране, координаты подвергнутся последовательности преобразований. Одно преобразование преобразует координаты мира в координаты страницы, а другое преобразование преобразует координаты страницы в координаты устройства.

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

Снимок экрана: окно, содержащее помеченные оси координат

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

снимок экрана предыдущего окна, но с синей линией, простирающейся по диагонали от источника

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

Пробел Координаты конечных точек
World от (0, 0) до (160, 80)
Страница от (100, 50) до (260, 130)
Устройство от (100, 50) до (260, 130)

 

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

Преобразование, сопоставляющее координаты мира с координатами страницы, называется преобразованием мира и поддерживается объектом Graphics . В предыдущем примере преобразование мира представляет собой преобразование 100 единиц в направлении x и 50 единиц в направлении y. В следующем примере задается преобразование мира объекта Graphics , а затем используется этот объект Graphics для рисования линии, показанной на предыдущем рисунке.

myGraphics.TranslateTransform(100.0f, 50.0f);

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

Преобразование, сопоставляющее координаты страницы с координатами устройства, называется преобразованием страницы. Класс Graphics предоставляет четыре метода для управления и проверки преобразования страницы: Graphics::SetPageUnit, Graphics::GetPageUnit, Graphics::SetPageScale и Graphics::GetPageScale. Класс Graphics также предоставляет два метода Graphics ::GetDpiX и Graphics::GetDpiY для проверки горизонтальных и вертикальных точек на дюйм устройства отображения.

Для указания единицы измерения можно использовать метод Graphics::SetPageUnit класса Graphics . В следующем примере рисуется линия от (0, 0) до (2, 1), где точка (2, 1) находится на 2 дюйма справа и на 1 дюйм вниз от точки (0, 0).

myGraphics.SetPageUnit(UnitInch);

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

Примечание

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

Pen myPen(Color(255, 0, 0, 0), 1/myGraphics.GetDpiX()).

 

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

Пробел Координаты конечных точек
World от (0, 0) до (2, 1)
Страница от (0, 0) до (2, 1)
Устройство (0, 0, до (192, 96)

 

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

myGraphics.TranslateTransform(2.0f, 0.5f);
myGraphics.SetPageUnit(UnitInch);
myGraphics.DrawLine(&myPen, 0, 0, 2, 1);

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

снимок экрана: предыдущее окно, но более широкое, с осями, расположенными слева и помеченными по-разному

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

Пробел Координаты конечных точек
World от (0, 0) до (2, 1)
Страница от (2, 0,5) до (4, 1,5)
Устройство от (192, 48) до (384, 144)