- 物理坐标:QPainter绘图时,默认的起始坐标为应用程序的左上角,这叫做绘图设备的物理坐标
- 逻辑坐标:QPainter提供了一些坐标变换的功能,通过平移、旋转等坐标转换,得到的坐标称为“逻辑坐标”
坐标原点:当图形移动之后,坐标原点会随着动态变化,见下面的各个案例
一、QPainter坐标转换函数- 备注:常用的坐标变换是平移、旋转、缩放,使用世界坐标变换矩阵也可以实现这些变换功能,但是需要单独定义一个QTransform类的变量,对于QPainter来说,上面这些函数就足够使用了
坐标平移(translate函数)
- 功能:表示将坐标系统水平方向平移dx个单位,垂直方向平移dy个单位(在缺省的坐标系统中,单位就是像素)
- 如果是从原始状态平移(dx,dy),那么平移后的坐标原点就移动了(dx,dy)
- 例如:假设一个绘图窗口宽度为300像素,高度为200像素,则其原始坐标系统如左图所示。若执行translate(150,100),平移后的坐标系统如右图所示,坐标原点此时移动到窗口的中心,而左上角的坐标变为(-150,-100)
坐标旋转(rotate函数)
- 功能:它将坐标系统绕坐标原点顺时针旋转angle角度,单位是度
- 当angle为正数时表示顺时针旋转;当angle为负数时表示逆时针旋转
- 例如:将图8-10中的右图旋转90度(rotate(90)),得到下图
缩放(scale函数)
- 参数:sx、sy分别为横向和纵向缩放比例
- 比例大于1是放大;比例小于1是缩小
状态保存与恢复(save、restore、resetTransform)
进行坐标变换时,QPainter内部实际上有一个坐标变换矩阵
- save():保存当前坐标状态
- restore():恢复上次保存的坐标状态
save函数与restore函数必须配对使用,操作的是一个堆栈对象
- resetTransform():则是复位所有坐标变换操作,恢复原始的坐标系统
二、视口和窗口坐标转换演示案例:
视口:
- 视口表示绘图设备的任意一个矩形区域的物理坐标,可以只选取物理坐标的一个矩形区域用于绘图
- QPainter绘图的范围就是视口的范围,不能超出视口的范围进行绘图
- 默认情况下,视口的大小等于绘图设备的整个矩形区
窗口:
- 与视口一样,也是一个矩形,不过是用逻辑坐标定义的坐标系。窗口可以直接定义矩形区的逻辑坐标范围
应用程序窗体变化,视口和窗口显示的图形会随着动态适应变化
setViewport()函数
- 用于设置此次QPainter绘图的视口
- 参数1、2:代表视口的起点(左上角)坐标。参数3、4:分别代表视口的宽度和高度
- 参数:以一个QRect变量为参数
setWindow()函数
- 用于设置窗口
- 参数1、2:针对于视口的起点(左上角)坐标。参数3、4:分别代表窗口的宽度和高度
- 参数:以一个QRect变量为参数
图解:
假设矩形框的宽度为300像素,高度为200像素
视口:a中的灰色区域就是我们设置的视口,视口的左上角坐标为(50,0),右下角下标为(250,200)。定义的语句为painter.setViewport(50,0,200,200)
- 窗口:针对于上面定义的视口,我们定义了一个窗口(b),窗口坐标的中心在矩形的中心,并设置正方形的逻辑边长为100。窗口的左上角坐标为(-50,-50),窗口宽度为100,定义的语句为painter.setWindow(-50,-50,100,100)
演示案例: