浅析QT中的坐标系统(一):---by jzj139
QT窗口部件的左上角的位置是(0,0),右下角的位置是(width()-1,height()-1),这跟我们数学中的所学的坐标系统是不一样的。
在使用QPAINTER绘图时:
视口(VIEWPORT),窗口(WINDOW---不是顶级窗口部件)和世界矩阵决定了QPAINTER逻辑坐标和绘制设备的物理坐标之间的映射关系。在默认的情况下,逻辑的和物理的坐标系统被设置为一致大小的。视口和窗口是紧密绑定的。视口是物理坐标的任意矩形。窗口指定了相同的矩形,但是在物理坐标中,它的坐标和物理坐标是线性的关系的(这点是很重要的,对理解后面的窗口---视口机制很有用)。在默认的情况下,视口和窗口都被设置为设备的矩形。例如:如果设备是320*320的矩形,视口和窗口都是左是角为(0,0)的320*320的相同矩形。在这种情况下,逻辑坐标和物理坐标就是一致的。
那么视口---窗口机制有什么作用呢?
视口---窗口机制对于我们编写独立于绘制设备大小和分辨率的代码是十分有用的,我们可以自己来进行逻辑坐标和物理坐标之间的映射计算,但是让QPAINTER来完成这项工作是很简单的。例如,我们想让逻辑坐标从(-50,-50)到(50,50),并且(0,0)在中间,我们可以这样来设置我们的窗口:
painter.setWindow(QRect(-50,-50,100,100));
(-50,-50)指定了原点,(100,100)指定了宽和高。这也就是说现在的逻辑坐标(-50,-50)和物理坐标(0,0)是对应的,并且逻辑坐标(50,50)和物理坐标(320,200)是对应的。
那么painter是怎么计算的呢?
这就要注意到一句话:逻辑坐标和物理坐标是成线性关系的。
因为物理坐标是和设备的分辨率有关的。对于这个设备,它的分辨率应该是320*200的。
那么应该如何计算逻辑坐标和物理坐标的映射关系呢?
我们来交叉对应坐标,对于X有:(-50,0)和(50,320)
所以对于X来说,逻辑坐标和物理坐标的映射关系就是:b=(16/5)a+160
对于Y有:(-50,0)和(50,200)
所以对于Y来说,逻辑坐标和物理坐标的映射关系就是:b=2a+100
根据上面的2个公式,我们任意给出逻辑坐标中的一个点就可以求出对应的物理坐标中的点。
例如逻辑坐标(-30,-20)对应于物理坐标就是(64,60);逻辑坐标(10,20)对应于物理坐标就是(192,140)。
坐标系统暂时分析到这里,关于世界矩阵以后再分析。