> 文章列表 > QT QPainter坐标系统和坐标变换

QT QPainter坐标系统和坐标变换

QT QPainter坐标系统和坐标变换

一、坐标变换函数

QPainter 在窗口上绘图的默认坐标系统如图下图所示,这是绘图设备的物理坐标。为了绘图的方便,QPainter 提供了一些坐标变换的功能,通过平移、旋转等坐标变换,得到一个逻辑坐标系统,使用逻辑坐标系统在某些时候绘图更方便。坐标变换函数见下表。

分组

函数原型

功能

坐标变换

void translate(qreal dx, qreal dy)

void rotate(qreal angle)

void scale(qreal sx, qreal sy)

void shear(qreal sh, qreal sv)

坐标系统平移一定的偏移量,坐标原点平移到新的点

坐标系统顺时针旋转一个角度

坐标系统缩放

坐标系统做扭转变换

状态保存与恢复

void save()

void restore()

void resetTransform()

保存 painter 当前的状态,就是将当前状态压入堆栈

恢复上一次状态,就是从堆栈中弹出上次的状态

复位所有的坐标变换

常用的坐标变换是平移、旋转和缩放,使用世界坐标变换矩阵也可以实现这些变换功能,但是需要单独定义一个QTransform 类的变量,对于QPainter 来说,简单的坐标变换使用QPainter自有的坐标变换函数就足够了。

1、坐标平移

坐标平移函数是 translate(),其中一种参数形式的函数原型是:

void translate(qreal dx, qreal dy)

表示将坐标系统水平方向平移 dx 个单位,垂直方向平移 dy 个单位,在缺省的坐标系统中,单位就是像素。如果是从原始状态平移 (dx,dy),那么平移后的坐标原点就移到了 (dx,dy)。

假设一个绘图窗口宽度为 300 像素,高度为 200 像素,则其原始坐标系统如图 1左所示;若执行平移函数 translate(150,100),则坐标系统水平向右平移 150 像素,向下平移 100 像素,平移后的坐标系统如图 1 右所示,坐标原点在窗口的中心,而左上角的坐标变为(-150,-100),右下角的坐标变为(150.100)。如此将坐标原点变换到窗口中心在绘制某些图形时是非常方便的。

 2、坐标旋转

坐标旋转的函数是 rotate(),其函数原型为:
void rotate(qreal angle)

它是将坐标系统绕坐标原点顺时针旋转 angle 角度,单位是度。当 angle 为正数时是顺时针旋转,为负数时是逆时针旋转。

在图1右的基础上,若执行 rotate(90),则得到图2所示的坐标系统。在图1 的新坐标系下,窗口左上角的坐标变成了(-100,150),而右下角的坐标变成了(100,-150)。

3、缩放
缩放函数是 scale(),其函数原型为:

void scale(qreal sx, qreal sy)

其中,sx, sy 分别为横向和纵向缩放比例,比例大于 1是放大,小于1 是缩小。

4、状态保存与恢复

进行坐标变换时,QPainter 内部实际上有一个坐标变换矩阵,用 save()保存当前坐标状态,用restore()恢复上次保存的坐标状态,这两个函数必须配对使用,操作的是一个堆栈对象。

resetTransform()函数则是复位所有坐标变换操作,恢复原始的坐标系统。