点击上方“Qt学视觉”,选择“星标”公众号重磅干货,第一时间送达
共同学习共同进步
QPainter在窗口上绘图的默认坐标系统在前面讲过,在这里就不多说了,这是绘图设备的物理坐标。为了绘图 的方便,QPainter提供了一些坐标变换的功能,通过平移、旋转等坐标变换,得到一个逻辑坐标 系统,使用逻辑坐标系统在某些时候绘图更方便。
分组 | 函数原型 | 功能 |
坐标变换 | void lranslate(qreal dx, qreal dy) void rotatc(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.坐标平移
坐标平移函数是tmnslate(),其中一种参数形式的函数原型是:
void translate(qreal dx, qreal dy)
表示将坐标系统水平方向平移dx个单位,垂直方向平移dy个单位,在缺省的坐标系统中, 单位就是像素。如果是从原始状态平移(dx,dy),那么平移后的坐标原点就移到了(dx,dy)。
假设一个绘图窗口宽度为300像素,高度为200像素,则其原始坐标系统如下图左所示;若执行平移函数translate(150, 100),则坐标系统水平向右平移150像素,向下平移100像素,平 移后的坐标系统如下图右所示,坐标原点在窗口的中心,而左上角的坐标变为(-150,-100), 右下角的坐标变为(150, 100)。如此将坐标原点变换到窗口中心在绘制某些图形时是非常方便的。
2.坐标旋转
坐标旋转的函数是rotateO,其函数原型为:
void rotate(qreal angle)
它是将坐标系统绕坐标原点顺时针旋转angle角度,单位是度。当angle为正数时是顺时针旋 转,为负数时是逆时针旋转。
在上图右的基础上,若执行rotate(90),则得到下图所示坐标系统
注意旋转之后并不改变窗口矩形的实际大小,只是改变了坐标轴的方向。
在上图的新坐标系下,窗口左上角的坐标变成了(-100,150),而右下角的坐标变成了(100,-150)。
3. 缩放
缩放函数是scale(),其函数原型为:
void scale(qreal sx, qreal sy)
其中,分别为横向和纵向缩放比例,比例大于1是放大,小于1是缩小。
4. 状态保存与恢复
进行坐标变换时,QPainter内部实际上有一个坐标变换矩阵,用save()保存当前坐标状态,用 restore()恢复上次保存的坐标状态,这两个函数必须配对使用,操作的是一个堆栈对象。
resetTmnsform()函数则是复位所有坐标变换操作,恢复原始的坐标系统。