Типы систем координат
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) |