一、坐标变换函数
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()函数则是复位所有坐标变换操作,恢复原始的坐标系统。