Визуальное программирование и MFC

       

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


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

Свойства этой системы можно менять. Описание логической системы координат задается контекстом устройства. Чтобы логические координаты могли интерпретироваться физическим устройством, используется следующий механизм. Графическое устройство имеет свою собственную фиксированную физическую систему координат. Контекст устройства содержит атрибуты, задающие соответствие между логическими и физическими координатами точки, что позволяет при выводе на графическое устройство произвести преобразование логических координат в физические. Графическое устройство осуществляет вывод в прямоугольную область отображения (viewport). Начало системы координат находится в левом верхнем углу области, первая координатная ось (Х) направлена горизонтально слева направо, вторая - Y вертикально сверху вниз. Единицей измерения является пиксел.

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

  • на экран, и тогда область отображения - весь экран;
  • в Windows-окно, и тогда область отображения - все Windows-окно;
  • в клиентскую часть Windows-окна, и тогда область отображения - клиентская часть Windows-окно.
  • Для каждого из этих графических устройств можно создать свой тип контекста устройства.

    Тип логической системы координат (mapping mode) является атрибутом контекста устройства. Соответствие между системой координат области отображения и логической системой координат окна задается атрибутами:

  • выделенная точка окна (window origin);
  • выделенная точка области отображения (viewport origin);
  • меры протяженности логической (оконной) системы (window extent);
  • меры протяженности области отображения (viewport extent).
  • Используя эти атрибуты, Windows преобразует логические координаты в физические и выводит на графическое устройство.






    Логическая система координат



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

    Тип системы координат Единица измерения Направление оси X Направление оси Y
    MM_TEXT Пиксел Координата увеличивается слева направо Координата увеличивается сверху вниз
    MM_LOMETRIC 0.1 мм Координата увеличивается слева направо Координата увеличивается снизу вверх
    MM_HIMETRIC 0.01 мм Координата увеличивается слева направо Координата увеличивается снизу вверх
    MM_LOENGLISH 0.01 дюйма Координата увеличивается слева направо Координата увеличивается снизу вверх
    MM_HIENGLISH 0.001 дюйма Координата увеличивается слева направо Координата увеличивается снизу вверх
    MM_TWIPS 1/1440 дюйма Координата увеличивается слева направо Координата увеличивается снизу вверх
    MM_ISOTROPIC Усл.единицы (по X и У совпадают) устанавливается Устанавливается
    MM_ANISOTROPIC Усл.единицы (по X и Y задаются независимо) устанавливается Устанавливается
    Для установки типа системы координат используется метод контекста устройства SetMapMode, а для получения типа системы координат - метод GetMapMode.

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

    Ниже очень кратко показана разница между режимами MM_ANISOTROPIC и MM_ISOTROPIC и стандартными режимами отображения:

  • Если необходимо, чтобы рисунок сохранял свои пропорции, нужно использовать режим MM_ISOTROPIC.


  • Если необходимо растянуть рисунок так, чтобы он занимал все доступное пространство, нужно использовать режим MM_ANISOTROPIC.


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






  • Соответствие между логической и физической системами координат



    Соответствие между логической и физической системами координат устанавливается двумя понятиями: выделенная точка (origin) и мера протяженности (точнее, меры протяженности, так как их две: по оси X и по оси Y). Каждая из систем координат имеет свою выделенную точку. Выделенная точка логической системы координат определяется атрибутом window origin (выделенная точка окна), а выделенная точка физической системы координат - атрибутом viewport origin (выделенная точка области отображения). Соответствие устанавливается наложением двух систем так, чтобы выделенные точки совпадали. Выделенные точки задают, каким образом системы координат размещены одна относительно другой.

    Работа с выделенными точками обеспечивается методами класса CPoint:

  • выделенная точка логической системы координат устанавливается методом SetWindowOrg, а получается методом GetWindowOrg;


  • выделенная точка физической системы координат устанавливается методом SetViewportOrg, а получается методом GetViewportOrg.


  • Для систем координат типа MM_TEXT, MM_LOMETRIC, MM_HIMETRIC, MM_LOENGLISH, MM_HIENGLISH, MM_TWIPS выделенные точки полностью задают соответствие. Значение двух других атрибутов соответствия для этих типов систем координат фиксированы и не могут меняться программистом.

    Соответствие между логическими и физическими координатами точки можно выразить формулами:

    xViewPort = (xWindow - xWinOrg) * xScale + xViewOrg , yViewPort = (yWindow - yWinOrg) * yScale + yViewOrg , где (xViewPort, yViewPort) - координаты произвольной точки А в физической системе; (xWindow, yWindow) - координаты произвольной точки А в логической системе; (xViewOrg, yViewOrg) - координаты выделенной точки в физической системе; (xWinOrg, yWinOrg) - координаты выделенной точки в логической системе.

    Значение xScale равно количеству пикселей, приходящихся на одно деление оси X, а yScale - количеству пикселей, приходящихся на одно деление по оси Y. Эти значения задаются атрибутами меры протяженности логической системы координат (window extents) и меры протяженности физической системы координат (viewport extents).



    Для всех выше перечисленных типов систем координат они фиксированы для данного физического устройства, и программист не может их изменить. Иначе дело обстоит с системами координат типа MM_ISOTROPIC, MM_ANISOTROPIC. Для них единицей измерения является условная единица. Количество пикселов, приходящихся на одно деление в логической или физической системе координат, может быть установлено атрибутами меры протяженности логической системы координат (window extents) и меры протяженности физической системы координат (viewport extents). Каждый из атрибутов представляет собой пару чисел - меру протяженности по оси X и меру протяженности по оси Y. Обозначим их (xWinExt, yWinExt) и (xViewExt, yViewExt).

    Понятие "мера протяженности" можно представить, как точку на оси X или Y или как "эталонный отрезок" от начала системы координат до этой точки. При установлении соответствия между логической и физической системами координат точки в логической и физической системах координат совмещаются растяжением (или сжатием) логической системы по осям X и Y. Меры протяженности задают значения xScale и yScale так:

    xScale = xViewExt / xWinExt , yScale = yViewExt / yWinExt .


    Содержание раздела