Шаг 200.
Библиотека Qt.
Преобразования координатных систем

    На этом шаге рассмотрим преобразования координатных систем.

    В используемой по умолчанию координатной системе рисовальщика QPainter точка (0, 0) находится в левом верхнем углу устройства рисования; значение координаты х увеличивается при перемещении вправо, а значение координаты у увеличивается при перемещении вниз. Каждый пиксель занимает область 1x1 в координатной системе, применяемой по умолчанию.

    По идее, центр пикселя имеет "полупиксельные" координаты. Например, пиксель в верхнем левом углу виджета занимает область между точками (0, 0) и (1, 1), а его центр находится в точке (0.5, 0.5). Если мы просим QPainter нарисовать пиксель, например в точке (100, 100), его координаты будут смещены на величину +0.5 по обоим направлениям, и в результате, нарисованный пиксель будет иметь центр в точке (100.5, 100.5).

    На первый взгляд эта особенность носит лишь теоретический интерес, однако она имеет важные практически последствия. Во-первых, смещение +0.5 действует только при отключении сглаживания линий (режим по умолчанию); если режим сглаживания линий включен, и мы пытаемся нарисовать пиксель черного цвета в точке (100, 100), QPainter фактически выведет на экран четыре светлосерых пикселя в точках (99.5, 99.5), (99.5, 100.5), (100.5, 99.5) и (100.5, 100.5), чтобы создалось впечатление расположения пикселя точно в точке соприкосновения всех этих четырех пикселей. Если этот эффект нежелателен, его можно избежать, указывая полупиксельные координаты или путем перемещения начала координат QPainter на величину (+0.5, +0.5).

    При начертании таких фигур, как линии, прямоугольники и эллипсы, действуют аналогичные правила. На рис. 1 показано, как изменяется результат вызова drawRect(2, 2, 6, 5) в зависимости от ширины пера, когда сглаживание линий отключено.


Рис.1. Результат выполнения команды drawRect(2, 2, 6, 5) с отключенным режимом сглаживания линий

    В частности, важно отметить, что прямоугольник 6x5, вычерчиваемый пером с шириной 1, фактически занимает область размером 7x6.

    На рис. 2 показан результат выполнения функции drawRcct(2, 2, 6, 5) при включенном режиме сглаживания, а на рис. 3 показано, что произойдет при указании полупиксельных координат.


Рис.2. Результат выполнения команды drawRect(2, 2, 6, 5) с включенным режимом сглаживания линий


Рис.3. Результат выполнения команды drawRect(2.5, 2.5, 6, 5) с включенным режимом сглаживания линий

    Рассмотрим возможные изменения координатной системы при использовании рисовальщиком QPainter области отображения и окна (в данном контексте термин "окно" не является обозначением окна виджета верхнего уровня, а термин "область отображения" никак не связан с областью отображения QScrollArea).

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

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

    Механизм "окно - область отображения" удобно применять для создания программного кода, который не будет зависеть от размера или разрешающей способности устройства рисования. Например, если мы хотим обеспечить логические координаты в диапазоне от (-50, -50) до (+50, +50) с (0, 0) в середине, мы можем задать окно следующим образом:

painter.setWindow(-50, -50, 100, 100);

    Пара аргументов (-50, -50) задает начальную точку, а пара аргументов (100, 100) задает ширину и высоту. Это означает, что точка с логическими координатами (-50, -50) теперь соответствует точке с физическими координатами (0, 0), а точка с логическими координатами (+50, +50) соответствует точке с физическими координатами (320, 200). Иллюстрация приводится на рис. 4. В этом примере мы не изменяли область отображения.


Рис.4. Преобразование логических координат в физические

    На следующем шаге рассмотрим рисование точек.




Предыдущий шаг Содержание Следующий шаг